annotate gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
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 // P0784R7
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 struct S
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 constexpr S () : s (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 constexpr ~S () {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 int s;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 struct T // { dg-message "'T' is not literal because" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 { // { dg-message "'T' does not have 'constexpr' destructor" "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 constexpr T () : t (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 ~T () {} // { dg-message "defaulted destructor calls non-'constexpr' 'T::~T\\(\\)'" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 int t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 struct U : public S
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 constexpr U () : u (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 constexpr ~U () = default; // { dg-error "explicitly defaulted function 'constexpr U::~U\\(\\)' cannot be declared 'constexpr' because the implicit declaration is not 'constexpr'" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 int u;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 T t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 struct V : virtual public S
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 V () : v (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 constexpr ~V () = default; // { dg-error "explicitly defaulted function 'constexpr V::~V\\(\\)' cannot be declared 'constexpr' because the implicit declaration is not 'constexpr'" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 int v;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 struct W0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 constexpr W0 () : w (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 constexpr W0 (int x) : w (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 constexpr ~W0 () { if (w == 5) asm (""); w = 3; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 int w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 struct W1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 constexpr W1 () : w (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 constexpr W1 (int x) : w (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 constexpr ~W1 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 // { dg-message "only unevaluated inline assembly is allowed in a 'constexpr' function" "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 int w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 struct W2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 constexpr W2 () : w (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 constexpr W2 (int x) : w (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 constexpr ~W2 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 // { dg-message "only unevaluated inline assembly is allowed in a 'constexpr' function" "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 int w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 struct W3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 constexpr W3 () : w (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 constexpr W3 (int x) : w (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 constexpr ~W3 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 // { dg-message "only unevaluated inline assembly is allowed in a 'constexpr' function" "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 int w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 struct W4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 constexpr W4 () : w (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 constexpr W4 (int x) : w (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 constexpr ~W4 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 // { dg-message "only unevaluated inline assembly is allowed in a 'constexpr' function" "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 int w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 struct W5
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 constexpr W5 () : w (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 constexpr W5 (int x) : w (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 constexpr ~W5 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 // { dg-message "only unevaluated inline assembly is allowed in a 'constexpr' function" "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 int w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 struct W6
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 constexpr W6 () : w (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 constexpr W6 (int x) : w (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 constexpr ~W6 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 // { dg-message "only unevaluated inline assembly is allowed in a 'constexpr' function" "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 int w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 struct W7
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 constexpr W7 () : w (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 constexpr W7 (int x) : w (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 constexpr ~W7 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 // { dg-message "only unevaluated inline assembly is allowed in a 'constexpr' function" "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 int w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 struct W8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 constexpr W8 () : w (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 constexpr W8 (int x) : w (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 constexpr ~W8 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 // { dg-message "only unevaluated inline assembly is allowed in a 'constexpr' function" "" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 int w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 struct X : public T
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 constexpr X () : x (0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 constexpr ~X () = default; // { dg-error "explicitly defaulted function 'constexpr X::~X\\(\\)' cannot be declared 'constexpr' because the implicit declaration is not 'constexpr'" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 int x;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 constexpr S s;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 constexpr T t; // { dg-error "the type 'const T' of 'constexpr' variable 't' is not literal" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 constexpr W0 w1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 constexpr W0 w2 = 12;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 constexpr W1 w3 = 5; // { dg-message "in 'constexpr' expansion of" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 constexpr W0 w4[3] = { 1, 2, 3 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 constexpr W2 w5[3] = { 4, 5, 6 }; // { dg-message "in 'constexpr' expansion of" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 f1 ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 constexpr S s2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 constexpr W0 w6;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 constexpr W0 w7 = 12;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 constexpr W3 w8 = 5; // { dg-message "in 'constexpr' expansion of" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 constexpr W0 w9[3] = { 1, 2, 3 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 constexpr W4 w10[3] = { 4, 5, 6 }; // { dg-message "in 'constexpr' expansion of" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 constexpr int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 f2 ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 constexpr S s3;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 constexpr W0 w11;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 constexpr W0 w12 = 12;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 constexpr W5 w13 = 5; // { dg-message "in 'constexpr' expansion of" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 constexpr W0 w14[3] = { 1, 2, 3 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 constexpr W6 w15[3] = { 4, 5, 6 }; // { dg-message "in 'constexpr' expansion of" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 constexpr int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 f3 ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 S s3;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 W0 w11;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 W0 w12 = 12;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 W0 w14[3] = { 1, 2, 3 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 constexpr int x3 = f3 ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 constexpr int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 f4 ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 W7 w13 = 5; // { dg-message "in 'constexpr' expansion of" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 constexpr int x4 = f4 (); // { dg-message "in 'constexpr' expansion of" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 constexpr int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 f5 ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 W8 w15[3] = { 4, 5, 6 }; // { dg-message "in 'constexpr' expansion of" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 constexpr int x5 = f5 (); // { dg-message "in 'constexpr' expansion of" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 f6 ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 constexpr T t2; // { dg-error "the type 'const T' of 'constexpr' variable 't2' is not literal" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 constexpr int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 f7 ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 constexpr T t3; // { dg-error "the type 'const T' of 'constexpr' variable 't3' is not literal" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 constexpr int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 f8 ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 T t4; // { dg-error "variable 't4' of non-literal type 'T' in 'constexpr' function" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 }