1 // RUN: %clang_cc1 -triple i686-linux -Wno-string-plus-int -Wno-pointer-arith -Wno-zero-length-array -fsyntax-only -fcxx-exceptions -verify -std=c++11 -pedantic %s -Wno-comment -Wno-tautological-pointer-compare -Wno-bool-conversion
2
3 namespace StaticAssertFoldTest {
4
5 int x;
6 static_assert(++x, "test"); // expected-error {{not an integral constant expression}}
7 static_assert(false, "test"); // expected-error {{test}}
8
9 }
10
11 typedef decltype(sizeof(char)) size_t;
12
id(const T & t)13 template<typename T> constexpr T id(const T &t) { return t; }
min(const T & a,const T & b)14 template<typename T> constexpr T min(const T &a, const T &b) {
15 return a < b ? a : b;
16 }
max(const T & a,const T & b)17 template<typename T> constexpr T max(const T &a, const T &b) {
18 return a < b ? b : a;
19 }
begin(T (& xs)[N])20 template<typename T, size_t N> constexpr T *begin(T (&xs)[N]) { return xs; }
end(T (& xs)[N])21 template<typename T, size_t N> constexpr T *end(T (&xs)[N]) { return xs + N; }
22
23 struct MemberZero {
zeroMemberZero24 constexpr int zero() const { return 0; }
25 };
26
27 namespace DerivedToVBaseCast {
28
29 struct U { int n; };
30 struct V : U { int n; };
31 struct A : virtual V { int n; };
32 struct Aa { int n; };
33 struct B : virtual A, Aa {};
34 struct C : virtual A, Aa {};
35 struct D : B, C {};
36
37 D d;
38 constexpr B *p = &d;
39 constexpr C *q = &d;
40
41 static_assert((void*)p != (void*)q, "");
42 static_assert((A*)p == (A*)q, "");
43 static_assert((Aa*)p != (Aa*)q, "");
44
45 constexpr B &pp = d;
46 constexpr C &qq = d;
47 static_assert((void*)&pp != (void*)&qq, "");
48 static_assert(&(A&)pp == &(A&)qq, "");
49 static_assert(&(Aa&)pp != &(Aa&)qq, "");
50
51 constexpr V *v = p;
52 constexpr V *w = q;
53 constexpr V *x = (A*)p;
54 static_assert(v == w, "");
55 static_assert(v == x, "");
56
57 static_assert((U*)&d == p, "");
58 static_assert((U*)&d == q, "");
59 static_assert((U*)&d == v, "");
60 static_assert((U*)&d == w, "");
61 static_assert((U*)&d == x, "");
62
63 struct X {};
64 struct Y1 : virtual X {};
65 struct Y2 : X {};
66 struct Z : Y1, Y2 {};
67 Z z;
68 static_assert((X*)(Y1*)&z != (X*)(Y2*)&z, "");
69 }
70
71 namespace ConstCast {
72
73 constexpr int n1 = 0;
74 constexpr int n2 = const_cast<int&>(n1);
75 constexpr int *n3 = const_cast<int*>(&n1);
76 constexpr int n4 = *const_cast<int*>(&n1);
77 constexpr const int * const *n5 = const_cast<const int* const*>(&n3);
78 constexpr int **n6 = const_cast<int**>(&n3);
79 constexpr int n7 = **n5;
80 constexpr int n8 = **n6;
81
82 // const_cast from prvalue to xvalue.
83 struct A { int n; };
84 constexpr int n9 = (const_cast<A&&>(A{123})).n;
85 static_assert(n9 == 123, "");
86
87 }
88
89 namespace TemplateArgumentConversion {
90 template<int n> struct IntParam {};
91
92 using IntParam0 = IntParam<0>;
93 using IntParam0 = IntParam<id(0)>;
94 using IntParam0 = IntParam<MemberZero().zero>; // expected-error {{did you mean to call it with no arguments?}}
95 }
96
97 namespace CaseStatements {
98 int x;
f(int n)99 void f(int n) {
100 switch (n) {
101 case MemberZero().zero: // expected-error {{did you mean to call it with no arguments?}} expected-note {{previous}}
102 case id(0): // expected-error {{duplicate case value '0'}}
103 return;
104 case __builtin_constant_p(true) ? (__SIZE_TYPE__)&x : 0:; // expected-error {{constant}}
105 }
106 }
107 }
108
109 extern int &Recurse1;
110 int &Recurse2 = Recurse1; // expected-note {{declared here}}
111 int &Recurse1 = Recurse2;
112 constexpr int &Recurse3 = Recurse2; // expected-error {{must be initialized by a constant expression}} expected-note {{initializer of 'Recurse2' is not a constant expression}}
113
114 extern const int RecurseA;
115 const int RecurseB = RecurseA; // expected-note {{declared here}}
116 const int RecurseA = 10;
117 constexpr int RecurseC = RecurseB; // expected-error {{must be initialized by a constant expression}} expected-note {{initializer of 'RecurseB' is not a constant expression}}
118
119 namespace MemberEnum {
120 struct WithMemberEnum {
121 enum E { A = 42 };
122 } wme;
123
124 static_assert(wme.A == 42, "");
125 }
126
127 namespace DefaultArguments {
128
129 const int z = int();
Sum(int a=0,const int & b=0,const int * c=& z,char d=0)130 constexpr int Sum(int a = 0, const int &b = 0, const int *c = &z, char d = 0) {
131 return a + b + *c + d;
132 }
133 const int four = 4;
134 constexpr int eight = 8;
135 constexpr const int twentyseven = 27;
136 static_assert(Sum() == 0, "");
137 static_assert(Sum(1) == 1, "");
138 static_assert(Sum(1, four) == 5, "");
139 static_assert(Sum(1, eight, &twentyseven) == 36, "");
140 static_assert(Sum(1, 2, &four, eight) == 15, "");
141
142 }
143
144 namespace Ellipsis {
145
146 // Note, values passed through an ellipsis can't actually be used.
F(int a,...)147 constexpr int F(int a, ...) { return a; }
148 static_assert(F(0) == 0, "");
149 static_assert(F(1, 0) == 1, "");
150 static_assert(F(2, "test") == 2, "");
151 static_assert(F(3, &F) == 3, "");
152 int k = 0; // expected-note {{here}}
153 static_assert(F(4, k) == 3, ""); // expected-error {{constant expression}} expected-note {{read of non-const variable 'k'}}
154
155 }
156
157 namespace Recursion {
fib(int n)158 constexpr int fib(int n) { return n > 1 ? fib(n-1) + fib(n-2) : n; }
159 static_assert(fib(11) == 89, "");
160
gcd_inner(int a,int b)161 constexpr int gcd_inner(int a, int b) {
162 return b == 0 ? a : gcd_inner(b, a % b);
163 }
gcd(int a,int b)164 constexpr int gcd(int a, int b) {
165 return gcd_inner(max(a, b), min(a, b));
166 }
167
168 static_assert(gcd(1749237, 5628959) == 7, "");
169 }
170
171 namespace FunctionCast {
172 // When folding, we allow functions to be cast to different types. Such
173 // cast functions cannot be called, even if they're constexpr.
f()174 constexpr int f() { return 1; }
175 typedef double (*DoubleFn)();
176 typedef int (*IntFn)();
177 int a[(int)DoubleFn(f)()]; // expected-error {{variable length array}} expected-warning{{C99 feature}}
178 int b[(int)IntFn(f)()]; // ok
179 }
180
181 namespace StaticMemberFunction {
182 struct S {
183 static constexpr int k = 42;
fStaticMemberFunction::S184 static constexpr int f(int n) { return n * k + 2; }
185 } s;
186
187 constexpr int n = s.f(19);
188 static_assert(S::f(19) == 800, "");
189 static_assert(s.f(19) == 800, "");
190 static_assert(n == 800, "");
191
192 constexpr int (*sf1)(int) = &S::f;
193 constexpr int (*sf2)(int) = &s.f;
194 constexpr const int *sk = &s.k;
195 }
196
197 namespace ParameterScopes {
198
199 const int k = 42;
ObscureTheTruth(const int & a)200 constexpr const int &ObscureTheTruth(const int &a) { return a; }
MaybeReturnJunk(bool b,const int a)201 constexpr const int &MaybeReturnJunk(bool b, const int a) { // expected-note 2{{declared here}}
202 return ObscureTheTruth(b ? a : k);
203 }
204 static_assert(MaybeReturnJunk(false, 0) == 42, ""); // ok
205 constexpr int a = MaybeReturnJunk(true, 0); // expected-error {{constant expression}} expected-note {{read of variable whose lifetime has ended}}
206
MaybeReturnNonstaticRef(bool b,const int a)207 constexpr const int MaybeReturnNonstaticRef(bool b, const int a) {
208 return ObscureTheTruth(b ? a : k);
209 }
210 static_assert(MaybeReturnNonstaticRef(false, 0) == 42, ""); // ok
211 constexpr int b = MaybeReturnNonstaticRef(true, 0); // ok
212
InternalReturnJunk(int n)213 constexpr int InternalReturnJunk(int n) {
214 return MaybeReturnJunk(true, n); // expected-note {{read of variable whose lifetime has ended}}
215 }
216 constexpr int n3 = InternalReturnJunk(0); // expected-error {{must be initialized by a constant expression}} expected-note {{in call to 'InternalReturnJunk(0)'}}
217
LToR(int & n)218 constexpr int LToR(int &n) { return n; }
GrabCallersArgument(bool which,int a,int b)219 constexpr int GrabCallersArgument(bool which, int a, int b) {
220 return LToR(which ? b : a);
221 }
222 static_assert(GrabCallersArgument(false, 1, 2) == 1, "");
223 static_assert(GrabCallersArgument(true, 4, 8) == 8, "");
224
225 }
226
227 namespace Pointers {
228
f(int n,const int * a,const int * b,const int * c)229 constexpr int f(int n, const int *a, const int *b, const int *c) {
230 return n == 0 ? 0 : *a + f(n-1, b, c, a);
231 }
232
233 const int x = 1, y = 10, z = 100;
234 static_assert(f(23, &x, &y, &z) == 788, "");
235
g(int n,int a,int b,int c)236 constexpr int g(int n, int a, int b, int c) {
237 return f(n, &a, &b, &c);
238 }
239 static_assert(g(23, x, y, z) == 788, "");
240
241 }
242
243 namespace FunctionPointers {
244
Double(int n)245 constexpr int Double(int n) { return 2 * n; }
Triple(int n)246 constexpr int Triple(int n) { return 3 * n; }
Twice(int (* F)(int),int n)247 constexpr int Twice(int (*F)(int), int n) { return F(F(n)); }
Quadruple(int n)248 constexpr int Quadruple(int n) { return Twice(Double, n); }
Select(int n)249 constexpr auto Select(int n) -> int (*)(int) {
250 return n == 2 ? &Double : n == 3 ? &Triple : n == 4 ? &Quadruple : 0;
251 }
Apply(int (* F)(int),int n)252 constexpr int Apply(int (*F)(int), int n) { return F(n); } // expected-note {{subexpression}}
253
254 static_assert(1 + Apply(Select(4), 5) + Apply(Select(3), 7) == 42, "");
255
256 constexpr int Invalid = Apply(Select(0), 0); // expected-error {{must be initialized by a constant expression}} expected-note {{in call to 'Apply(0, 0)'}}
257
258 }
259
260 namespace PointerComparison {
261
262 int x, y;
263 static_assert(&x == &y, "false"); // expected-error {{false}}
264 static_assert(&x != &y, "");
265 constexpr bool g1 = &x == &y;
266 constexpr bool g2 = &x != &y;
267 constexpr bool g3 = &x <= &y; // expected-error {{must be initialized by a constant expression}}
268 constexpr bool g4 = &x >= &y; // expected-error {{must be initialized by a constant expression}}
269 constexpr bool g5 = &x < &y; // expected-error {{must be initialized by a constant expression}}
270 constexpr bool g6 = &x > &y; // expected-error {{must be initialized by a constant expression}}
271
272 struct S { int x, y; } s;
273 static_assert(&s.x == &s.y, "false"); // expected-error {{false}}
274 static_assert(&s.x != &s.y, "");
275 static_assert(&s.x <= &s.y, "");
276 static_assert(&s.x >= &s.y, "false"); // expected-error {{false}}
277 static_assert(&s.x < &s.y, "");
278 static_assert(&s.x > &s.y, "false"); // expected-error {{false}}
279
280 static_assert(0 == &y, "false"); // expected-error {{false}}
281 static_assert(0 != &y, "");
282 constexpr bool n3 = 0 <= &y; // expected-error {{must be initialized by a constant expression}}
283 constexpr bool n4 = 0 >= &y; // expected-error {{must be initialized by a constant expression}}
284 constexpr bool n5 = 0 < &y; // expected-error {{must be initialized by a constant expression}}
285 constexpr bool n6 = 0 > &y; // expected-error {{must be initialized by a constant expression}}
286
287 static_assert(&x == 0, "false"); // expected-error {{false}}
288 static_assert(&x != 0, "");
289 constexpr bool n9 = &x <= 0; // expected-error {{must be initialized by a constant expression}}
290 constexpr bool n10 = &x >= 0; // expected-error {{must be initialized by a constant expression}}
291 constexpr bool n11 = &x < 0; // expected-error {{must be initialized by a constant expression}}
292 constexpr bool n12 = &x > 0; // expected-error {{must be initialized by a constant expression}}
293
294 static_assert(&x == &x, "");
295 static_assert(&x != &x, "false"); // expected-error {{false}}
296 static_assert(&x <= &x, "");
297 static_assert(&x >= &x, "");
298 static_assert(&x < &x, "false"); // expected-error {{false}}
299 static_assert(&x > &x, "false"); // expected-error {{false}}
300
301 constexpr S* sptr = &s;
302 constexpr bool dyncast = sptr == dynamic_cast<S*>(sptr); // expected-error {{constant expression}} expected-note {{dynamic_cast}}
303
304 struct U {};
305 struct Str {
306 int a : dynamic_cast<S*>(sptr) == dynamic_cast<S*>(sptr); // \
307 expected-warning {{not an integral constant expression}} \
308 expected-note {{dynamic_cast is not allowed in a constant expression}}
309 int b : reinterpret_cast<S*>(sptr) == reinterpret_cast<S*>(sptr); // \
310 expected-warning {{not an integral constant expression}} \
311 expected-note {{reinterpret_cast is not allowed in a constant expression}}
312 int c : (S*)(long)(sptr) == (S*)(long)(sptr); // \
313 expected-warning {{not an integral constant expression}} \
314 expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
315 int d : (S*)(42) == (S*)(42); // \
316 expected-warning {{not an integral constant expression}} \
317 expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
318 int e : (Str*)(sptr) == (Str*)(sptr); // \
319 expected-warning {{not an integral constant expression}} \
320 expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
321 int f : &(U&)(*sptr) == &(U&)(*sptr); // \
322 expected-warning {{not an integral constant expression}} \
323 expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
324 int g : (S*)(void*)(sptr) == sptr; // \
325 expected-warning {{not an integral constant expression}} \
326 expected-note {{cast from 'void *' is not allowed in a constant expression}}
327 };
328
329 extern char externalvar[];
330 constexpr bool constaddress = (void *)externalvar == (void *)0x4000UL; // expected-error {{must be initialized by a constant expression}}
331 constexpr bool litaddress = "foo" == "foo"; // expected-error {{must be initialized by a constant expression}} expected-warning {{unspecified}}
332 static_assert(0 != "foo", "");
333
334 }
335
336 namespace MaterializeTemporary {
337
f(const int & r)338 constexpr int f(const int &r) { return r; }
339 constexpr int n = f(1);
340
same(const int & a,const int & b)341 constexpr bool same(const int &a, const int &b) { return &a == &b; }
sameTemporary(const int & n)342 constexpr bool sameTemporary(const int &n) { return same(n, n); }
343
344 static_assert(n, "");
345 static_assert(!same(4, 4), "");
346 static_assert(same(n, n), "");
347 static_assert(sameTemporary(9), "");
348
349 struct A { int &&r; };
350 struct B { A &&a1; A &&a2; };
351
352 constexpr B b1 { { 1 }, { 2 } }; // expected-note {{temporary created here}}
353 static_assert(&b1.a1 != &b1.a2, "");
354 static_assert(&b1.a1.r != &b1.a2.r, ""); // expected-error {{constant expression}} expected-note {{outside the expression that created the temporary}}
355
356 constexpr B &&b2 { { 3 }, { 4 } }; // expected-note {{temporary created here}}
357 static_assert(&b1 != &b2, "");
358 static_assert(&b1.a1 != &b2.a1, ""); // expected-error {{constant expression}} expected-note {{outside the expression that created the temporary}}
359
360 constexpr thread_local B b3 { { 1 }, { 2 } }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}}
foo()361 void foo() {
362 constexpr static B b1 { { 1 }, { 2 } }; // ok
363 constexpr thread_local B b2 { { 1 }, { 2 } }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}}
364 constexpr B b3 { { 1 }, { 2 } }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}}
365 }
366
367 constexpr B &&b4 = ((1, 2), 3, 4, B { {10}, {{20}} }); // expected-warning 4{{unused}}
368 static_assert(&b4 != &b2, "");
369
370 // Proposed DR: copy-elision doesn't trigger lifetime extension.
371 constexpr B b5 = B{ {0}, {0} }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}}
372
373 namespace NestedNonStatic {
374 // Proposed DR: for a reference constant expression to refer to a static
375 // storage duration temporary, that temporary must itself be initialized
376 // by a constant expression (a core constant expression is not enough).
377 struct A { int &&r; };
378 struct B { A &&a; };
379 constexpr B a = { A{0} }; // ok
380 constexpr B b = { A(A{0}) }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}}
381 }
382
383 namespace FakeInitList {
384 struct init_list_3_ints { const int (&x)[3]; };
385 struct init_list_2_init_list_3_ints { const init_list_3_ints (&x)[2]; };
386 constexpr init_list_2_init_list_3_ints ils = { { { { 1, 2, 3 } }, { { 4, 5, 6 } } } };
387 }
388
389 }
390
strcmp_ce(const char * p,const char * q)391 constexpr int strcmp_ce(const char *p, const char *q) {
392 return (!*p || *p != *q) ? *p - *q : strcmp_ce(p+1, q+1);
393 }
394
395 namespace StringLiteral {
396
397 template<typename Char>
MangleChars(const Char * p)398 constexpr int MangleChars(const Char *p) {
399 return *p + 3 * (*p ? MangleChars(p+1) : 0);
400 }
401
402 static_assert(MangleChars("constexpr!") == 1768383, "");
403 static_assert(MangleChars(u8"constexpr!") == 1768383, "");
404 static_assert(MangleChars(L"constexpr!") == 1768383, "");
405 static_assert(MangleChars(u"constexpr!") == 1768383, "");
406 static_assert(MangleChars(U"constexpr!") == 1768383, "");
407
408 constexpr char c0 = "nought index"[0];
409 constexpr char c1 = "nice index"[10];
410 constexpr char c2 = "nasty index"[12]; // expected-error {{must be initialized by a constant expression}} expected-warning {{is past the end}} expected-note {{read of dereferenced one-past-the-end pointer}}
411 constexpr char c3 = "negative index"[-1]; // expected-error {{must be initialized by a constant expression}} expected-warning {{is before the beginning}} expected-note {{cannot refer to element -1 of array of 15 elements}}
412 constexpr char c4 = ((char*)(int*)"no reinterpret_casts allowed")[14]; // expected-error {{must be initialized by a constant expression}} expected-note {{cast that performs the conversions of a reinterpret_cast}}
413
414 constexpr const char *p = "test" + 2;
415 static_assert(*p == 's', "");
416
max_iter(const char * a,const char * b)417 constexpr const char *max_iter(const char *a, const char *b) {
418 return *a < *b ? b : a;
419 }
max_element(const char * a,const char * b)420 constexpr const char *max_element(const char *a, const char *b) {
421 return (a+1 >= b) ? a : max_iter(a, max_element(a+1, b));
422 }
423
424 constexpr char str[] = "the quick brown fox jumped over the lazy dog";
425 constexpr const char *max = max_element(begin(str), end(str));
426 static_assert(*max == 'z', "");
427 static_assert(max == str + 38, "");
428
429 static_assert(strcmp_ce("hello world", "hello world") == 0, "");
430 static_assert(strcmp_ce("hello world", "hello clang") > 0, "");
431 static_assert(strcmp_ce("constexpr", "test") < 0, "");
432 static_assert(strcmp_ce("", " ") < 0, "");
433
434 struct S {
435 int n : "foo"[4]; // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer is not allowed in a constant expression}}
436 };
437
438 struct T {
439 char c[6];
TStringLiteral::T440 constexpr T() : c{"foo"} {}
441 };
442 constexpr T t;
443
444 static_assert(t.c[0] == 'f', "");
445 static_assert(t.c[1] == 'o', "");
446 static_assert(t.c[2] == 'o', "");
447 static_assert(t.c[3] == 0, "");
448 static_assert(t.c[4] == 0, "");
449 static_assert(t.c[5] == 0, "");
450 static_assert(t.c[6] == 0, ""); // expected-error {{constant expression}} expected-note {{one-past-the-end}}
451
452 struct U {
453 wchar_t chars[6];
454 int n;
455 } constexpr u = { { L"test" }, 0 };
456 static_assert(u.chars[2] == L's', "");
457
458 struct V {
459 char c[4];
VStringLiteral::V460 constexpr V() : c("hi!") {}
461 };
462 static_assert(V().c[1] == "i"[0], "");
463
464 namespace Parens {
465 constexpr unsigned char a[] = ("foo"), b[] = {"foo"}, c[] = {("foo")},
466 d[4] = ("foo"), e[5] = {"foo"}, f[6] = {("foo")};
467 static_assert(a[0] == 'f', "");
468 static_assert(b[1] == 'o', "");
469 static_assert(c[2] == 'o', "");
470 static_assert(d[0] == 'f', "");
471 static_assert(e[1] == 'o', "");
472 static_assert(f[2] == 'o', "");
473 static_assert(f[5] == 0, "");
474 static_assert(f[6] == 0, ""); // expected-error {{constant expression}} expected-note {{one-past-the-end}}
475 }
476
477 }
478
479 namespace Array {
480
481 template<typename Iter>
Sum(Iter begin,Iter end)482 constexpr auto Sum(Iter begin, Iter end) -> decltype(+*begin) {
483 return begin == end ? 0 : *begin + Sum(begin+1, end);
484 }
485
486 constexpr int xs[] = { 1, 2, 3, 4, 5 };
487 constexpr int ys[] = { 5, 4, 3, 2, 1 };
488 constexpr int sum_xs = Sum(begin(xs), end(xs));
489 static_assert(sum_xs == 15, "");
490
ZipFoldR(int (* F)(int x,int y,int c),int n,const int * xs,const int * ys,int c)491 constexpr int ZipFoldR(int (*F)(int x, int y, int c), int n,
492 const int *xs, const int *ys, int c) {
493 return n ? F(
494 *xs, // expected-note {{read of dereferenced one-past-the-end pointer}}
495 *ys,
496 ZipFoldR(F, n-1, xs+1, ys+1, c)) // \
497 expected-note {{in call to 'ZipFoldR(&SubMul, 2, &xs[4], &ys[4], 1)'}} \
498 expected-note {{in call to 'ZipFoldR(&SubMul, 1, &xs[5], &ys[5], 1)'}}
499 : c;
500 }
MulAdd(int x,int y,int c)501 constexpr int MulAdd(int x, int y, int c) { return x * y + c; }
502 constexpr int InnerProduct = ZipFoldR(MulAdd, 5, xs, ys, 0);
503 static_assert(InnerProduct == 35, "");
504
SubMul(int x,int y,int c)505 constexpr int SubMul(int x, int y, int c) { return (x - y) * c; }
506 constexpr int DiffProd = ZipFoldR(SubMul, 2, xs+3, ys+3, 1);
507 static_assert(DiffProd == 8, "");
508 static_assert(ZipFoldR(SubMul, 3, xs+3, ys+3, 1), ""); // \
509 expected-error {{constant expression}} \
510 expected-note {{in call to 'ZipFoldR(&SubMul, 3, &xs[3], &ys[3], 1)'}}
511
512 constexpr const int *p = xs + 3;
513 constexpr int xs4 = p[1]; // ok
514 constexpr int xs5 = p[2]; // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
515 constexpr int xs6 = p[3]; // expected-error {{constant expression}} expected-note {{cannot refer to element 6}}
516 constexpr int xs0 = p[-3]; // ok
517 constexpr int xs_1 = p[-4]; // expected-error {{constant expression}} expected-note {{cannot refer to element -1}}
518
519 constexpr int zs[2][2][2][2] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
520 static_assert(zs[0][0][0][0] == 1, "");
521 static_assert(zs[1][1][1][1] == 16, "");
522 static_assert(zs[0][0][0][2] == 3, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
523 static_assert((&zs[0][0][0][2])[-1] == 2, "");
524 static_assert(**(**(zs + 1) + 1) == 11, "");
525 static_assert(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][-1] + 1) == 11, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element -1 of array of 2 elements in a constant expression}}
526 static_assert(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][2] - 2) == 11, "");
527 constexpr int err_zs_1_2_0_0 = zs[1][2][0][0]; // expected-error {{constant expression}} expected-note {{cannot access array element of pointer past the end}}
528
fail(const int & p)529 constexpr int fail(const int &p) {
530 return (&p)[64]; // expected-note {{cannot refer to element 64 of array of 2 elements}}
531 }
532 static_assert(fail(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][2] - 2)) == 11, ""); // \
533 expected-error {{static_assert expression is not an integral constant expression}} \
534 expected-note {{in call to 'fail(zs[1][0][1][0])'}}
535
536 constexpr int arr[40] = { 1, 2, 3, [8] = 4 }; // expected-warning {{C99 feature}}
SumNonzero(const int * p)537 constexpr int SumNonzero(const int *p) {
538 return *p + (*p ? SumNonzero(p+1) : 0);
539 }
CountZero(const int * p,const int * q)540 constexpr int CountZero(const int *p, const int *q) {
541 return p == q ? 0 : (*p == 0) + CountZero(p+1, q);
542 }
543 static_assert(SumNonzero(arr) == 6, "");
544 static_assert(CountZero(arr, arr + 40) == 36, "");
545
546 struct ArrayElem {
ArrayElemArray::ArrayElem547 constexpr ArrayElem() : n(0) {}
548 int n;
fArray::ArrayElem549 constexpr int f() const { return n; }
550 };
551 struct ArrayRVal {
ArrayRValArray::ArrayRVal552 constexpr ArrayRVal() {}
553 ArrayElem elems[10];
554 };
555 static_assert(ArrayRVal().elems[3].f() == 0, "");
556
557 constexpr int selfref[2][2][2] = {
558 selfref[1][1][1] + 1, selfref[0][0][0] + 1,
559 selfref[1][0][1] + 1, selfref[0][1][0] + 1,
560 selfref[1][0][0] + 1, selfref[0][1][1] + 1 };
561 static_assert(selfref[0][0][0] == 1, "");
562 static_assert(selfref[0][0][1] == 2, "");
563 static_assert(selfref[0][1][0] == 1, "");
564 static_assert(selfref[0][1][1] == 2, "");
565 static_assert(selfref[1][0][0] == 1, "");
566 static_assert(selfref[1][0][1] == 3, "");
567 static_assert(selfref[1][1][0] == 0, "");
568 static_assert(selfref[1][1][1] == 0, "");
569
570 struct TrivialDefCtor { int n; };
571 typedef TrivialDefCtor TDCArray[2][2];
572 static_assert(TDCArray{}[1][1].n == 0, "");
573
574 struct NonAggregateTDC : TrivialDefCtor {};
575 typedef NonAggregateTDC NATDCArray[2][2];
576 static_assert(NATDCArray{}[1][1].n == 0, "");
577
578 }
579
580 namespace DependentValues {
581
582 struct I { int n; typedef I V[10]; };
583 I::V x, y;
584 int g();
585 template<bool B, typename T> struct S : T {
586 int k;
fDependentValues::S587 void f() {
588 I::V &cells = B ? x : y;
589 I &i = cells[k];
590 switch (i.n) {}
591
592 // FIXME: We should be able to diagnose this.
593 constexpr int n = g();
594
595 constexpr int m = this->g(); // ok, could be constexpr
596 }
597 };
598
599 }
600
601 namespace Class {
602
AClass::A603 struct A { constexpr A(int a, int b) : k(a + b) {} int k; };
fn(const A & a)604 constexpr int fn(const A &a) { return a.k; }
605 static_assert(fn(A(4,5)) == 9, "");
606
607 struct B { int n; int m; } constexpr b = { 0, b.n };
608 struct C {
CClass::C609 constexpr C(C *this_) : m(42), n(this_->m) {} // ok
610 int m, n;
611 };
612 struct D {
613 C c;
DClass::D614 constexpr D() : c(&c) {}
615 };
616 static_assert(D().c.n == 42, "");
617
618 struct E {
EClass::E619 constexpr E() : p(&p) {}
620 void *p;
621 };
622 constexpr const E &e1 = E();
623 // This is a constant expression if we elide the copy constructor call, and
624 // is not a constant expression if we don't! But we do, so it is.
625 constexpr E e2 = E();
626 static_assert(e2.p == &e2.p, "");
627 constexpr E e3;
628 static_assert(e3.p == &e3.p, "");
629
630 extern const class F f;
631 struct F {
FClass::F632 constexpr F() : p(&f.p) {}
633 const void *p;
634 };
635 constexpr F f;
636
637 struct G {
638 struct T {
TClass::G::T639 constexpr T(T *p) : u1(), u2(p) {}
640 union U1 {
U1()641 constexpr U1() {}
642 int a, b = 42;
643 } u1;
644 union U2 {
U2(T * p)645 constexpr U2(T *p) : c(p->u1.b) {}
646 int c, d;
647 } u2;
648 } t;
GClass::G649 constexpr G() : t(&t) {}
650 } constexpr g;
651
652 static_assert(g.t.u1.a == 42, ""); // expected-error {{constant expression}} expected-note {{read of member 'a' of union with active member 'b'}}
653 static_assert(g.t.u1.b == 42, "");
654 static_assert(g.t.u2.c == 42, "");
655 static_assert(g.t.u2.d == 42, ""); // expected-error {{constant expression}} expected-note {{read of member 'd' of union with active member 'c'}}
656
657 struct S {
658 int a, b;
659 const S *p;
660 double d;
661 const char *q;
662
SClass::S663 constexpr S(int n, const S *p) : a(5), b(n), p(p), d(n), q("hello") {}
664 };
665
666 S global(43, &global);
667
668 static_assert(S(15, &global).b == 15, "");
669
CheckS(const S & s)670 constexpr bool CheckS(const S &s) {
671 return s.a == 5 && s.b == 27 && s.p == &global && s.d == 27. && s.q[3] == 'l';
672 }
673 static_assert(CheckS(S(27, &global)), "");
674
675 struct Arr {
676 char arr[3];
ArrClass::Arr677 constexpr Arr() : arr{'x', 'y', 'z'} {}
678 };
hash(Arr && a)679 constexpr int hash(Arr &&a) {
680 return a.arr[0] + a.arr[1] * 0x100 + a.arr[2] * 0x10000;
681 }
682 constexpr int k = hash(Arr());
683 static_assert(k == 0x007a7978, "");
684
685
686 struct AggregateInit {
687 const char &c;
688 int n;
689 double d;
690 int arr[5];
691 void *p;
692 };
693
694 constexpr AggregateInit agg1 = { "hello"[0] };
695
696 static_assert(strcmp_ce(&agg1.c, "hello") == 0, "");
697 static_assert(agg1.n == 0, "");
698 static_assert(agg1.d == 0.0, "");
699 static_assert(agg1.arr[-1] == 0, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element -1}}
700 static_assert(agg1.arr[0] == 0, "");
701 static_assert(agg1.arr[4] == 0, "");
702 static_assert(agg1.arr[5] == 0, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end}}
703 static_assert(agg1.p == nullptr, "");
704
705 static constexpr const unsigned char uc[] = { "foo" };
706 static_assert(uc[0] == 'f', "");
707 static_assert(uc[3] == 0, "");
708
709 namespace SimpleDerivedClass {
710
711 struct B {
BClass::SimpleDerivedClass::B712 constexpr B(int n) : a(n) {}
713 int a;
714 };
715 struct D : B {
DClass::SimpleDerivedClass::D716 constexpr D(int n) : B(n) {}
717 };
718 constexpr D d(3);
719 static_assert(d.a == 3, "");
720
721 }
722
BottomClass::Bottom723 struct Bottom { constexpr Bottom() {} };
724 struct Base : Bottom {
BaseClass::Base725 constexpr Base(int a = 42, const char *b = "test") : a(a), b(b) {}
726 int a;
727 const char *b;
728 };
729 struct Base2 : Bottom {
Base2Class::Base2730 constexpr Base2(const int &r) : r(r) {}
731 int q = 123;
732 const int &r;
733 };
734 struct Derived : Base, Base2 {
DerivedClass::Derived735 constexpr Derived() : Base(76), Base2(a) {}
736 int c = r + b[1];
737 };
738
operator ==(const Base & a,const Base & b)739 constexpr bool operator==(const Base &a, const Base &b) {
740 return a.a == b.a && strcmp_ce(a.b, b.b) == 0;
741 }
742
743 constexpr Base base;
744 constexpr Base base2(76);
745 constexpr Derived derived;
746 static_assert(derived.a == 76, "");
747 static_assert(derived.b[2] == 's', "");
748 static_assert(derived.c == 76 + 'e', "");
749 static_assert(derived.q == 123, "");
750 static_assert(derived.r == 76, "");
751 static_assert(&derived.r == &derived.a, "");
752
753 static_assert(!(derived == base), "");
754 static_assert(derived == base2, "");
755
756 constexpr Bottom &bot1 = (Base&)derived;
757 constexpr Bottom &bot2 = (Base2&)derived;
758 static_assert(&bot1 != &bot2, "");
759
760 constexpr Bottom *pb1 = (Base*)&derived;
761 constexpr Bottom *pb2 = (Base2*)&derived;
762 static_assert(&pb1 != &pb2, "");
763 static_assert(pb1 == &bot1, "");
764 static_assert(pb2 == &bot2, "");
765
766 constexpr Base2 &fail = (Base2&)bot1; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base2'}}
767 constexpr Base &fail2 = (Base&)*pb2; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base'}}
768 constexpr Base2 &ok2 = (Base2&)bot2;
769 static_assert(&ok2 == &derived, "");
770
771 constexpr Base2 *pfail = (Base2*)pb1; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base2'}}
772 constexpr Base *pfail2 = (Base*)&bot2; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base'}}
773 constexpr Base2 *pok2 = (Base2*)pb2;
774 static_assert(pok2 == &derived, "");
775 static_assert(&ok2 == pok2, "");
776 static_assert((Base2*)(Derived*)(Base*)pb1 == pok2, "");
777 static_assert((Derived*)(Base*)pb1 == (Derived*)pok2, "");
778
779 // Core issue 903: we do not perform constant evaluation when checking for a
780 // null pointer in C++11. Just check for an integer literal with value 0.
781 constexpr Base *nullB = 42 - 6 * 7; // expected-error {{cannot initialize a variable of type 'Class::Base *const' with an rvalue of type 'int'}}
782 constexpr Base *nullB1 = 0;
783 static_assert((Bottom*)nullB == 0, "");
784 static_assert((Derived*)nullB == 0, "");
785 static_assert((void*)(Bottom*)nullB == (void*)(Derived*)nullB, "");
786 Base *nullB2 = '\0'; // expected-error {{cannot initialize a variable of type 'Class::Base *' with an rvalue of type 'char'}}
787 Base *nullB3 = (0);
788 Base *nullB4 = false; // expected-error {{cannot initialize a variable of type 'Class::Base *' with an rvalue of type 'bool'}}
789 Base *nullB5 = ((0ULL));
790 Base *nullB6 = 0.; // expected-error {{cannot initialize a variable of type 'Class::Base *' with an rvalue of type 'double'}}
791 enum Null { kNull };
792 Base *nullB7 = kNull; // expected-error {{cannot initialize a variable of type 'Class::Base *' with an rvalue of type 'Class::Null'}}
793 static_assert(nullB1 == (1 - 1), ""); // expected-error {{comparison between pointer and integer}}
794
795
796
797 namespace ConversionOperators {
798
799 struct T {
TClass::ConversionOperators::T800 constexpr T(int n) : k(5*n - 3) {}
operator intClass::ConversionOperators::T801 constexpr operator int() const { return k; }
802 int k;
803 };
804
805 struct S {
SClass::ConversionOperators::S806 constexpr S(int n) : k(2*n + 1) {}
operator intClass::ConversionOperators::S807 constexpr operator int() const { return k; }
operator TClass::ConversionOperators::S808 constexpr operator T() const { return T(k); }
809 int k;
810 };
811
check(T a,T b)812 constexpr bool check(T a, T b) { return a == b.k; }
813
814 static_assert(S(5) == 11, "");
815 static_assert(check(S(5), 11), "");
816
817 namespace PR14171 {
818
819 struct X {
820 constexpr (operator int)() const { return 0; }
821 };
822 static_assert(X() == 0, "");
823
824 }
825
826 }
827
828 struct This {
fClass::This829 constexpr int f() const { return 0; }
gClass::This830 static constexpr int g() { return 0; }
hClass::This831 void h() {
832 constexpr int x = f(); // expected-error {{must be initialized by a constant}}
833 // expected-note@-1 {{implicit use of 'this' pointer is only allowed within the evaluation of a call to a 'constexpr' member function}}
834 constexpr int y = this->f(); // expected-error {{must be initialized by a constant}}
835 // expected-note-re@-1 {{{{^}}use of 'this' pointer}}
836 constexpr int z = g();
837 static_assert(z == 0, "");
838 }
839 };
840
841 }
842
843 namespace Temporaries {
844
845 struct S {
STemporaries::S846 constexpr S() {}
847 constexpr int f() const;
848 constexpr int g() const;
849 };
850 struct T : S {
TTemporaries::T851 constexpr T(int n) : S(), n(n) {}
852 int n;
853 };
f() const854 constexpr int S::f() const {
855 return static_cast<const T*>(this)->n; // expected-note {{cannot cast}}
856 }
g() const857 constexpr int S::g() const {
858 // FIXME: Better diagnostic for this.
859 return this->*(int(S::*))&T::n; // expected-note {{subexpression}}
860 }
861 // The T temporary is implicitly cast to an S subobject, but we can recover the
862 // T full-object via a base-to-derived cast, or a derived-to-base-casted member
863 // pointer.
864 static_assert(S().f(), ""); // expected-error {{constant expression}} expected-note {{in call to '&Temporaries::S()->f()'}}
865 static_assert(S().g(), ""); // expected-error {{constant expression}} expected-note {{in call to '&Temporaries::S()->g()'}}
866 static_assert(T(3).f() == 3, "");
867 static_assert(T(4).g() == 4, "");
868
f(const S & s)869 constexpr int f(const S &s) {
870 return static_cast<const T&>(s).n;
871 }
872 constexpr int n = f(T(5));
873 static_assert(f(T(5)) == 5, "");
874
b(int n)875 constexpr bool b(int n) { return &n; }
876 static_assert(b(0), "");
877
878 struct NonLiteral {
879 NonLiteral();
880 int f();
881 };
882 constexpr int k = NonLiteral().f(); // expected-error {{constant expression}} expected-note {{non-literal type 'Temporaries::NonLiteral'}}
883
884 }
885
886 namespace Union {
887
888 union U {
889 int a;
890 int b;
891 };
892
893 constexpr U u[4] = { { .a = 0 }, { .b = 1 }, { .a = 2 }, { .b = 3 } }; // expected-warning 4{{C99 feature}}
894 static_assert(u[0].a == 0, "");
895 static_assert(u[0].b, ""); // expected-error {{constant expression}} expected-note {{read of member 'b' of union with active member 'a'}}
896 static_assert(u[1].b == 1, "");
897 static_assert((&u[1].b)[1] == 2, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
898 static_assert(*(&(u[1].b) + 1 + 1) == 3, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element 2 of non-array object}}
899 static_assert((&(u[1]) + 1 + 1)->b == 3, "");
900
901 constexpr U v = {};
902 static_assert(v.a == 0, "");
903
904 union Empty {};
905 constexpr Empty e = {};
906
907 // Make sure we handle trivial copy constructors for unions.
908 constexpr U x = {42};
909 constexpr U y = x;
910 static_assert(y.a == 42, "");
911 static_assert(y.b == 42, ""); // expected-error {{constant expression}} expected-note {{'b' of union with active member 'a'}}
912
913 }
914
915 namespace MemberPointer {
916 struct A {
AMemberPointer::A917 constexpr A(int n) : n(n) {}
918 int n;
fMemberPointer::A919 constexpr int f() const { return n + 3; }
920 };
921 constexpr A a(7);
922 static_assert(A(5).*&A::n == 5, "");
923 static_assert((&a)->*&A::n == 7, "");
924 static_assert((A(8).*&A::f)() == 11, "");
925 static_assert(((&a)->*&A::f)() == 10, "");
926
927 struct B : A {
BMemberPointer::B928 constexpr B(int n, int m) : A(n), m(m) {}
929 int m;
gMemberPointer::B930 constexpr int g() const { return n + m + 1; }
931 };
932 constexpr B b(9, 13);
933 static_assert(B(4, 11).*&A::n == 4, "");
934 static_assert(B(4, 11).*&B::m == 11, "");
935 static_assert(B(4, 11).*(int(A::*))&B::m == 11, "");
936 static_assert((&b)->*&A::n == 9, "");
937 static_assert((&b)->*&B::m == 13, "");
938 static_assert((&b)->*(int(A::*))&B::m == 13, "");
939 static_assert((B(4, 11).*&A::f)() == 7, "");
940 static_assert((B(4, 11).*&B::g)() == 16, "");
941 static_assert((B(4, 11).*(int(A::*)()const)&B::g)() == 16, "");
942 static_assert(((&b)->*&A::f)() == 12, "");
943 static_assert(((&b)->*&B::g)() == 23, "");
944 static_assert(((&b)->*(int(A::*)()const)&B::g)() == 23, "");
945
946 struct S {
SMemberPointer::S947 constexpr S(int m, int n, int (S::*pf)() const, int S::*pn) :
948 m(m), n(n), pf(pf), pn(pn) {}
SMemberPointer::S949 constexpr S() : m(), n(), pf(&S::f), pn(&S::n) {}
950
fMemberPointer::S951 constexpr int f() const { return this->*pn; }
952 virtual int g() const;
953
954 int m, n;
955 int (S::*pf)() const;
956 int S::*pn;
957 };
958
959 constexpr int S::*pm = &S::m;
960 constexpr int S::*pn = &S::n;
961 constexpr int (S::*pf)() const = &S::f;
962 constexpr int (S::*pg)() const = &S::g;
963
964 constexpr S s(2, 5, &S::f, &S::m);
965
966 static_assert((s.*&S::f)() == 2, "");
967 static_assert((s.*s.pf)() == 2, "");
968
969 static_assert(pf == &S::f, "");
970 static_assert(pf == s.*&S::pf, "");
971 static_assert(pm == &S::m, "");
972 static_assert(pm != pn, "");
973 static_assert(s.pn != pn, "");
974 static_assert(s.pn == pm, "");
975 static_assert(pg != nullptr, "");
976 static_assert(pf != nullptr, "");
977 static_assert((int S::*)nullptr == nullptr, "");
978 static_assert(pg == pg, ""); // expected-error {{constant expression}} expected-note {{comparison of pointer to virtual member function 'g' has unspecified value}}
979 static_assert(pf != pg, ""); // expected-error {{constant expression}} expected-note {{comparison of pointer to virtual member function 'g' has unspecified value}}
980
981 template<int n> struct T : T<n-1> {};
982 template<> struct T<0> { int n; };
983 template<> struct T<30> : T<29> { int m; };
984
985 T<17> t17;
986 T<30> t30;
987
988 constexpr int (T<10>::*deepn) = &T<0>::n;
989 static_assert(&(t17.*deepn) == &t17.n, "");
990 static_assert(deepn == &T<2>::n, "");
991
992 constexpr int (T<15>::*deepm) = (int(T<10>::*))&T<30>::m;
993 constexpr int *pbad = &(t17.*deepm); // expected-error {{constant expression}}
994 static_assert(&(t30.*deepm) == &t30.m, "");
995 static_assert(deepm == &T<50>::m, "");
996 static_assert(deepm != deepn, "");
997
998 constexpr T<5> *p17_5 = &t17;
999 constexpr T<13> *p17_13 = (T<13>*)p17_5;
1000 constexpr T<23> *p17_23 = (T<23>*)p17_13; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'T<17>' to type 'T<23>'}}
1001 static_assert(&(p17_5->*(int(T<3>::*))deepn) == &t17.n, "");
1002 static_assert(&(p17_13->*deepn) == &t17.n, "");
1003 constexpr int *pbad2 = &(p17_13->*(int(T<9>::*))deepm); // expected-error {{constant expression}}
1004
1005 constexpr T<5> *p30_5 = &t30;
1006 constexpr T<23> *p30_23 = (T<23>*)p30_5;
1007 constexpr T<13> *p30_13 = p30_23;
1008 static_assert(&(p30_5->*(int(T<3>::*))deepn) == &t30.n, "");
1009 static_assert(&(p30_13->*deepn) == &t30.n, "");
1010 static_assert(&(p30_23->*deepn) == &t30.n, "");
1011 static_assert(&(p30_5->*(int(T<2>::*))deepm) == &t30.m, "");
1012 static_assert(&(((T<17>*)p30_13)->*deepm) == &t30.m, "");
1013 static_assert(&(p30_23->*deepm) == &t30.m, "");
1014
1015 struct Base { int n; };
1016 template<int N> struct Mid : Base {};
1017 struct Derived : Mid<0>, Mid<1> {};
1018 static_assert(&Mid<0>::n == &Mid<1>::n, "");
1019 static_assert((int Derived::*)(int Mid<0>::*)&Mid<0>::n !=
1020 (int Derived::*)(int Mid<1>::*)&Mid<1>::n, "");
1021 static_assert(&Mid<0>::n == (int Mid<0>::*)&Base::n, "");
1022 }
1023
1024 namespace ArrayBaseDerived {
1025
1026 struct Base {
BaseArrayBaseDerived::Base1027 constexpr Base() {}
1028 int n = 0;
1029 };
1030 struct Derived : Base {
DerivedArrayBaseDerived::Derived1031 constexpr Derived() {}
fArrayBaseDerived::Derived1032 constexpr const int *f() const { return &n; }
1033 };
1034
1035 constexpr Derived a[10];
1036 constexpr Derived *pd3 = const_cast<Derived*>(&a[3]);
1037 constexpr Base *pb3 = const_cast<Derived*>(&a[3]);
1038 static_assert(pb3 == pd3, "");
1039
1040 // pb3 does not point to an array element.
1041 constexpr Base *pb4 = pb3 + 1; // ok, one-past-the-end pointer.
1042 constexpr int pb4n = pb4->n; // expected-error {{constant expression}} expected-note {{cannot access field of pointer past the end}}
1043 constexpr Base *err_pb5 = pb3 + 2; // expected-error {{constant expression}} expected-note {{cannot refer to element 2}} expected-note {{here}}
1044 constexpr int err_pb5n = err_pb5->n; // expected-error {{constant expression}} expected-note {{initializer of 'err_pb5' is not a constant expression}}
1045 constexpr Base *err_pb2 = pb3 - 1; // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} expected-note {{here}}
1046 constexpr int err_pb2n = err_pb2->n; // expected-error {{constant expression}} expected-note {{initializer of 'err_pb2'}}
1047 constexpr Base *pb3a = pb4 - 1;
1048
1049 // pb4 does not point to a Derived.
1050 constexpr Derived *err_pd4 = (Derived*)pb4; // expected-error {{constant expression}} expected-note {{cannot access derived class of pointer past the end}}
1051 constexpr Derived *pd3a = (Derived*)pb3a;
1052 constexpr int pd3n = pd3a->n;
1053
1054 // pd3a still points to the Derived array.
1055 constexpr Derived *pd6 = pd3a + 3;
1056 static_assert(pd6 == &a[6], "");
1057 constexpr Derived *pd9 = pd6 + 3;
1058 constexpr Derived *pd10 = pd6 + 4;
1059 constexpr int pd9n = pd9->n; // ok
1060 constexpr int err_pd10n = pd10->n; // expected-error {{constant expression}} expected-note {{cannot access base class of pointer past the end}}
1061 constexpr int pd0n = pd10[-10].n;
1062 constexpr int err_pdminus1n = pd10[-11].n; // expected-error {{constant expression}} expected-note {{cannot refer to element -1 of}}
1063
1064 constexpr Base *pb9 = pd9;
1065 constexpr const int *(Base::*pfb)() const =
1066 static_cast<const int *(Base::*)() const>(&Derived::f);
1067 static_assert((pb9->*pfb)() == &a[9].n, "");
1068 }
1069
1070 namespace Complex {
1071
1072 class complex {
1073 int re, im;
1074 public:
complex(int re=0,int im=0)1075 constexpr complex(int re = 0, int im = 0) : re(re), im(im) {}
complex(const complex & o)1076 constexpr complex(const complex &o) : re(o.re), im(o.im) {}
operator -() const1077 constexpr complex operator-() const { return complex(-re, -im); }
operator +(const complex & l,const complex & r)1078 friend constexpr complex operator+(const complex &l, const complex &r) {
1079 return complex(l.re + r.re, l.im + r.im);
1080 }
operator -(const complex & l,const complex & r)1081 friend constexpr complex operator-(const complex &l, const complex &r) {
1082 return l + -r;
1083 }
operator *(const complex & l,const complex & r)1084 friend constexpr complex operator*(const complex &l, const complex &r) {
1085 return complex(l.re * r.re - l.im * r.im, l.re * r.im + l.im * r.re);
1086 }
operator ==(const complex & l,const complex & r)1087 friend constexpr bool operator==(const complex &l, const complex &r) {
1088 return l.re == r.re && l.im == r.im;
1089 }
operator !=(const complex & r) const1090 constexpr bool operator!=(const complex &r) const {
1091 return re != r.re || im != r.im;
1092 }
real() const1093 constexpr int real() const { return re; }
imag() const1094 constexpr int imag() const { return im; }
1095 };
1096
1097 constexpr complex i = complex(0, 1);
1098 constexpr complex k = (3 + 4*i) * (6 - 4*i);
1099 static_assert(complex(1,0).real() == 1, "");
1100 static_assert(complex(1,0).imag() == 0, "");
1101 static_assert(((complex)1).imag() == 0, "");
1102 static_assert(k.real() == 34, "");
1103 static_assert(k.imag() == 12, "");
1104 static_assert(k - 34 == 12*i, "");
1105 static_assert((complex)1 == complex(1), "");
1106 static_assert((complex)1 != complex(0, 1), "");
1107 static_assert(complex(1) == complex(1), "");
1108 static_assert(complex(1) != complex(0, 1), "");
makeComplex(int re,int im)1109 constexpr complex makeComplex(int re, int im) { return complex(re, im); }
1110 static_assert(makeComplex(1,0) == complex(1), "");
1111 static_assert(makeComplex(1,0) != complex(0, 1), "");
1112
1113 class complex_wrap : public complex {
1114 public:
complex_wrap(int re,int im=0)1115 constexpr complex_wrap(int re, int im = 0) : complex(re, im) {}
complex_wrap(const complex_wrap & o)1116 constexpr complex_wrap(const complex_wrap &o) : complex(o) {}
1117 };
1118
1119 static_assert((complex_wrap)1 == complex(1), "");
1120 static_assert((complex)1 != complex_wrap(0, 1), "");
1121 static_assert(complex(1) == complex_wrap(1), "");
1122 static_assert(complex_wrap(1) != complex(0, 1), "");
makeComplexWrap(int re,int im)1123 constexpr complex_wrap makeComplexWrap(int re, int im) {
1124 return complex_wrap(re, im);
1125 }
1126 static_assert(makeComplexWrap(1,0) == complex(1), "");
1127 static_assert(makeComplexWrap(1,0) != complex(0, 1), "");
1128
1129 }
1130
1131 namespace PR11595 {
operator ==PR11595::A1132 struct A { constexpr bool operator==(int x) const { return true; } };
1133 struct B { B(); A& x; };
1134 static_assert(B().x == 3, ""); // expected-error {{constant expression}} expected-note {{non-literal type 'PR11595::B' cannot be used in a constant expression}}
1135
f(int k)1136 constexpr bool f(int k) { // expected-error {{constexpr function never produces a constant expression}}
1137 return B().x == k; // expected-note {{non-literal type 'PR11595::B' cannot be used in a constant expression}}
1138 }
1139 }
1140
1141 namespace ExprWithCleanups {
1142 struct A { A(); ~A(); int get(); };
get(bool FromA)1143 constexpr int get(bool FromA) { return FromA ? A().get() : 1; }
1144 constexpr int n = get(false);
1145 }
1146
1147 namespace Volatile {
1148
1149 volatile constexpr int n1 = 0; // expected-note {{here}}
1150 volatile const int n2 = 0; // expected-note {{here}}
1151 int n3 = 37; // expected-note {{declared here}}
1152
1153 constexpr int m1 = n1; // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}}
1154 constexpr int m2 = n2; // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}}
1155 constexpr int m1b = const_cast<const int&>(n1); // expected-error {{constant expression}} expected-note {{read of volatile object 'n1'}}
1156 constexpr int m2b = const_cast<const int&>(n2); // expected-error {{constant expression}} expected-note {{read of volatile object 'n2'}}
1157
1158 struct T { int n; };
1159 const T t = { 42 }; // expected-note {{declared here}}
1160
f(volatile int && r)1161 constexpr int f(volatile int &&r) {
1162 return r; // expected-note {{read of volatile-qualified type 'volatile int'}}
1163 }
g(volatile int && r)1164 constexpr int g(volatile int &&r) {
1165 return const_cast<int&>(r); // expected-note {{read of volatile temporary is not allowed in a constant expression}}
1166 }
1167 struct S {
1168 int j : f(0); // expected-error {{constant expression}} expected-note {{in call to 'f(0)'}}
1169 int k : g(0); // expected-error {{constant expression}} expected-note {{temporary created here}} expected-note {{in call to 'g(0)'}}
1170 int l : n3; // expected-error {{constant expression}} expected-note {{read of non-const variable}}
1171 int m : t.n; // expected-error {{constant expression}} expected-note {{read of non-constexpr variable}}
1172 };
1173
1174 }
1175
1176 namespace ExternConstexpr {
1177 extern constexpr int n = 0;
1178 extern constexpr int m; // expected-error {{constexpr variable declaration must be a definition}}
f()1179 void f() {
1180 extern constexpr int i; // expected-error {{constexpr variable declaration must be a definition}}
1181 constexpr int j = 0;
1182 constexpr int k; // expected-error {{default initialization of an object of const type}} expected-note{{add an explicit initializer to initialize 'k'}}
1183 }
1184 }
1185
1186 namespace ComplexConstexpr {
1187 constexpr _Complex float test1 = {};
1188 constexpr _Complex float test2 = {1};
1189 constexpr _Complex double test3 = {1,2};
1190 constexpr _Complex int test4 = {4};
1191 constexpr _Complex int test5 = 4;
1192 constexpr _Complex int test6 = {5,6};
1193 typedef _Complex float fcomplex;
1194 constexpr fcomplex test7 = fcomplex();
1195
1196 constexpr const double &t2r = __real test3;
1197 constexpr const double &t2i = __imag test3;
1198 static_assert(&t2r + 1 == &t2i, "");
1199 static_assert(t2r == 1.0, "");
1200 static_assert(t2i == 2.0, "");
1201 constexpr const double *t2p = &t2r;
1202 static_assert(t2p[-1] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element -1 of array of 2 elements}}
1203 static_assert(t2p[0] == 1.0, "");
1204 static_assert(t2p[1] == 2.0, "");
1205 static_assert(t2p[2] == 0.0, ""); // expected-error {{constant expr}} expected-note {{one-past-the-end pointer}}
1206 static_assert(t2p[3] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element 3 of array of 2 elements}}
1207 constexpr _Complex float *p = 0;
1208 constexpr float pr = __real *p; // expected-error {{constant expr}} expected-note {{cannot access real component of null}}
1209 constexpr float pi = __imag *p; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of null}}
1210 constexpr const _Complex double *q = &test3 + 1;
1211 constexpr double qr = __real *q; // expected-error {{constant expr}} expected-note {{cannot access real component of pointer past the end}}
1212 constexpr double qi = __imag *q; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of pointer past the end}}
1213
1214 static_assert(__real test6 == 5, "");
1215 static_assert(__imag test6 == 6, "");
1216 static_assert(&__imag test6 == &__real test6 + 1, "");
1217 }
1218
1219 // _Atomic(T) is exactly like T for the purposes of constant expression
1220 // evaluation..
1221 namespace Atomic {
1222 constexpr _Atomic int n = 3;
1223
1224 struct S { _Atomic(double) d; };
1225 constexpr S s = { 0.5 };
1226 constexpr double d1 = s.d;
1227 constexpr double d2 = n;
1228 constexpr _Atomic double d3 = n;
1229
1230 constexpr _Atomic(int) n2 = d3;
1231 static_assert(d1 == 0.5, "");
1232 static_assert(d3 == 3.0, "");
1233
1234 namespace PR16056 {
1235 struct TestVar {
1236 _Atomic(int) value;
TestVarAtomic::PR16056::TestVar1237 constexpr TestVar(int value) : value(value) {}
1238 };
1239 constexpr TestVar testVar{-1};
1240 static_assert(testVar.value == -1, "");
1241 }
1242 }
1243
1244 namespace InstantiateCaseStmt {
f()1245 template<int x> constexpr int f() { return x; }
g(int c)1246 template<int x> int g(int c) { switch(c) { case f<x>(): return 1; } return 0; }
gg(int c)1247 int gg(int c) { return g<4>(c); }
1248 }
1249
1250 namespace ConvertedConstantExpr {
1251 extern int &m;
1252 extern int &n;
1253
1254 constexpr int k = 4;
1255 int &m = const_cast<int&>(k);
1256
1257 // If we have nothing more interesting to say, ensure we don't produce a
1258 // useless note and instead just point to the non-constant subexpression.
1259 enum class E {
1260 em = m,
1261 en = n, // expected-error {{not a constant expression}}
1262 eo = (m +
1263 n // expected-error {{not a constant expression}}
1264 ),
1265 eq = reinterpret_cast<int>((int*)0) // expected-error {{not a constant expression}} expected-note {{reinterpret_cast}}
1266 };
1267 }
1268
1269 namespace IndirectField {
1270 struct S {
1271 struct { // expected-warning {{GNU extension}}
1272 union { // expected-warning {{declared in an anonymous struct}}
1273 struct { // expected-warning {{GNU extension}} expected-warning {{declared in an anonymous union}}
1274 int a;
1275 int b;
1276 };
1277 int c;
1278 };
1279 int d;
1280 };
1281 union {
1282 int e;
1283 int f;
1284 };
SIndirectField::S1285 constexpr S(int a, int b, int d, int e) : a(a), b(b), d(d), e(e) {}
SIndirectField::S1286 constexpr S(int c, int d, int f) : c(c), d(d), f(f) {}
1287 };
1288
1289 constexpr S s1(1, 2, 3, 4);
1290 constexpr S s2(5, 6, 7);
1291
1292 // FIXME: The diagnostics here do a very poor job of explaining which unnamed
1293 // member is active and which is requested.
1294 static_assert(s1.a == 1, "");
1295 static_assert(s1.b == 2, "");
1296 static_assert(s1.c == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1297 static_assert(s1.d == 3, "");
1298 static_assert(s1.e == 4, "");
1299 static_assert(s1.f == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1300
1301 static_assert(s2.a == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1302 static_assert(s2.b == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1303 static_assert(s2.c == 5, "");
1304 static_assert(s2.d == 6, "");
1305 static_assert(s2.e == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1306 static_assert(s2.f == 7, "");
1307 }
1308
1309 // DR1405: don't allow reading mutable members in constant expressions.
1310 namespace MutableMembers {
1311 struct MM {
1312 mutable int n; // expected-note 3{{declared here}}
1313 } constexpr mm = { 4 };
1314 constexpr int mmn = mm.n; // expected-error {{constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}}
1315 int x = (mm.n = 1, 3);
1316 constexpr int mmn2 = mm.n; // expected-error {{constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}}
1317
1318 // Here's one reason why allowing this would be a disaster...
1319 template<int n> struct Id { int k = n; };
f()1320 int f() {
1321 constexpr MM m = { 0 };
1322 ++m.n;
1323 return Id<m.n>().k; // expected-error {{not a constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}}
1324 }
1325
1326 struct A { int n; };
1327 struct B { mutable A a; }; // expected-note {{here}}
1328 struct C { B b; };
1329 constexpr C c[3] = {};
1330 constexpr int k = c[1].b.a.n; // expected-error {{constant expression}} expected-note {{mutable}}
1331
1332 struct D { int x; mutable int y; }; // expected-note {{here}}
1333 constexpr D d1 = { 1, 2 };
1334 int l = ++d1.y;
1335 constexpr D d2 = d1; // expected-error {{constant}} expected-note {{mutable}} expected-note {{in call}}
1336
1337 struct E {
1338 union {
1339 int a;
1340 mutable int b; // expected-note {{here}}
1341 };
1342 };
1343 constexpr E e1 = {{1}};
1344 constexpr E e2 = e1; // expected-error {{constant}} expected-note {{mutable}} expected-note {{in call}}
1345
1346 struct F {
1347 union U { };
1348 mutable U u;
1349 struct X { };
1350 mutable X x;
1351 struct Y : X { X x; U u; };
1352 mutable Y y;
1353 int n;
1354 };
1355 // This is OK; we don't actually read any mutable state here.
1356 constexpr F f1 = {};
1357 constexpr F f2 = f1;
1358
1359 struct G {
1360 struct X {};
1361 union U { X a; };
1362 mutable U u; // expected-note {{here}}
1363 };
1364 constexpr G g1 = {};
1365 constexpr G g2 = g1; // expected-error {{constant}} expected-note {{mutable}} expected-note {{in call}}
1366 constexpr G::U gu1 = {};
1367 constexpr G::U gu2 = gu1;
1368
1369 union H {
1370 mutable G::X gx; // expected-note {{here}}
1371 };
1372 constexpr H h1 = {};
1373 constexpr H h2 = h1; // expected-error {{constant}} expected-note {{mutable}} expected-note {{in call}}
1374 }
1375
1376 namespace Fold {
1377
1378 // This macro forces its argument to be constant-folded, even if it's not
1379 // otherwise a constant expression.
1380 #define fold(x) (__builtin_constant_p(x) ? (x) : (x))
1381
1382 constexpr int n = (int)(char*)123; // expected-error {{constant expression}} expected-note {{reinterpret_cast}}
1383 constexpr int m = fold((int)(char*)123); // ok
1384 static_assert(m == 123, "");
1385
1386 #undef fold
1387
1388 }
1389
1390 namespace DR1454 {
1391
f(const int & n)1392 constexpr const int &f(const int &n) { return n; }
1393 constexpr int k1 = f(0); // ok
1394
1395 struct Wrap {
1396 const int &value;
1397 };
g(const Wrap & w)1398 constexpr const Wrap &g(const Wrap &w) { return w; }
1399 constexpr int k2 = g({0}).value; // ok
1400
1401 // The temporary here has static storage duration, so we can bind a constexpr
1402 // reference to it.
1403 constexpr const int &i = 1;
1404 constexpr const int j = i;
1405 static_assert(j == 1, "");
1406
1407 // The temporary here is not const, so it can't be read outside the expression
1408 // in which it was created (per the C++14 rules, which we use to avoid a C++11
1409 // defect).
1410 constexpr int &&k = 1; // expected-note {{temporary created here}}
1411 constexpr const int l = k; // expected-error {{constant expression}} expected-note {{read of temporary}}
1412
f()1413 void f() {
1414 // The temporary here has automatic storage duration, so we can't bind a
1415 // constexpr reference to it.
1416 constexpr const int &i = 1; // expected-error {{constant expression}} expected-note 2{{temporary}}
1417 }
1418
1419 }
1420
1421 namespace RecursiveOpaqueExpr {
1422 template<typename Iter>
LastNonzero(Iter p,Iter q)1423 constexpr auto LastNonzero(Iter p, Iter q) -> decltype(+*p) {
1424 return p != q ? (LastNonzero(p+1, q) ?: *p) : 0; // expected-warning {{GNU}}
1425 }
1426
1427 constexpr int arr1[] = { 1, 0, 0, 3, 0, 2, 0, 4, 0, 0 };
1428 static_assert(LastNonzero(begin(arr1), end(arr1)) == 4, "");
1429
1430 constexpr int arr2[] = { 1, 0, 0, 3, 0, 2, 0, 4, 0, 5 };
1431 static_assert(LastNonzero(begin(arr2), end(arr2)) == 5, "");
1432
1433 constexpr int arr3[] = {
1434 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
1435 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
1436 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
1437 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
1438 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
1439 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
1440 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
1441 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1442 static_assert(LastNonzero(begin(arr3), end(arr3)) == 2, "");
1443 }
1444
1445 namespace VLASizeof {
1446
f(int k)1447 void f(int k) {
1448 int arr[k]; // expected-warning {{C99}}
1449 constexpr int n = 1 +
1450 sizeof(arr) // expected-error {{constant expression}}
1451 * 3;
1452 }
1453 }
1454
1455 namespace CompoundLiteral {
1456 // FIXME:
1457 // We don't model the semantics of this correctly: the compound literal is
1458 // represented as a prvalue in the AST, but actually behaves like an lvalue.
1459 // We treat the compound literal as a temporary and refuse to produce a
1460 // pointer to it. This is OK: we're not required to treat this as a constant
1461 // in C++, and in C we model compound literals as lvalues.
1462 constexpr int *p = (int*)(int[1]){0}; // expected-warning {{C99}} expected-error {{constant expression}} expected-note 2{{temporary}}
1463 }
1464
1465 namespace Vector {
1466 typedef int __attribute__((vector_size(16))) VI4;
f(int n)1467 constexpr VI4 f(int n) {
1468 return VI4 { n * 3, n + 4, n - 5, n / 6 };
1469 }
1470 constexpr auto v1 = f(10);
1471
1472 typedef double __attribute__((vector_size(32))) VD4;
g(int n)1473 constexpr VD4 g(int n) {
1474 return (VD4) { n / 2.0, n + 1.5, n - 5.4, n * 0.9 }; // expected-warning {{C99}}
1475 }
1476 constexpr auto v2 = g(4);
1477 }
1478
1479 // PR12626, redux
1480 namespace InvalidClasses {
test0()1481 void test0() {
1482 struct X; // expected-note {{forward declaration}}
1483 struct Y { bool b; X x; }; // expected-error {{field has incomplete type}}
1484 Y y;
1485 auto& b = y.b;
1486 }
1487 }
1488
1489 namespace NamespaceAlias {
f()1490 constexpr int f() {
1491 namespace NS = NamespaceAlias; // expected-warning {{use of this statement in a constexpr function is a C++14 extension}}
1492 return &NS::f != nullptr;
1493 }
1494 }
1495
1496 // Constructors can be implicitly constexpr, even for a non-literal type.
1497 namespace ImplicitConstexpr {
1498 struct Q { Q() = default; Q(const Q&) = default; Q(Q&&) = default; ~Q(); }; // expected-note 3{{here}}
1499 struct R { constexpr R() noexcept; constexpr R(const R&) noexcept; constexpr R(R&&) noexcept; ~R() noexcept; };
1500 struct S { R r; }; // expected-note 3{{here}}
1501 struct T { T(const T&) noexcept; T(T &&) noexcept; ~T() noexcept; };
1502 struct U { T t; }; // expected-note 3{{here}}
1503 static_assert(!__is_literal_type(Q), "");
1504 static_assert(!__is_literal_type(R), "");
1505 static_assert(!__is_literal_type(S), "");
1506 static_assert(!__is_literal_type(T), "");
1507 static_assert(!__is_literal_type(U), "");
1508 struct Test {
1509 friend Q::Q() noexcept; // expected-error {{follows constexpr}}
1510 friend Q::Q(Q&&) noexcept; // expected-error {{follows constexpr}}
1511 friend Q::Q(const Q&) noexcept; // expected-error {{follows constexpr}}
1512 friend S::S() noexcept; // expected-error {{follows constexpr}}
1513 friend S::S(S&&) noexcept; // expected-error {{follows constexpr}}
1514 friend S::S(const S&) noexcept; // expected-error {{follows constexpr}}
1515 friend constexpr U::U() noexcept; // expected-error {{follows non-constexpr}}
1516 friend constexpr U::U(U&&) noexcept; // expected-error {{follows non-constexpr}}
1517 friend constexpr U::U(const U&) noexcept; // expected-error {{follows non-constexpr}}
1518 };
1519 }
1520
1521 // Indirectly test that an implicit lvalue to xvalue conversion performed for
1522 // an NRVO move operation isn't implemented as CK_LValueToRValue.
1523 namespace PR12826 {
1524 struct Foo {};
id(Foo x)1525 constexpr Foo id(Foo x) { return x; }
1526 constexpr Foo res(id(Foo()));
1527 }
1528
1529 namespace PR13273 {
1530 struct U {
1531 int t;
1532 U() = default;
1533 };
1534
1535 struct S : U {
1536 S() = default;
1537 };
1538
1539 // S's default constructor isn't constexpr, because U's default constructor
1540 // doesn't initialize 't', but it's trivial, so value-initialization doesn't
1541 // actually call it.
1542 static_assert(S{}.t == 0, "");
1543 }
1544
1545 namespace PR12670 {
1546 struct S {
SPR12670::S1547 constexpr S(int a0) : m(a0) {}
SPR12670::S1548 constexpr S() : m(6) {}
1549 int m;
1550 };
1551 constexpr S x[3] = { {4}, 5 };
1552 static_assert(x[0].m == 4, "");
1553 static_assert(x[1].m == 5, "");
1554 static_assert(x[2].m == 6, "");
1555 }
1556
1557 // Indirectly test that an implicit lvalue-to-rvalue conversion is performed
1558 // when a conditional operator has one argument of type void and where the other
1559 // is a glvalue of class type.
1560 namespace ConditionalLValToRVal {
1561 struct A {
AConditionalLValToRVal::A1562 constexpr A(int a) : v(a) {}
1563 int v;
1564 };
1565
f(const A & a)1566 constexpr A f(const A &a) {
1567 return a.v == 0 ? throw a : a;
1568 }
1569
1570 constexpr A a(4);
1571 static_assert(f(a).v == 4, "");
1572 }
1573
1574 namespace TLS {
1575 __thread int n;
1576 int m;
1577
1578 constexpr bool b = &n == &n;
1579
1580 constexpr int *p = &n; // expected-error{{constexpr variable 'p' must be initialized by a constant expression}}
1581
f()1582 constexpr int *f() { return &n; }
1583 constexpr int *q = f(); // expected-error{{constexpr variable 'q' must be initialized by a constant expression}}
1584 constexpr bool c = f() == f();
1585
g()1586 constexpr int *g() { return &m; }
1587 constexpr int *r = g();
1588 }
1589
1590 namespace Void {
f()1591 constexpr void f() { return; } // expected-error{{constexpr function's return type 'void' is not a literal type}}
1592
1593 void assert_failed(const char *msg, const char *file, int line); // expected-note {{declared here}}
1594 #define ASSERT(expr) ((expr) ? static_cast<void>(0) : assert_failed(#expr, __FILE__, __LINE__))
1595 template<typename T, size_t S>
get(T (& a)[S],size_t k)1596 constexpr T get(T (&a)[S], size_t k) {
1597 return ASSERT(k > 0 && k < S), a[k]; // expected-note{{non-constexpr function 'assert_failed'}}
1598 }
1599 #undef ASSERT
1600 template int get(int (&a)[4], size_t);
1601 constexpr int arr[] = { 4, 1, 2, 3, 4 };
1602 static_assert(get(arr, 1) == 1, "");
1603 static_assert(get(arr, 4) == 4, "");
1604 static_assert(get(arr, 0) == 4, ""); // expected-error{{not an integral constant expression}} \
1605 // expected-note{{in call to 'get(arr, 0)'}}
1606 }
1607
1608 namespace std { struct type_info; }
1609
1610 namespace TypeId {
1611 struct A { virtual ~A(); };
1612 A f();
1613 A &g();
1614 constexpr auto &x = typeid(f());
1615 constexpr auto &y = typeid(g()); // expected-error{{constant expression}} \
1616 // expected-note{{typeid applied to expression of polymorphic type 'TypeId::A' is not allowed in a constant expression}} \
1617 // expected-warning {{expression with side effects will be evaluated despite being used as an operand to 'typeid'}}
1618 }
1619
1620 namespace PR14203 {
1621 struct duration {
durationPR14203::duration1622 constexpr duration() {}
operator intPR14203::duration1623 constexpr operator int() const { return 0; }
1624 };
f()1625 template<typename T> void f() {
1626 // If we want to evaluate this at the point of the template definition, we
1627 // need to trigger the implicit definition of the move constructor at that
1628 // point.
1629 // FIXME: C++ does not permit us to implicitly define it at the appropriate
1630 // times, since it is only allowed to be implicitly defined when it is
1631 // odr-used.
1632 constexpr duration d = duration();
1633 }
1634 // FIXME: It's unclear whether this is valid. On the one hand, we're not
1635 // allowed to generate a move constructor. On the other hand, if we did,
1636 // this would be a constant expression. For now, we generate a move
1637 // constructor here.
1638 int n = sizeof(short{duration(duration())});
1639 }
1640
1641 namespace ArrayEltInit {
1642 struct A {
AArrayEltInit::A1643 constexpr A() : p(&p) {}
1644 void *p;
1645 };
1646 constexpr A a[10];
1647 static_assert(a[0].p == &a[0].p, "");
1648 static_assert(a[9].p == &a[9].p, "");
1649 static_assert(a[0].p != &a[9].p, "");
1650 static_assert(a[9].p != &a[0].p, "");
1651
1652 constexpr A b[10] = {};
1653 static_assert(b[0].p == &b[0].p, "");
1654 static_assert(b[9].p == &b[9].p, "");
1655 static_assert(b[0].p != &b[9].p, "");
1656 static_assert(b[9].p != &b[0].p, "");
1657 }
1658
1659 namespace PR15884 {
1660 struct S {};
f()1661 constexpr S f() { return {}; }
1662 constexpr S *p = &f();
1663 // expected-error@-1 {{taking the address of a temporary}}
1664 // expected-error@-2 {{constexpr variable 'p' must be initialized by a constant expression}}
1665 // expected-note@-3 {{pointer to temporary is not a constant expression}}
1666 // expected-note@-4 {{temporary created here}}
1667 }
1668
1669 namespace AfterError {
1670 // FIXME: Suppress the 'no return statements' diagnostic if the body is invalid.
error()1671 constexpr int error() { // expected-error {{no return statement}}
1672 return foobar; // expected-error {{undeclared identifier}}
1673 }
1674 constexpr int k = error(); // expected-error {{must be initialized by a constant expression}}
1675 }
1676
1677 namespace std {
1678 typedef decltype(sizeof(int)) size_t;
1679
1680 template <class _E>
1681 class initializer_list
1682 {
1683 const _E* __begin_;
1684 size_t __size_;
1685
initializer_list(const _E * __b,size_t __s)1686 constexpr initializer_list(const _E* __b, size_t __s)
1687 : __begin_(__b),
1688 __size_(__s)
1689 {}
1690
1691 public:
1692 typedef _E value_type;
1693 typedef const _E& reference;
1694 typedef const _E& const_reference;
1695 typedef size_t size_type;
1696
1697 typedef const _E* iterator;
1698 typedef const _E* const_iterator;
1699
initializer_list()1700 constexpr initializer_list() : __begin_(nullptr), __size_(0) {}
1701
size() const1702 constexpr size_t size() const {return __size_;}
begin() const1703 constexpr const _E* begin() const {return __begin_;}
end() const1704 constexpr const _E* end() const {return __begin_ + __size_;}
1705 };
1706 }
1707
1708 namespace InitializerList {
sum(const int * b,const int * e)1709 constexpr int sum(const int *b, const int *e) {
1710 return b != e ? *b + sum(b+1, e) : 0;
1711 }
sum(std::initializer_list<int> ints)1712 constexpr int sum(std::initializer_list<int> ints) {
1713 return sum(ints.begin(), ints.end());
1714 }
1715 static_assert(sum({1, 2, 3, 4, 5}) == 15, "");
1716
1717 static_assert(*std::initializer_list<int>{1, 2, 3}.begin() == 1, "");
1718 static_assert(std::initializer_list<int>{1, 2, 3}.begin()[2] == 3, "");
1719 }
1720
1721 namespace StmtExpr {
1722 struct A { int k; };
f()1723 void f() {
1724 static_assert(({ const int x = 5; x * 3; }) == 15, ""); // expected-warning {{extension}}
1725 constexpr auto a = ({ A(); }); // expected-warning {{extension}}
1726 }
g(int k)1727 constexpr int g(int k) {
1728 return ({ // expected-warning {{extension}}
1729 const int x = k;
1730 x * x;
1731 });
1732 }
1733 static_assert(g(123) == 15129, "");
h()1734 constexpr int h() { // expected-error {{never produces a constant}}
1735 return ({ // expected-warning {{extension}}
1736 return 0; // expected-note {{not supported}}
1737 1;
1738 });
1739 }
1740 }
1741
1742 namespace VirtualFromBase {
1743 struct S1 {
1744 virtual int f() const;
1745 };
1746 struct S2 {
1747 virtual int f();
1748 };
1749 template <typename T> struct X : T {
XVirtualFromBase::X1750 constexpr X() {}
1751 double d = 0.0;
fVirtualFromBase::X1752 constexpr int f() { return sizeof(T); } // expected-warning {{will not be implicitly 'const' in C++14}}
1753 };
1754
1755 // Virtual f(), not OK.
1756 constexpr X<X<S1>> xxs1;
1757 constexpr X<S1> *p = const_cast<X<X<S1>>*>(&xxs1);
1758 static_assert(p->f() == sizeof(X<S1>), ""); // expected-error {{constant expression}} expected-note {{virtual function call}}
1759
1760 // Non-virtual f(), OK.
1761 constexpr X<X<S2>> xxs2;
1762 constexpr X<S2> *q = const_cast<X<X<S2>>*>(&xxs2);
1763 static_assert(q->f() == sizeof(S2), "");
1764 }
1765
1766 namespace ConstexprConstructorRecovery {
1767 class X {
1768 public:
1769 enum E : short {
1770 headers = 0x1,
1771 middlefile = 0x2,
1772 choices = 0x4
1773 };
X()1774 constexpr X() noexcept {};
1775 protected:
1776 E val{0}; // expected-error {{cannot initialize a member subobject of type 'ConstexprConstructorRecovery::X::E' with an rvalue of type 'int'}}
1777 };
1778 constexpr X x{};
1779 }
1780
1781 namespace Lifetime {
f()1782 void f() {
1783 constexpr int &n = n; // expected-error {{constant expression}} expected-note {{use of reference outside its lifetime}} expected-warning {{not yet bound to a value}}
1784 constexpr int m = m; // expected-error {{constant expression}} expected-note {{read of object outside its lifetime}}
1785 }
1786
get(int && n)1787 constexpr int &get(int &&n) { return n; }
1788 struct S {
1789 int &&r; // expected-note 2{{declared here}}
1790 int &s;
1791 int t;
SLifetime::S1792 constexpr S() : r(0), s(get(0)), t(r) {} // expected-warning {{temporary}}
SLifetime::S1793 constexpr S(int) : r(0), s(get(0)), t(s) {} // expected-warning {{temporary}} expected-note {{read of object outside its lifetime}}
1794 };
1795 constexpr int k1 = S().t; // ok, int is lifetime-extended to end of constructor
1796 constexpr int k2 = S(0).t; // expected-error {{constant expression}} expected-note {{in call}}
1797 }
1798
1799 namespace Bitfields {
1800 struct A {
1801 bool b : 1;
1802 unsigned u : 5;
1803 int n : 5;
1804 bool b2 : 3;
1805 unsigned u2 : 74; // expected-warning {{exceeds the size of its type}}
1806 int n2 : 81; // expected-warning {{exceeds the size of its type}}
1807 };
1808
1809 constexpr A a = { false, 33, 31, false, 0xffffffff, 0x7fffffff }; // expected-warning 2{{truncation}}
1810 static_assert(a.b == 0 && a.u == 1 && a.n == -1 && a.b2 == 0 &&
1811 a.u2 + 1 == 0 && a.n2 == 0x7fffffff,
1812 "bad truncation of bitfield values");
1813
1814 struct B {
1815 int n : 3;
BBitfields::B1816 constexpr B(int k) : n(k) {}
1817 };
1818 static_assert(B(3).n == 3, "");
1819 static_assert(B(4).n == -4, "");
1820 static_assert(B(7).n == -1, "");
1821 static_assert(B(8).n == 0, "");
1822 static_assert(B(-1).n == -1, "");
1823 static_assert(B(-8889).n == -1, "");
1824
1825 namespace PR16755 {
1826 struct X {
1827 int x : 1;
fBitfields::PR16755::X1828 constexpr static int f(int x) {
1829 return X{x}.x;
1830 }
1831 };
1832 static_assert(X::f(3) == -1, "3 should truncate to -1");
1833 }
1834 }
1835
1836 namespace ZeroSizeTypes {
1837 constexpr int (*p1)[0] = 0, (*p2)[0] = 0;
1838 constexpr int k = p2 - p1;
1839 // expected-error@-1 {{constexpr variable 'k' must be initialized by a constant expression}}
1840 // expected-note@-2 {{subtraction of pointers to type 'int [0]' of zero size}}
1841
1842 int arr[5][0];
f()1843 constexpr int f() { // expected-error {{never produces a constant expression}}
1844 return &arr[3] - &arr[0]; // expected-note {{subtraction of pointers to type 'int [0]' of zero size}}
1845 }
1846 }
1847
1848 namespace BadDefaultInit {
1849 template<int N> struct X { static const int n = N; };
1850
1851 struct A {
1852 int k = // expected-error {{cannot use defaulted default constructor of 'A' within the class outside of member functions because 'k' has an initializer}}
1853 X<A().k>::n; // expected-error {{not a constant expression}} expected-note {{implicit default constructor for 'BadDefaultInit::A' first required here}}
1854 };
1855
1856 // FIXME: The "constexpr constructor must initialize all members" diagnostic
1857 // here is bogus (we discard the k(k) initializer because the parameter 'k'
1858 // has been marked invalid).
1859 struct B { // expected-note 2{{candidate}}
BBadDefaultInit::B1860 constexpr B( // expected-error {{must initialize all members}} expected-note {{candidate}}
1861 int k = X<B().k>::n) : // expected-error {{no matching constructor}}
1862 k(k) {}
1863 int k; // expected-note {{not initialized}}
1864 };
1865 }
1866
1867 namespace NeverConstantTwoWays {
1868 // If we see something non-constant but foldable followed by something
1869 // non-constant and not foldable, we want the first diagnostic, not the
1870 // second.
f(int n)1871 constexpr int f(int n) { // expected-error {{never produces a constant expression}}
1872 return (int *)(long)&n == &n ? // expected-note {{reinterpret_cast}}
1873 1 / 0 : // expected-warning {{division by zero}}
1874 0;
1875 }
1876
1877 // FIXME: We should diagnose the cast to long here, not the division by zero.
1878 constexpr int n = // expected-error {{must be initialized by a constant expression}}
1879 (int *)(long)&n == &n ?
1880 1 / 0 : // expected-warning {{division by zero}} expected-note {{division by zero}}
1881 0;
1882 }
1883
1884 namespace PR17800 {
1885 struct A {
operator ()PR17800::A1886 constexpr int operator()() const { return 0; }
1887 };
sink(T...)1888 template <typename ...T> constexpr int sink(T ...) {
1889 return 0;
1890 }
run()1891 template <int ...N> constexpr int run() {
1892 return sink(A()() + N ...);
1893 }
1894 constexpr int k = run<1, 2, 3>();
1895 }
1896
1897 namespace BuiltinStrlen {
1898 constexpr const char *a = "foo\0quux";
1899 constexpr char b[] = "foo\0quux";
f()1900 constexpr int f() { return 'u'; }
1901 constexpr char c[] = { 'f', 'o', 'o', 0, 'q', f(), 'u', 'x', 0 };
1902
1903 static_assert(__builtin_strlen("foo") == 3, "");
1904 static_assert(__builtin_strlen("foo\0quux") == 3, "");
1905 static_assert(__builtin_strlen("foo\0quux" + 4) == 4, "");
1906
check(const char * p)1907 constexpr bool check(const char *p) {
1908 return __builtin_strlen(p) == 3 &&
1909 __builtin_strlen(p + 1) == 2 &&
1910 __builtin_strlen(p + 2) == 1 &&
1911 __builtin_strlen(p + 3) == 0 &&
1912 __builtin_strlen(p + 4) == 4 &&
1913 __builtin_strlen(p + 5) == 3 &&
1914 __builtin_strlen(p + 6) == 2 &&
1915 __builtin_strlen(p + 7) == 1 &&
1916 __builtin_strlen(p + 8) == 0;
1917 }
1918
1919 static_assert(check(a), "");
1920 static_assert(check(b), "");
1921 static_assert(check(c), "");
1922
1923 constexpr int over1 = __builtin_strlen(a + 9); // expected-error {{constant expression}} expected-note {{one-past-the-end}}
1924 constexpr int over2 = __builtin_strlen(b + 9); // expected-error {{constant expression}} expected-note {{one-past-the-end}}
1925 constexpr int over3 = __builtin_strlen(c + 9); // expected-error {{constant expression}} expected-note {{one-past-the-end}}
1926
1927 constexpr int under1 = __builtin_strlen(a - 1); // expected-error {{constant expression}} expected-note {{cannot refer to element -1}}
1928 constexpr int under2 = __builtin_strlen(b - 1); // expected-error {{constant expression}} expected-note {{cannot refer to element -1}}
1929 constexpr int under3 = __builtin_strlen(c - 1); // expected-error {{constant expression}} expected-note {{cannot refer to element -1}}
1930
1931 // FIXME: The diagnostic here could be better.
1932 constexpr char d[] = { 'f', 'o', 'o' }; // no nul terminator.
1933 constexpr int bad = __builtin_strlen(d); // expected-error {{constant expression}} expected-note {{one-past-the-end}}
1934 }
1935
1936 namespace PR19010 {
1937 struct Empty {};
1938 struct Empty2 : Empty {};
1939 struct Test : Empty2 {
TestPR19010::Test1940 constexpr Test() {}
1941 Empty2 array[2];
1942 };
test()1943 void test() { constexpr Test t; }
1944 }
1945
PR21327(int a,int b)1946 void PR21327(int a, int b) {
1947 static_assert(&a + 1 != &b, ""); // expected-error {{constant expression}}
1948 }
1949
1950 namespace EmptyClass {
1951 struct E1 {} e1;
1952 union E2 {} e2; // expected-note {{here}}
1953 struct E3 : E1 {} e3;
1954
1955 // The defaulted copy constructor for an empty class does not read any
1956 // members. The defaulted copy constructor for an empty union reads the
1957 // object representation.
1958 constexpr E1 e1b(e1);
1959 constexpr E2 e2b(e2); // expected-error {{constant expression}} expected-note{{read of non-const}} expected-note {{in call}}
1960 constexpr E3 e3b(e3);
1961 }
1962
1963 namespace PR21786 {
1964 extern void (*start[])();
1965 extern void (*end[])();
1966 static_assert(&start != &end, ""); // expected-error {{constant expression}}
1967 static_assert(&start != nullptr, "");
1968
1969 struct Foo;
1970 struct Bar {
1971 static const Foo x;
1972 static const Foo y;
1973 };
1974 static_assert(&Bar::x != nullptr, "");
1975 static_assert(&Bar::x != &Bar::y, "");
1976 }
1977
1978 namespace PR21859 {
Fun()1979 constexpr int Fun() { return; } // expected-error {{non-void constexpr function 'Fun' should return a value}}
1980 constexpr int Var = Fun(); // expected-error {{constexpr variable 'Var' must be initialized by a constant expression}}
1981 }
1982
1983 struct InvalidRedef {
1984 int f; // expected-note{{previous definition is here}}
1985 constexpr int f(void); // expected-error{{redefinition of 'f'}} expected-warning{{will not be implicitly 'const'}}
1986 };
1987
1988 namespace PR17938 {
f(T const & x)1989 template <typename T> constexpr T const &f(T const &x) { return x; }
1990
1991 struct X {};
1992 struct Y : X {};
ZPR17938::Z1993 struct Z : Y { constexpr Z() {} };
1994
1995 static constexpr auto z = f(Z());
1996 }
1997