aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2015-05-08 15:37:37 +0000
committerTom Stellard <thomas.stellard@amd.com>2015-05-08 15:37:37 +0000
commitadf9c878d57c89b6bb50b7da8bdf3dfbc979b025 (patch)
tree5e9baf172067ce3fc26d97bcd994aa57a9ce2316
parentde42153eb2007a09c2a068a52a81e5b647b2954d (diff)
downloadllvm-adf9c878d57c89b6bb50b7da8bdf3dfbc979b025.zip
llvm-adf9c878d57c89b6bb50b7da8bdf3dfbc979b025.tar.gz
llvm-adf9c878d57c89b6bb50b7da8bdf3dfbc979b025.tar.bz2
Merging r236299:
------------------------------------------------------------------------ r236299 | ericwf | 2015-04-30 18:49:37 -0700 (Thu, 30 Apr 2015) | 7 lines Disallow conversions from function pointers to void*. Function pointers and member function pointers cannot be converted to void*. libc++abi incorrectly allows this conversion for function pointers. Review URL: http://reviews.llvm.org/D8811 ------------------------------------------------------------------------ llvm-svn: 236868
-rw-r--r--libcxxabi/src/private_typeinfo.cpp10
-rw-r--r--libcxxabi/test/catch_function_01.cpp16
2 files changed, 23 insertions, 3 deletions
diff --git a/libcxxabi/src/private_typeinfo.cpp b/libcxxabi/src/private_typeinfo.cpp
index 576d3bf..f0ad291 100644
--- a/libcxxabi/src/private_typeinfo.cpp
+++ b/libcxxabi/src/private_typeinfo.cpp
@@ -381,9 +381,13 @@ __pointer_type_info::can_catch(const __shim_type_info* thrown_type,
if (is_equal(__pointee, thrown_pointer_type->__pointee, false))
return true;
// bullet 3A
- if (is_equal(__pointee, &typeid(void), false))
- return true;
-
+ if (is_equal(__pointee, &typeid(void), false)) {
+ // pointers to functions cannot be converted to void*.
+ // pointers to member functions are not handled here.
+ const __function_type_info* thrown_function =
+ dynamic_cast<const __function_type_info*>(thrown_pointer_type->__pointee);
+ return (thrown_function == nullptr);
+ }
// Handle pointer to pointer
const __pointer_type_info* nested_pointer_type =
dynamic_cast<const __pointer_type_info*>(__pointee);
diff --git a/libcxxabi/test/catch_function_01.cpp b/libcxxabi/test/catch_function_01.cpp
index 33999f2..087fce4 100644
--- a/libcxxabi/test/catch_function_01.cpp
+++ b/libcxxabi/test/catch_function_01.cpp
@@ -11,11 +11,19 @@
#include <cassert>
+template <class Tp>
+bool can_convert(Tp) { return true; }
+
+template <class>
+bool can_convert(...) { return false; }
+
void f() {}
int main()
{
typedef void Function();
+ assert(!can_convert<Function&>(&f));
+ assert(!can_convert<void*>(&f));
try
{
throw f; // converts to void (*)()
@@ -25,7 +33,15 @@ int main()
{
assert(false);
}
+ catch (void*) // can't catch as void*
+ {
+ assert(false);
+ }
+ catch(Function*)
+ {
+ }
catch (...)
{
+ assert(false);
}
}