1 //===--------------------- catch_pointer_nullptr.cpp ----------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // UNSUPPORTED: c++98, c++03, libcxxabi-no-exceptions 11 12 #include <cassert> 13 #include <cstdlib> 14 15 struct A {}; 16 test1()17void test1() 18 { 19 try 20 { 21 throw nullptr; 22 assert(false); 23 } 24 catch (int* p) 25 { 26 assert(!p); 27 } 28 catch (long*) 29 { 30 assert(false); 31 } 32 } 33 test2()34void test2() 35 { 36 try 37 { 38 throw nullptr; 39 assert(false); 40 } 41 catch (A* p) 42 { 43 assert(!p); 44 } 45 catch (int*) 46 { 47 assert(false); 48 } 49 } 50 51 template <class Catch> catch_nullptr_test()52void catch_nullptr_test() { 53 try { 54 throw nullptr; 55 assert(false); 56 } catch (Catch c) { 57 assert(!c); 58 } catch (...) { 59 assert(false); 60 } 61 } 62 63 main()64int main() 65 { 66 // catch naked nullptrs 67 test1(); 68 test2(); 69 70 catch_nullptr_test<int*>(); 71 catch_nullptr_test<int**>(); 72 catch_nullptr_test<int A::*>(); 73 catch_nullptr_test<const int A::*>(); 74 catch_nullptr_test<int A::**>(); 75 } 76