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 // UNSUPPORTED: no-exceptions 10 11 // Compilers emit warnings about exceptions of type 'Child' being caught by 12 // an earlier handler of type 'Base'. Congrats, you've just diagnosed the 13 // behavior under test. 14 // ADDITIONAL_COMPILE_FLAGS: -Wno-exceptions 15 16 // The fix for PR17222 made it in the dylib for macOS 10.10 17 // XFAIL: stdlib=apple-libc++ && target={{.+}}-apple-macosx10.9 18 19 #include <cassert> 20 #include <stdint.h> 21 22 #if __cplusplus < 201103L 23 #define DISABLE_NULLPTR_TESTS 24 #endif 25 26 struct A {}; 27 A a; 28 const A ca = A(); 29 test1()30void test1 () 31 { 32 try 33 { 34 throw &a; 35 assert(false); 36 } 37 catch ( const A* ) 38 { 39 } 40 catch ( A *) 41 { 42 assert (false); 43 } 44 } 45 test2()46void test2 () 47 { 48 try 49 { 50 throw &a; 51 assert(false); 52 } 53 catch ( A* ) 54 { 55 } 56 catch ( const A *) 57 { 58 assert (false); 59 } 60 } 61 test3()62void test3 () 63 { 64 try 65 { 66 throw &ca; 67 assert(false); 68 } 69 catch ( const A* ) 70 { 71 } 72 catch ( A *) 73 { 74 assert (false); 75 } 76 } 77 test4()78void test4 () 79 { 80 try 81 { 82 throw &ca; 83 assert(false); 84 } 85 catch ( A *) 86 { 87 assert (false); 88 } 89 catch ( const A* ) 90 { 91 } 92 } 93 94 struct base1 {int x;}; 95 struct base2 {int x;}; 96 struct derived : base1, base2 {}; 97 test5()98void test5 () 99 { 100 try 101 { 102 throw (derived*)0; 103 assert(false); 104 } 105 catch (base2 *p) { 106 assert (p == 0); 107 } 108 catch (...) 109 { 110 assert (false); 111 } 112 } 113 test6()114void test6 () 115 { 116 #if !defined(DISABLE_NULLPTR_TESTS) 117 try 118 { 119 throw nullptr; 120 assert(false); 121 } 122 catch (base2 *p) { 123 assert (p == nullptr); 124 } 125 catch (...) 126 { 127 assert (false); 128 } 129 #endif 130 } 131 test7()132void test7 () 133 { 134 try 135 { 136 throw (derived*)12; 137 assert(false); 138 } 139 catch (base2 *p) { 140 assert ((uintptr_t)p == 12+sizeof(base1)); 141 } 142 catch (...) 143 { 144 assert (false); 145 } 146 } 147 148 149 struct vBase {}; 150 struct vDerived : virtual public vBase {}; 151 test8()152void test8 () 153 { 154 vDerived derived; 155 try 156 { 157 throw &derived; 158 assert(false); 159 } 160 catch (vBase *p) { 161 assert(p != 0); 162 } 163 catch (...) 164 { 165 assert (false); 166 } 167 } 168 test9()169void test9 () 170 { 171 #if !defined(DISABLE_NULLPTR_TESTS) 172 try 173 { 174 throw nullptr; 175 assert(false); 176 } 177 catch (vBase *p) { 178 assert(p == 0); 179 } 180 catch (...) 181 { 182 assert (false); 183 } 184 #endif 185 } 186 test10()187void test10 () 188 { 189 try 190 { 191 throw (vDerived*)0; 192 assert(false); 193 } 194 catch (vBase *p) { 195 assert(p == 0); 196 } 197 catch (...) 198 { 199 assert (false); 200 } 201 } 202 main(int,char **)203int main(int, char**) 204 { 205 test1(); 206 test2(); 207 test3(); 208 test4(); 209 test5(); 210 test6(); 211 test7(); 212 test8(); 213 test9(); 214 test10(); 215 216 return 0; 217 } 218