//===----------------------------------------------------------------------===// | |
// | |
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
// See https://llvm.org/LICENSE.txt for license information. | |
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
// | |
//===----------------------------------------------------------------------===// | |
// UNSUPPORTED: no-exceptions | |
#include <cassert> | |
struct A | |
{ | |
A() : i(0), j(0) {} // explicitly initialize 'i' to prevent warnings | |
const int i; | |
int j; | |
}; | |
typedef const int A::*md1; | |
typedef int A::*md2; | |
struct B : public A | |
{ | |
B() : k(0), l(0) {} // explicitly initialize 'k' to prevent warnings. | |
const int k; | |
int l; | |
}; | |
typedef const int B::*der1; | |
typedef int B::*der2; | |
void test1() | |
{ | |
try | |
{ | |
throw &A::i; | |
assert(false); | |
} | |
catch (md2) | |
{ | |
assert(false); | |
} | |
catch (md1) | |
{ | |
} | |
} | |
// Check that cv qualified conversions are allowed. | |
void test2() | |
{ | |
try | |
{ | |
throw &A::j; | |
} | |
catch (md2) | |
{ | |
} | |
catch (...) | |
{ | |
assert(false); | |
} | |
try | |
{ | |
throw &A::j; | |
assert(false); | |
} | |
catch (md1) | |
{ | |
} | |
catch (...) | |
{ | |
assert(false); | |
} | |
} | |
// Check that Base -> Derived conversions are NOT allowed. | |
void test3() | |
{ | |
try | |
{ | |
throw &A::i; | |
assert(false); | |
} | |
catch (md2) | |
{ | |
assert(false); | |
} | |
catch (der2) | |
{ | |
assert(false); | |
} | |
catch (der1) | |
{ | |
assert(false); | |
} | |
catch (md1) | |
{ | |
} | |
} | |
// Check that Base -> Derived conversions NOT are allowed with different cv | |
// qualifiers. | |
void test4() | |
{ | |
try | |
{ | |
throw &A::j; | |
assert(false); | |
} | |
catch (der2) | |
{ | |
assert(false); | |
} | |
catch (der1) | |
{ | |
assert(false); | |
} | |
catch (md2) | |
{ | |
} | |
catch (...) | |
{ | |
assert(false); | |
} | |
} | |
// Check that no Derived -> Base conversions are allowed. | |
void test5() | |
{ | |
try | |
{ | |
throw &B::k; | |
assert(false); | |
} | |
catch (md1) | |
{ | |
assert(false); | |
} | |
catch (md2) | |
{ | |
assert(false); | |
} | |
catch (der1) | |
{ | |
} | |
try | |
{ | |
throw &B::l; | |
assert(false); | |
} | |
catch (md1) | |
{ | |
assert(false); | |
} | |
catch (md2) | |
{ | |
assert(false); | |
} | |
catch (der2) | |
{ | |
} | |
} | |
int main(int, char**) | |
{ | |
test1(); | |
test2(); | |
test3(); | |
test4(); | |
test5(); | |
return 0; | |
} |