summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Hensing <robert@roberthensing.nl>2022-01-19 18:54:42 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2022-01-24 21:28:24 -0500
commit5262b1e541c8f67e249074eef5e0567e6603ccd9 (patch)
treee9305dc8ba79415bac7b09f7534895f379371297
parent516eeb9e295b50872398bc9848a42ab41f743316 (diff)
downloadhaskell-5262b1e541c8f67e249074eef5e0567e6603ccd9.tar.gz
Add test case for C++ exception handling
-rw-r--r--testsuite/tests/rts/T11829.hs5
-rw-r--r--testsuite/tests/rts/T11829.stderr1
-rw-r--r--testsuite/tests/rts/T11829.stdout1
-rw-r--r--testsuite/tests/rts/T11829_c.cpp19
-rw-r--r--testsuite/tests/rts/all.T5
5 files changed, 31 insertions, 0 deletions
diff --git a/testsuite/tests/rts/T11829.hs b/testsuite/tests/rts/T11829.hs
new file mode 100644
index 0000000000..5983dfb226
--- /dev/null
+++ b/testsuite/tests/rts/T11829.hs
@@ -0,0 +1,5 @@
+module Main where
+import Foreign.C.Types
+foreign import ccall func :: IO CInt
+main :: IO ()
+main = print =<< func
diff --git a/testsuite/tests/rts/T11829.stderr b/testsuite/tests/rts/T11829.stderr
new file mode 100644
index 0000000000..0527e6bd2d
--- /dev/null
+++ b/testsuite/tests/rts/T11829.stderr
@@ -0,0 +1 @@
+This is a test
diff --git a/testsuite/tests/rts/T11829.stdout b/testsuite/tests/rts/T11829.stdout
new file mode 100644
index 0000000000..d81cc0710e
--- /dev/null
+++ b/testsuite/tests/rts/T11829.stdout
@@ -0,0 +1 @@
+42
diff --git a/testsuite/tests/rts/T11829_c.cpp b/testsuite/tests/rts/T11829_c.cpp
new file mode 100644
index 0000000000..959851ad74
--- /dev/null
+++ b/testsuite/tests/rts/T11829_c.cpp
@@ -0,0 +1,19 @@
+#include <iostream>
+#include <exception>
+extern "C" {
+
+int func() {
+ try {
+ throw std::runtime_error("This is a test");
+ } catch(const std::runtime_error &c) {
+ std::cerr << c.what() << std::endl;
+ return 42;
+ } catch(...) {
+ std::cerr << "Catch-all must not fire!" << std::endl;
+ return -1;
+ }
+ std::cerr << "Control must not reach past try-catch block!" << std::endl;
+ return -2;
+}
+
+}
diff --git a/testsuite/tests/rts/all.T b/testsuite/tests/rts/all.T
index 7adb936b08..f2098f4122 100644
--- a/testsuite/tests/rts/all.T
+++ b/testsuite/tests/rts/all.T
@@ -470,6 +470,11 @@ test('keep-cafs',
],
makefile_test, ['KeepCafs'])
+# Test proper functioning of C++ exceptions within a C++ program.
+# On darwin, this requires -fcompact-unwind.
+# When -fcompact-unwind becomes default, generalize test to all platforms.
+test('T11829', unless(opsys('darwin'), skip), compile_and_run, ['T11829_c.cpp -lstdc++ -fcompact-unwind'])
+
test('T16514', unless(opsys('mingw32'), skip), compile_and_run, ['T16514_c.cpp -lstdc++'])
test('test-zeroongc', extra_run_opts('-DZ'), compile_and_run, ['-debug'])