about summary refs log tree commit diff
path: root/tests/run-make/foreign-double-unwind/foo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run-make/foreign-double-unwind/foo.cpp')
-rw-r--r--tests/run-make/foreign-double-unwind/foo.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/tests/run-make/foreign-double-unwind/foo.cpp b/tests/run-make/foreign-double-unwind/foo.cpp
new file mode 100644
index 00000000000..69a8f11c2db
--- /dev/null
+++ b/tests/run-make/foreign-double-unwind/foo.cpp
@@ -0,0 +1,33 @@
+#include <cstdio>
+#include <exception>
+
+void println(const char* s) {
+    puts(s);
+    fflush(stdout);
+}
+
+struct outer_exception {};
+struct inner_exception {};
+
+extern "C" {
+    void throw_cxx_exception() {
+        if (std::uncaught_exception()) {
+            println("throwing inner C++ exception");
+            throw inner_exception();
+        } else {
+            println("throwing outer C++ exception");
+            throw outer_exception();
+        }
+    }
+
+    void cxx_catch_callback(void (*cb)()) {
+        try {
+            cb();
+            println("unreachable: callback returns");
+        } catch (outer_exception) {
+            println("unreachable: caught outer exception in catch (...)");
+        } catch (inner_exception) {
+            println("unreachable: caught inner exception in catch (...)");
+        }
+    }
+}