1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // Catching an exception thrown as nullptr was not properly handled before 10 // 2f984cab4fa7, which landed in macOS 10.13 11 // XFAIL: stdlib=apple-libc++ && target={{.+}}-apple-macosx10.{{9|10|11|12}} 12 13 // UNSUPPORTED: c++03 14 // UNSUPPORTED: no-exceptions 15 16 #include <cassert> 17 #include <cstdlib> 18 19 struct A {}; 20 test1()21void test1() 22 { 23 try 24 { 25 throw nullptr; 26 assert(false); 27 } 28 catch (int* p) 29 { 30 assert(!p); 31 } 32 catch (long*) 33 { 34 assert(false); 35 } 36 } 37 test2()38void test2() 39 { 40 try 41 { 42 throw nullptr; 43 assert(false); 44 } 45 catch (A* p) 46 { 47 assert(!p); 48 } 49 catch (int*) 50 { 51 assert(false); 52 } 53 } 54 55 template <class Catch> catch_nullptr_test()56void catch_nullptr_test() { 57 try { 58 throw nullptr; 59 assert(false); 60 } catch (Catch c) { 61 assert(!c); 62 } catch (...) { 63 assert(false); 64 } 65 } 66 67 main(int,char **)68int main(int, char**) 69 { 70 // catch naked nullptrs 71 test1(); 72 test2(); 73 74 catch_nullptr_test<int*>(); 75 catch_nullptr_test<int**>(); 76 catch_nullptr_test<int A::*>(); 77 catch_nullptr_test<const int A::*>(); 78 catch_nullptr_test<int A::**>(); 79 80 return 0; 81 } 82