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