New testcases, which WORK with LLVMG++ and the CBE.
authorChris Lattner <sabre@nondot.org>
Wed, 27 Aug 2003 04:57:33 +0000 (04:57 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 27 Aug 2003 04:57:33 +0000 (04:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8158 91177308-0d34-0410-b5e6-96231b3b80d8

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

diff --git a/test/C++Frontend/EH/simple_throw.cpp b/test/C++Frontend/EH/simple_throw.cpp
new file mode 100644 (file)
index 0000000..7289c6d
--- /dev/null
@@ -0,0 +1,13 @@
+// Test throwing a constant int
+#include <stdio.h>
+
+static void foo() { throw 5; }
+int main() {
+       try {
+               foo();
+       } catch (...) {
+               printf("All ok\n");
+               return 0;
+       }
+       return 1;
+}
diff --git a/test/C++Frontend/EH/throw_rethrow_test.cpp b/test/C++Frontend/EH/throw_rethrow_test.cpp
new file mode 100644 (file)
index 0000000..cbaaa1b
--- /dev/null
@@ -0,0 +1,40 @@
+// This tests hard situations for throwing, including the case where an
+// exception is active in more than one handler at a time (ie, it needs
+// refcounting)
+#include <cstdio>
+
+struct foo {
+  int i;
+  foo() : i(1) { }
+  foo(const foo&) : i(2) {}
+};
+
+int callee(unsigned i) {
+  if (i < 3) throw (int)i;
+  if (i < 6) throw 1.0;
+  if (i < 9) throw foo();
+  return 0;
+}
+
+void rethrow() {
+  throw;
+}
+
+int main() {
+  for (unsigned i = 0; i < 10; ++i) {
+    try {
+      return callee(i);
+    } catch (foo &F) {
+      try {
+       rethrow();
+      } catch (foo &F) {
+        std::printf("%d: 3\n", i);
+      }
+    } catch (int) {
+      std::printf("%d: 1\n", i);
+    } catch (...) {
+      std::printf("%d: 2\n", i);
+    }
+  }
+}
+