diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2015-05-08 15:26:17 +0000 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2015-05-08 15:26:17 +0000 |
commit | 84c765b2be625c33f608fe9903fe12534e34b969 (patch) | |
tree | a71f853aae20bf1185aa98a28b08ea7635030909 | |
parent | 5b8be6aa43f157afacfcbd3314463a4789afdf6e (diff) | |
download | llvm-84c765b2be625c33f608fe9903fe12534e34b969.zip llvm-84c765b2be625c33f608fe9903fe12534e34b969.tar.gz llvm-84c765b2be625c33f608fe9903fe12534e34b969.tar.bz2 |
Add tests missed in r236862
llvm-svn: 236864
-rw-r--r-- | libcxxabi/test/catch_member_data_pointer_01.cpp | 119 | ||||
-rw-r--r-- | libcxxabi/test/catch_pointer_nullptr.cpp | 37 |
2 files changed, 152 insertions, 4 deletions
diff --git a/libcxxabi/test/catch_member_data_pointer_01.cpp b/libcxxabi/test/catch_member_data_pointer_01.cpp index 44ff753..298a1c0 100644 --- a/libcxxabi/test/catch_member_data_pointer_01.cpp +++ b/libcxxabi/test/catch_member_data_pointer_01.cpp @@ -18,6 +18,15 @@ struct A typedef const int A::*md1; typedef int A::*md2; +struct B : public A +{ + const int k; + int l; +}; + +typedef const int B::*der1; +typedef int B::*der2; + void test1() { try @@ -34,19 +43,126 @@ void test1() } } +// Check that cv qualified conversions are allowed. void test2() { try { throw &A::j; + } + catch (md2) + { + } + catch (...) + { + assert(false); + } + + try + { + throw &A::j; assert(false); } catch (md1) { + } + catch (...) + { + assert(false); + } +} + +// Check that Base -> Derived conversions are allowed. +void test3() +{ + try + { + throw &A::i; assert(false); } catch (md2) { + assert(false); + } + catch (der2) + { + assert(false); + } + catch (der1) + { + } + catch (md1) + { + assert(false); + } +} + +// Check that Base -> Derived conversions are allowed with different cv +// qualifiers. +void test4() +{ + try + { + throw &A::j; + assert(false); + } + catch (der2) + { + } + catch (...) + { + assert(false); + } + + try + { + throw &A::j; + assert(false); + } + catch (der1) + { + } + catch (...) + { + assert(false); + } +} + +// Check that no Derived -> Base conversions are allowed. +void test5() +{ + try + { + throw &B::k; + assert(false); + } + catch (md1) + { + assert(false); + } + catch (md2) + { + assert(false); + } + catch (der1) + { + } + + try + { + throw &B::l; + assert(false); + } + catch (md1) + { + assert(false); + } + catch (md2) + { + assert(false); + } + catch (der2) + { } } @@ -54,4 +170,7 @@ int main() { test1(); test2(); + test3(); + test4(); + test5(); } diff --git a/libcxxabi/test/catch_pointer_nullptr.cpp b/libcxxabi/test/catch_pointer_nullptr.cpp index dae6e6a..b969119 100644 --- a/libcxxabi/test/catch_pointer_nullptr.cpp +++ b/libcxxabi/test/catch_pointer_nullptr.cpp @@ -8,6 +8,13 @@ //===----------------------------------------------------------------------===// #include <cassert> +#include <cstdlib> + +#ifndef __has_feature +#define __has_feature(x) 0 +#endif + +struct A {}; #if __has_feature(cxx_nullptr) @@ -27,8 +34,6 @@ void test1() } } -struct A {}; - void test2() { try @@ -45,6 +50,18 @@ void test2() } } +template <class Catch> +void catch_nullptr_test() { + try { + throw nullptr; + assert(false); + } catch (Catch) { + // nothing todo + } catch (...) { + assert(false); + } +} + #else void test1() @@ -55,10 +72,22 @@ void test2() { } +template <class Catch> +void catch_nullptr_test() +{ +} + #endif int main() { - test1(); - test2(); + // catch naked nullptrs + test1(); + test2(); + + catch_nullptr_test<int*>(); + catch_nullptr_test<int**>(); + catch_nullptr_test<int A::*>(); + catch_nullptr_test<const int A::*>(); + catch_nullptr_test<int A::**>(); } |