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