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 15struct A {}; 16 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 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 51template <class Catch> 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 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