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