annotate gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic14.C @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 // PR c++/88337 - Implement P1327R1: Allow dynamic_cast/typeid in constexpr.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 // { dg-do compile { target c++2a } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 // Adopted from g++.old-deja/g++.other/dyncast1.C.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // But use reference dynamic_cast.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 // 1. downcast
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 // 1.1. single inheritance case
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 struct A { virtual void a(); };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 struct AA : A {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 struct B : A {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 struct BB : B {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 class C : B {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 struct D : C {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 struct CC : B {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 class DD : CC {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 class CCC : protected B {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 class DDD : protected CCC {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 constexpr D d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 constexpr bool b01 = (dynamic_cast<D&> ((A&)d), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 // { dg-message "static type .const A. of its operand is a non-public base class of dynamic type .D." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 constexpr bool b02 = (dynamic_cast<D&> ((B&)d), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 // { dg-message "static type .const B. of its operand is a non-public base class of dynamic type .D." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 static_assert (&d == &dynamic_cast<const D&> ((C&)d));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 constexpr bool b03 = (dynamic_cast<C&> ((B&)d), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 // { dg-message "static type .const B. of its operand is a non-public base class of dynamic type .D." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 constexpr DD dd;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 constexpr bool b04 = (dynamic_cast<DD&> ((A&)dd), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 // { dg-message "static type .const A. of its operand is a non-public base class of dynamic type .DD." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 constexpr bool b05 = (dynamic_cast<DD&> ((B&)dd), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 // { dg-message "static type .const B. of its operand is a non-public base class of dynamic type .DD." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 constexpr DDD ddd;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 constexpr bool b06 = (dynamic_cast<DDD&> ((A&)ddd), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 // { dg-message "static type .const A. of its operand is a non-public base class of dynamic type .DDD." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 constexpr bool b07 = (dynamic_cast<DDD&> ((B&)ddd), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 // { dg-message "static type .const B. of its operand is a non-public base class of dynamic type .DDD." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 constexpr bool b08 = (dynamic_cast<CCC&> ((B&)ddd), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 // { dg-message "static type .const B. of its operand is a non-public base class of dynamic type .DDD." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 // 1.2. multiple inheritance case
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 // 1.2.1. all bases are public
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 struct E : D, CC {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 struct EE : CC, D {}; //Will search in reverse order.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 constexpr E e;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 constexpr bool b09 = (dynamic_cast<E&> ((A&)(D&)e), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 // { dg-message "static type .A. of its operand is a non-public base class of dynamic type .E." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 constexpr bool b10 = (dynamic_cast<E&> ((B&)(D&)e), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 // { dg-message "static type .B. of its operand is a non-public base class of dynamic type .E." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 static_assert (&e == &dynamic_cast<E&> ((C&)(D&)e));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 static_assert (&e == &dynamic_cast<E&> ((B&)(CC&)e));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 static_assert (&(CC&)e == &dynamic_cast<CC&> ((B&)(CC&)e));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 constexpr EE ee;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 constexpr bool b11 = (dynamic_cast<EE&> ((A&)(D&)ee), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 // { dg-message "static type .A. of its operand is a non-public base class of dynamic type .EE." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 constexpr bool b12 = (dynamic_cast<EE&> ((B&)(D&)ee), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 // { dg-message "static type .B. of its operand is a non-public base class of dynamic type .EE." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 static_assert (&ee == &dynamic_cast<EE&> ((C&)(D&)ee));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 static_assert (&ee == &dynamic_cast<EE&> ((B&)(CC&)ee));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 static_assert (&(CC&)ee == &dynamic_cast<CC&> ((B&)(CC&)ee));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 // 1.2.2 one or more branches are nonpublic
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 struct X : private BB, E {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 struct Y : AA, private B {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 class XX : BB, E {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 constexpr X x;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 static_assert (&x == &dynamic_cast<X&>((B&)(CC&)(E&)x));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 constexpr XX xx;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 constexpr bool b13 = (dynamic_cast<XX&>((B&)(CC&)(E&)xx), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 // { dg-message "static type .B. of its operand is a non-public base class of dynamic type .XX." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 constexpr Y y;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 constexpr bool b14 = (dynamic_cast<Y&>((B&)y), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 // { dg-message "static type .const B. of its operand is a non-public base class of dynamic type .Y." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 constexpr bool b15 = (dynamic_cast<Y&>((A&)(B&)y), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 // { dg-message "static type .A. of its operand is a non-public base class of dynamic type .Y." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 // 2. crosscast
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 struct J { virtual void j(); };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 struct K : CC, private J {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 class KK : J, CC{};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 constexpr bool b16 = (dynamic_cast<CC&> ((B&)(D&)e), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 // { dg-message "static type .B. of its operand is a non-public base class of dynamic type .CC." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 static_assert (&(CC&)e == &dynamic_cast<CC&> ((C&)(D&)e));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 constexpr K k;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 constexpr bool b17 = (dynamic_cast<J&> ((B&)k), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 // { dg-message "dynamic type .K. of its operand does not have an unambiguous public base class .J." "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 constexpr KK kk;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 constexpr bool b18 = (dynamic_cast<J&> ((CC&)kk), true); // { dg-error "reference .dynamic_cast. failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 // { dg-message "static type .const CC. of its operand is a non-public base class of dynamic type .KK." "" { target *-*-* } .-1 }