summaryrefslogtreecommitdiffstats
path: root/libcxxabi
diff options
context:
space:
mode:
authorHoward Hinnant <hhinnant@apple.com>2012-02-01 19:42:45 +0000
committerHoward Hinnant <hhinnant@apple.com>2012-02-01 19:42:45 +0000
commita21f8c2acf8852b15a28256fe6424ac295d770b0 (patch)
tree05c6b69b396053794dbaa26f72926fa1707221dc /libcxxabi
parentccfa90a5fe0e7b919ff0368a8d59c763733905f3 (diff)
downloadbcm5719-llvm-a21f8c2acf8852b15a28256fe6424ac295d770b0.tar.gz
bcm5719-llvm-a21f8c2acf8852b15a28256fe6424ac295d770b0.zip
Quash TODO regarding catch by function type. Add tests to back it up.
llvm-svn: 149530
Diffstat (limited to 'libcxxabi')
-rw-r--r--libcxxabi/src/private_typeinfo.cpp5
-rw-r--r--libcxxabi/test/catch_function_01.cpp31
-rw-r--r--libcxxabi/test/catch_function_02.cpp31
3 files changed, 66 insertions, 1 deletions
diff --git a/libcxxabi/src/private_typeinfo.cpp b/libcxxabi/src/private_typeinfo.cpp
index cb7b7dc1e91..e6ffff106bf 100644
--- a/libcxxabi/src/private_typeinfo.cpp
+++ b/libcxxabi/src/private_typeinfo.cpp
@@ -249,7 +249,10 @@ bool
__function_type_info::can_catch(const __shim_type_info* thrown_type,
void*&) const
{
- // TODO: Can this be called?
+ // We can get here if someone tries to catch a function by reference.
+ // However if someone tries to throw a function, it immediately gets
+ // converted to a pointer, which will not convert back to a function
+ // at the catch clause. So this can never catch anything.
return false;
}
diff --git a/libcxxabi/test/catch_function_01.cpp b/libcxxabi/test/catch_function_01.cpp
new file mode 100644
index 00000000000..33999f23de6
--- /dev/null
+++ b/libcxxabi/test/catch_function_01.cpp
@@ -0,0 +1,31 @@
+//===----------------------- catch_function_01.cpp ------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Can you have a catch clause of array type that catches anything?
+
+#include <cassert>
+
+void f() {}
+
+int main()
+{
+ typedef void Function();
+ try
+ {
+ throw f; // converts to void (*)()
+ assert(false);
+ }
+ catch (Function& b) // can't catch void (*)()
+ {
+ assert(false);
+ }
+ catch (...)
+ {
+ }
+}
diff --git a/libcxxabi/test/catch_function_02.cpp b/libcxxabi/test/catch_function_02.cpp
new file mode 100644
index 00000000000..8bff8d912e9
--- /dev/null
+++ b/libcxxabi/test/catch_function_02.cpp
@@ -0,0 +1,31 @@
+//===---------------------- catch_function_02.cpp -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Can you have a catch clause of array type that catches anything?
+
+#include <cassert>
+
+void f() {}
+
+int main()
+{
+ typedef void Function();
+ try
+ {
+ throw f; // converts to void (*)()
+ assert(false);
+ }
+ catch (Function b) // equivalent to void (*)()
+ {
+ }
+ catch (...)
+ {
+ assert(false);
+ }
+}
OpenPOWER on IntegriCloud