New testcases, all of which work with llvmg++!
authorChris Lattner <sabre@nondot.org>
Thu, 28 Aug 2003 19:57:53 +0000 (19:57 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 28 Aug 2003 19:57:53 +0000 (19:57 +0000)
This tests exception specifications, and also adds an "easy" rethrow test.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8183 91177308-0d34-0410-b5e6-96231b3b80d8

test/C++Frontend/EH/exception_spec_test.cpp [new file with mode: 0644]
test/C++Frontend/EH/simple_rethrow.cpp [new file with mode: 0644]

diff --git a/test/C++Frontend/EH/exception_spec_test.cpp b/test/C++Frontend/EH/exception_spec_test.cpp
new file mode 100644 (file)
index 0000000..f80f0ee
--- /dev/null
@@ -0,0 +1,51 @@
+// This tests that exception specifications interact properly with unexpected
+// handlers.
+
+#include <exception>
+#include <stdio.h>
+#include <stdlib.h>
+
+static void TerminateHandler() {
+  printf("std::terminate called\n");
+  exit(1);
+}
+
+static void UnexpectedHandler1() {
+  printf("std::unexpected called: throwing a double\n");
+  throw 1.0;
+}
+
+static void UnexpectedHandler2() {
+  printf("std::unexpected called: throwing an int!\n");
+  throw 1;
+}
+
+void test(bool Int) throw (double) {
+  if (Int) {
+    printf("Throwing an int from a function which only allows doubles!\n");
+    throw 1;
+  } else {
+    printf("Throwing a double from a function which allows doubles!\n");
+    throw 1.0;
+  }
+}
+
+int main() {
+  try {
+    test(false);
+  } catch (double D) {
+    printf("Double successfully caught!\n");
+  }
+
+  std::set_terminate(TerminateHandler);
+  std::set_unexpected(UnexpectedHandler1);
+
+  try {
+    test(true);
+  } catch (double D) {
+    printf("Double successfully caught!\n");
+  }
+
+  std::set_unexpected(UnexpectedHandler2);
+  test(true);
+}
diff --git a/test/C++Frontend/EH/simple_rethrow.cpp b/test/C++Frontend/EH/simple_rethrow.cpp
new file mode 100644 (file)
index 0000000..34c4681
--- /dev/null
@@ -0,0 +1,25 @@
+#include <stdio.h>
+
+int throws() {
+  printf("Throwing int\n");
+  throw 16;
+};
+
+int callsthrows() {
+  try {
+    throws();
+  } catch (...) {
+    printf("Caught something, rethrowing...\n");
+    throw;
+  }
+}
+
+int main() {
+  try {
+    callsthrows();
+  } catch (int i) {
+    printf("Caught int: %d\n", i);
+    return i-16;
+  }
+  return 1;
+}