1 //===----------------- catch_member_data_pointer_01.cpp -------------------===// 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 #include <cassert> 12 13 struct A 14 { AA15 A() : i(0), j(0) {} // explicitly initialize 'i' to prevent warnings 16 const int i; 17 int j; 18 }; 19 20 typedef const int A::*md1; 21 typedef int A::*md2; 22 23 struct B : public A 24 { BB25 B() : k(0), l(0) {} // explicitly initialize 'k' to prevent warnings. 26 const int k; 27 int l; 28 }; 29 30 typedef const int B::*der1; 31 typedef int B::*der2; 32 test1()33void test1() 34 { 35 try 36 { 37 throw &A::i; 38 assert(false); 39 } 40 catch (md2) 41 { 42 assert(false); 43 } 44 catch (md1) 45 { 46 } 47 } 48 49 // Check that cv qualified conversions are allowed. test2()50void test2() 51 { 52 try 53 { 54 throw &A::j; 55 } 56 catch (md2) 57 { 58 } 59 catch (...) 60 { 61 assert(false); 62 } 63 64 try 65 { 66 throw &A::j; 67 assert(false); 68 } 69 catch (md1) 70 { 71 } 72 catch (...) 73 { 74 assert(false); 75 } 76 } 77 78 // Check that Base -> Derived conversions are NOT allowed. test3()79void test3() 80 { 81 try 82 { 83 throw &A::i; 84 assert(false); 85 } 86 catch (md2) 87 { 88 assert(false); 89 } 90 catch (der2) 91 { 92 assert(false); 93 } 94 catch (der1) 95 { 96 assert(false); 97 } 98 catch (md1) 99 { 100 } 101 } 102 103 // Check that Base -> Derived conversions NOT are allowed with different cv 104 // qualifiers. test4()105void test4() 106 { 107 try 108 { 109 throw &A::j; 110 assert(false); 111 } 112 catch (der2) 113 { 114 assert(false); 115 } 116 catch (der1) 117 { 118 assert(false); 119 } 120 catch (md2) 121 { 122 } 123 catch (...) 124 { 125 assert(false); 126 } 127 } 128 129 // Check that no Derived -> Base conversions are allowed. test5()130void test5() 131 { 132 try 133 { 134 throw &B::k; 135 assert(false); 136 } 137 catch (md1) 138 { 139 assert(false); 140 } 141 catch (md2) 142 { 143 assert(false); 144 } 145 catch (der1) 146 { 147 } 148 149 try 150 { 151 throw &B::l; 152 assert(false); 153 } 154 catch (md1) 155 { 156 assert(false); 157 } 158 catch (md2) 159 { 160 assert(false); 161 } 162 catch (der2) 163 { 164 } 165 } 166 main(int,char **)167int main(int, char**) 168 { 169 test1(); 170 test2(); 171 test3(); 172 test4(); 173 test5(); 174 175 return 0; 176 } 177