constant-expression-cxx11.cpp revision 211c8ddb5b500ed84833751363d0cfe1115f4dd3
1// RUN: %clang_cc1 -triple i686-linux -Wno-string-plus-int -fsyntax-only -fcxx-exceptions -verify -std=c++11 -pedantic %s -Wno-comment
2
3namespace StaticAssertFoldTest {
4
5int x;
6static_assert(++x, "test"); // expected-error {{not an integral constant expression}}
7static_assert(false, "test"); // expected-error {{test}}
8
9}
10
11typedef decltype(sizeof(char)) size_t;
12
13template<typename T> constexpr T id(const T &t) { return t; }
14template<typename T> constexpr T min(const T &a, const T &b) {
15  return a < b ? a : b;
16}
17template<typename T> constexpr T max(const T &a, const T &b) {
18  return a < b ? b : a;
19}
20template<typename T, size_t N> constexpr T *begin(T (&xs)[N]) { return xs; }
21template<typename T, size_t N> constexpr T *end(T (&xs)[N]) { return xs + N; }
22
23struct MemberZero {
24  constexpr int zero() const { return 0; }
25};
26
27namespace 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
71namespace ConstCast {
72
73constexpr int n1 = 0;
74constexpr int n2 = const_cast<int&>(n1);
75constexpr int *n3 = const_cast<int*>(&n1);
76constexpr int n4 = *const_cast<int*>(&n1);
77constexpr const int * const *n5 = const_cast<const int* const*>(&n3);
78constexpr int **n6 = const_cast<int**>(&n3);
79constexpr int n7 = **n5;
80constexpr int n8 = **n6;
81
82}
83
84namespace TemplateArgumentConversion {
85  template<int n> struct IntParam {};
86
87  using IntParam0 = IntParam<0>;
88  using IntParam0 = IntParam<id(0)>;
89  using IntParam0 = IntParam<MemberZero().zero>; // expected-error {{did you mean to call it with no arguments?}}
90}
91
92namespace CaseStatements {
93  void f(int n) {
94    switch (n) {
95    case MemberZero().zero: // expected-error {{did you mean to call it with no arguments?}} expected-note {{previous}}
96    case id(0): // expected-error {{duplicate case value '0'}}
97      return;
98    }
99  }
100}
101
102extern int &Recurse1;
103int &Recurse2 = Recurse1; // expected-note {{declared here}}
104int &Recurse1 = Recurse2;
105constexpr int &Recurse3 = Recurse2; // expected-error {{must be initialized by a constant expression}} expected-note {{initializer of 'Recurse2' is not a constant expression}}
106
107extern const int RecurseA;
108const int RecurseB = RecurseA; // expected-note {{declared here}}
109const int RecurseA = 10;
110constexpr int RecurseC = RecurseB; // expected-error {{must be initialized by a constant expression}} expected-note {{initializer of 'RecurseB' is not a constant expression}}
111
112namespace MemberEnum {
113  struct WithMemberEnum {
114    enum E { A = 42 };
115  } wme;
116
117  static_assert(wme.A == 42, "");
118}
119
120namespace DefaultArguments {
121
122const int z = int();
123constexpr int Sum(int a = 0, const int &b = 0, const int *c = &z, char d = 0) {
124  return a + b + *c + d;
125}
126const int four = 4;
127constexpr int eight = 8;
128constexpr const int twentyseven = 27;
129static_assert(Sum() == 0, "");
130static_assert(Sum(1) == 1, "");
131static_assert(Sum(1, four) == 5, "");
132static_assert(Sum(1, eight, &twentyseven) == 36, "");
133static_assert(Sum(1, 2, &four, eight) == 15, "");
134
135}
136
137namespace Ellipsis {
138
139// Note, values passed through an ellipsis can't actually be used.
140constexpr int F(int a, ...) { return a; }
141static_assert(F(0) == 0, "");
142static_assert(F(1, 0) == 1, "");
143static_assert(F(2, "test") == 2, "");
144static_assert(F(3, &F) == 3, "");
145int k = 0; // expected-note {{here}}
146static_assert(F(4, k) == 3, ""); // expected-error {{constant expression}} expected-note {{read of non-const variable 'k'}}
147
148}
149
150namespace Recursion {
151  constexpr int fib(int n) { return n > 1 ? fib(n-1) + fib(n-2) : n; }
152  static_assert(fib(11) == 89, "");
153
154  constexpr int gcd_inner(int a, int b) {
155    return b == 0 ? a : gcd_inner(b, a % b);
156  }
157  constexpr int gcd(int a, int b) {
158    return gcd_inner(max(a, b), min(a, b));
159  }
160
161  static_assert(gcd(1749237, 5628959) == 7, "");
162}
163
164namespace FunctionCast {
165  // When folding, we allow functions to be cast to different types. Such
166  // cast functions cannot be called, even if they're constexpr.
167  constexpr int f() { return 1; }
168  typedef double (*DoubleFn)();
169  typedef int (*IntFn)();
170  int a[(int)DoubleFn(f)()]; // expected-error {{variable length array}} expected-warning{{C99 feature}}
171  int b[(int)IntFn(f)()];    // ok
172}
173
174namespace StaticMemberFunction {
175  struct S {
176    static constexpr int k = 42;
177    static constexpr int f(int n) { return n * k + 2; }
178  } s;
179
180  constexpr int n = s.f(19);
181  static_assert(S::f(19) == 800, "");
182  static_assert(s.f(19) == 800, "");
183  static_assert(n == 800, "");
184
185  constexpr int (*sf1)(int) = &S::f;
186  constexpr int (*sf2)(int) = &s.f;
187  constexpr const int *sk = &s.k;
188}
189
190namespace ParameterScopes {
191
192  const int k = 42;
193  constexpr const int &ObscureTheTruth(const int &a) { return a; }
194  constexpr const int &MaybeReturnJunk(bool b, const int a) { // expected-note 2{{declared here}}
195    return ObscureTheTruth(b ? a : k);
196  }
197  static_assert(MaybeReturnJunk(false, 0) == 42, ""); // ok
198  constexpr int a = MaybeReturnJunk(true, 0); // expected-error {{constant expression}} expected-note {{read of variable whose lifetime has ended}}
199
200  constexpr const int MaybeReturnNonstaticRef(bool b, const int a) {
201    return ObscureTheTruth(b ? a : k);
202  }
203  static_assert(MaybeReturnNonstaticRef(false, 0) == 42, ""); // ok
204  constexpr int b = MaybeReturnNonstaticRef(true, 0); // ok
205
206  constexpr int InternalReturnJunk(int n) {
207    return MaybeReturnJunk(true, n); // expected-note {{read of variable whose lifetime has ended}}
208  }
209  constexpr int n3 = InternalReturnJunk(0); // expected-error {{must be initialized by a constant expression}} expected-note {{in call to 'InternalReturnJunk(0)'}}
210
211  constexpr int LToR(int &n) { return n; }
212  constexpr int GrabCallersArgument(bool which, int a, int b) {
213    return LToR(which ? b : a);
214  }
215  static_assert(GrabCallersArgument(false, 1, 2) == 1, "");
216  static_assert(GrabCallersArgument(true, 4, 8) == 8, "");
217
218}
219
220namespace Pointers {
221
222  constexpr int f(int n, const int *a, const int *b, const int *c) {
223    return n == 0 ? 0 : *a + f(n-1, b, c, a);
224  }
225
226  const int x = 1, y = 10, z = 100;
227  static_assert(f(23, &x, &y, &z) == 788, "");
228
229  constexpr int g(int n, int a, int b, int c) {
230    return f(n, &a, &b, &c);
231  }
232  static_assert(g(23, x, y, z) == 788, "");
233
234}
235
236namespace FunctionPointers {
237
238  constexpr int Double(int n) { return 2 * n; }
239  constexpr int Triple(int n) { return 3 * n; }
240  constexpr int Twice(int (*F)(int), int n) { return F(F(n)); }
241  constexpr int Quadruple(int n) { return Twice(Double, n); }
242  constexpr auto Select(int n) -> int (*)(int) {
243    return n == 2 ? &Double : n == 3 ? &Triple : n == 4 ? &Quadruple : 0;
244  }
245  constexpr int Apply(int (*F)(int), int n) { return F(n); } // expected-note {{subexpression}}
246
247  static_assert(1 + Apply(Select(4), 5) + Apply(Select(3), 7) == 42, "");
248
249  constexpr int Invalid = Apply(Select(0), 0); // expected-error {{must be initialized by a constant expression}} expected-note {{in call to 'Apply(0, 0)'}}
250
251}
252
253namespace PointerComparison {
254
255int x, y;
256static_assert(&x == &y, "false"); // expected-error {{false}}
257static_assert(&x != &y, "");
258constexpr bool g1 = &x == &y;
259constexpr bool g2 = &x != &y;
260constexpr bool g3 = &x <= &y; // expected-error {{must be initialized by a constant expression}}
261constexpr bool g4 = &x >= &y; // expected-error {{must be initialized by a constant expression}}
262constexpr bool g5 = &x < &y; // expected-error {{must be initialized by a constant expression}}
263constexpr bool g6 = &x > &y; // expected-error {{must be initialized by a constant expression}}
264
265struct S { int x, y; } s;
266static_assert(&s.x == &s.y, "false"); // expected-error {{false}}
267static_assert(&s.x != &s.y, "");
268static_assert(&s.x <= &s.y, "");
269static_assert(&s.x >= &s.y, "false"); // expected-error {{false}}
270static_assert(&s.x < &s.y, "");
271static_assert(&s.x > &s.y, "false"); // expected-error {{false}}
272
273static_assert(0 == &y, "false"); // expected-error {{false}}
274static_assert(0 != &y, "");
275constexpr bool n3 = 0 <= &y; // expected-error {{must be initialized by a constant expression}}
276constexpr bool n4 = 0 >= &y; // expected-error {{must be initialized by a constant expression}}
277constexpr bool n5 = 0 < &y; // expected-error {{must be initialized by a constant expression}}
278constexpr bool n6 = 0 > &y; // expected-error {{must be initialized by a constant expression}}
279
280static_assert(&x == 0, "false"); // expected-error {{false}}
281static_assert(&x != 0, "");
282constexpr bool n9 = &x <= 0; // expected-error {{must be initialized by a constant expression}}
283constexpr bool n10 = &x >= 0; // expected-error {{must be initialized by a constant expression}}
284constexpr bool n11 = &x < 0; // expected-error {{must be initialized by a constant expression}}
285constexpr bool n12 = &x > 0; // expected-error {{must be initialized by a constant expression}}
286
287static_assert(&x == &x, "");
288static_assert(&x != &x, "false"); // expected-error {{false}}
289static_assert(&x <= &x, "");
290static_assert(&x >= &x, "");
291static_assert(&x < &x, "false"); // expected-error {{false}}
292static_assert(&x > &x, "false"); // expected-error {{false}}
293
294constexpr S* sptr = &s;
295constexpr bool dyncast = sptr == dynamic_cast<S*>(sptr); // expected-error {{constant expression}} expected-note {{dynamic_cast}}
296
297struct U {};
298struct Str {
299  int a : dynamic_cast<S*>(sptr) == dynamic_cast<S*>(sptr); // \
300    expected-warning {{not an integral constant expression}} \
301    expected-note {{dynamic_cast is not allowed in a constant expression}}
302  int b : reinterpret_cast<S*>(sptr) == reinterpret_cast<S*>(sptr); // \
303    expected-warning {{not an integral constant expression}} \
304    expected-note {{reinterpret_cast is not allowed in a constant expression}}
305  int c : (S*)(long)(sptr) == (S*)(long)(sptr); // \
306    expected-warning {{not an integral constant expression}} \
307    expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
308  int d : (S*)(42) == (S*)(42); // \
309    expected-warning {{not an integral constant expression}} \
310    expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
311  int e : (Str*)(sptr) == (Str*)(sptr); // \
312    expected-warning {{not an integral constant expression}} \
313    expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
314  int f : &(U&)(*sptr) == &(U&)(*sptr); // \
315    expected-warning {{not an integral constant expression}} \
316    expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
317  int g : (S*)(void*)(sptr) == sptr; // \
318    expected-warning {{not an integral constant expression}} \
319    expected-note {{cast from 'void *' is not allowed in a constant expression}}
320};
321
322extern char externalvar[];
323constexpr bool constaddress = (void *)externalvar == (void *)0x4000UL; // expected-error {{must be initialized by a constant expression}}
324constexpr bool litaddress = "foo" == "foo"; // expected-error {{must be initialized by a constant expression}} expected-warning {{unspecified}}
325static_assert(0 != "foo", "");
326
327}
328
329namespace MaterializeTemporary {
330
331constexpr int f(const int &r) { return r; }
332constexpr int n = f(1);
333
334constexpr bool same(const int &a, const int &b) { return &a == &b; }
335constexpr bool sameTemporary(const int &n) { return same(n, n); }
336
337static_assert(n, "");
338static_assert(!same(4, 4), "");
339static_assert(same(n, n), "");
340static_assert(sameTemporary(9), "");
341
342struct A { int &&r; };
343struct B { A &&a1; A &&a2; };
344
345constexpr B b1 { { 1 }, { 2 } }; // expected-note {{temporary created here}}
346static_assert(&b1.a1 != &b1.a2, "");
347static_assert(&b1.a1.r != &b1.a2.r, ""); // expected-error {{constant expression}} expected-note {{outside the expression that created the temporary}}
348
349constexpr B &&b2 { { 3 }, { 4 } }; // expected-note {{temporary created here}}
350static_assert(&b1 != &b2, "");
351static_assert(&b1.a1 != &b2.a1, ""); // expected-error {{constant expression}} expected-note {{outside the expression that created the temporary}}
352
353constexpr thread_local B b3 { { 1 }, { 2 } }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}}
354void foo() {
355  constexpr static B b1 { { 1 }, { 2 } }; // ok
356  constexpr thread_local B b2 { { 1 }, { 2 } }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}}
357  constexpr B b3 { { 1 }, { 2 } }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}}
358}
359
360constexpr B &&b4 = ((1, 2), 3, 4, B { {10}, {{20}} }); // expected-warning 4{{unused}}
361static_assert(&b4 != &b2, "");
362
363// Proposed DR: copy-elision doesn't trigger lifetime extension.
364constexpr B b5 = B{ {0}, {0} }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}}
365
366}
367
368constexpr int strcmp_ce(const char *p, const char *q) {
369  return (!*p || *p != *q) ? *p - *q : strcmp_ce(p+1, q+1);
370}
371
372namespace StringLiteral {
373
374template<typename Char>
375constexpr int MangleChars(const Char *p) {
376  return *p + 3 * (*p ? MangleChars(p+1) : 0);
377}
378
379static_assert(MangleChars("constexpr!") == 1768383, "");
380static_assert(MangleChars(u8"constexpr!") == 1768383, "");
381static_assert(MangleChars(L"constexpr!") == 1768383, "");
382static_assert(MangleChars(u"constexpr!") == 1768383, "");
383static_assert(MangleChars(U"constexpr!") == 1768383, "");
384
385constexpr char c0 = "nought index"[0];
386constexpr char c1 = "nice index"[10];
387constexpr 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}}
388constexpr 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}}
389constexpr 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}}
390
391constexpr const char *p = "test" + 2;
392static_assert(*p == 's', "");
393
394constexpr const char *max_iter(const char *a, const char *b) {
395  return *a < *b ? b : a;
396}
397constexpr const char *max_element(const char *a, const char *b) {
398  return (a+1 >= b) ? a : max_iter(a, max_element(a+1, b));
399}
400
401constexpr char str[] = "the quick brown fox jumped over the lazy dog";
402constexpr const char *max = max_element(begin(str), end(str));
403static_assert(*max == 'z', "");
404static_assert(max == str + 38, "");
405
406static_assert(strcmp_ce("hello world", "hello world") == 0, "");
407static_assert(strcmp_ce("hello world", "hello clang") > 0, "");
408static_assert(strcmp_ce("constexpr", "test") < 0, "");
409static_assert(strcmp_ce("", " ") < 0, "");
410
411struct S {
412  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}}
413};
414
415struct T {
416  char c[6];
417  constexpr T() : c{"foo"} {}
418};
419constexpr T t;
420
421static_assert(t.c[0] == 'f', "");
422static_assert(t.c[1] == 'o', "");
423static_assert(t.c[2] == 'o', "");
424static_assert(t.c[3] == 0, "");
425static_assert(t.c[4] == 0, "");
426static_assert(t.c[5] == 0, "");
427static_assert(t.c[6] == 0, ""); // expected-error {{constant expression}} expected-note {{one-past-the-end}}
428
429struct U {
430  wchar_t chars[6];
431  int n;
432} constexpr u = { { L"test" }, 0 };
433static_assert(u.chars[2] == L's', "");
434
435struct V {
436  char c[4];
437  constexpr V() : c("hi!") {}
438};
439static_assert(V().c[1] == "i"[0], "");
440
441namespace Parens {
442  constexpr unsigned char a[] = ("foo"), b[] = {"foo"}, c[] = {("foo")},
443                          d[4] = ("foo"), e[5] = {"foo"}, f[6] = {("foo")};
444  static_assert(a[0] == 'f', "");
445  static_assert(b[1] == 'o', "");
446  static_assert(c[2] == 'o', "");
447  static_assert(d[0] == 'f', "");
448  static_assert(e[1] == 'o', "");
449  static_assert(f[2] == 'o', "");
450  static_assert(f[5] == 0, "");
451  static_assert(f[6] == 0, ""); // expected-error {{constant expression}} expected-note {{one-past-the-end}}
452}
453
454}
455
456namespace Array {
457
458template<typename Iter>
459constexpr auto Sum(Iter begin, Iter end) -> decltype(+*begin) {
460  return begin == end ? 0 : *begin + Sum(begin+1, end);
461}
462
463constexpr int xs[] = { 1, 2, 3, 4, 5 };
464constexpr int ys[] = { 5, 4, 3, 2, 1 };
465constexpr int sum_xs = Sum(begin(xs), end(xs));
466static_assert(sum_xs == 15, "");
467
468constexpr int ZipFoldR(int (*F)(int x, int y, int c), int n,
469                       const int *xs, const int *ys, int c) {
470  return n ? F(
471               *xs, // expected-note {{read of dereferenced one-past-the-end pointer}}
472               *ys,
473               ZipFoldR(F, n-1, xs+1, ys+1, c)) // \
474      expected-note {{in call to 'ZipFoldR(&SubMul, 2, &xs[4], &ys[4], 1)'}} \
475      expected-note {{in call to 'ZipFoldR(&SubMul, 1, &xs[5], &ys[5], 1)'}}
476           : c;
477}
478constexpr int MulAdd(int x, int y, int c) { return x * y + c; }
479constexpr int InnerProduct = ZipFoldR(MulAdd, 5, xs, ys, 0);
480static_assert(InnerProduct == 35, "");
481
482constexpr int SubMul(int x, int y, int c) { return (x - y) * c; }
483constexpr int DiffProd = ZipFoldR(SubMul, 2, xs+3, ys+3, 1);
484static_assert(DiffProd == 8, "");
485static_assert(ZipFoldR(SubMul, 3, xs+3, ys+3, 1), ""); // \
486      expected-error {{constant expression}} \
487      expected-note {{in call to 'ZipFoldR(&SubMul, 3, &xs[3], &ys[3], 1)'}}
488
489constexpr const int *p = xs + 3;
490constexpr int xs4 = p[1]; // ok
491constexpr int xs5 = p[2]; // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
492constexpr int xs6 = p[3]; // expected-error {{constant expression}} expected-note {{cannot refer to element 6}}
493constexpr int xs0 = p[-3]; // ok
494constexpr int xs_1 = p[-4]; // expected-error {{constant expression}} expected-note {{cannot refer to element -1}}
495
496constexpr int zs[2][2][2][2] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
497static_assert(zs[0][0][0][0] == 1, "");
498static_assert(zs[1][1][1][1] == 16, "");
499static_assert(zs[0][0][0][2] == 3, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
500static_assert((&zs[0][0][0][2])[-1] == 2, "");
501static_assert(**(**(zs + 1) + 1) == 11, "");
502static_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}}
503static_assert(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][2] - 2) == 11, "");
504constexpr 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}}
505
506constexpr int fail(const int &p) {
507  return (&p)[64]; // expected-note {{cannot refer to element 64 of array of 2 elements}}
508}
509static_assert(fail(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][2] - 2)) == 11, ""); // \
510expected-error {{static_assert expression is not an integral constant expression}} \
511expected-note {{in call to 'fail(zs[1][0][1][0])'}}
512
513constexpr int arr[40] = { 1, 2, 3, [8] = 4 }; // expected-warning {{C99 feature}}
514constexpr int SumNonzero(const int *p) {
515  return *p + (*p ? SumNonzero(p+1) : 0);
516}
517constexpr int CountZero(const int *p, const int *q) {
518  return p == q ? 0 : (*p == 0) + CountZero(p+1, q);
519}
520static_assert(SumNonzero(arr) == 6, "");
521static_assert(CountZero(arr, arr + 40) == 36, "");
522
523struct ArrayElem {
524  constexpr ArrayElem() : n(0) {}
525  int n;
526  constexpr int f() const { return n; }
527};
528struct ArrayRVal {
529  constexpr ArrayRVal() {}
530  ArrayElem elems[10];
531};
532static_assert(ArrayRVal().elems[3].f() == 0, "");
533
534constexpr int selfref[2][2][2] = {
535  selfref[1][1][1] + 1, selfref[0][0][0] + 1,
536  selfref[1][0][1] + 1, selfref[0][1][0] + 1,
537  selfref[1][0][0] + 1, selfref[0][1][1] + 1 };
538static_assert(selfref[0][0][0] == 1, "");
539static_assert(selfref[0][0][1] == 2, "");
540static_assert(selfref[0][1][0] == 1, "");
541static_assert(selfref[0][1][1] == 2, "");
542static_assert(selfref[1][0][0] == 1, "");
543static_assert(selfref[1][0][1] == 3, "");
544static_assert(selfref[1][1][0] == 0, "");
545static_assert(selfref[1][1][1] == 0, "");
546
547struct TrivialDefCtor { int n; };
548typedef TrivialDefCtor TDCArray[2][2];
549static_assert(TDCArray{}[1][1].n == 0, "");
550
551struct NonAggregateTDC : TrivialDefCtor {};
552typedef NonAggregateTDC NATDCArray[2][2];
553static_assert(NATDCArray{}[1][1].n == 0, "");
554
555}
556
557namespace DependentValues {
558
559struct I { int n; typedef I V[10]; };
560I::V x, y;
561int g();
562template<bool B, typename T> struct S : T {
563  int k;
564  void f() {
565    I::V &cells = B ? x : y;
566    I &i = cells[k];
567    switch (i.n) {}
568
569    // FIXME: We should be able to diagnose this.
570    constexpr int n = g();
571
572    constexpr int m = this->g(); // ok, could be constexpr
573  }
574};
575
576}
577
578namespace Class {
579
580struct A { constexpr A(int a, int b) : k(a + b) {} int k; };
581constexpr int fn(const A &a) { return a.k; }
582static_assert(fn(A(4,5)) == 9, "");
583
584struct B { int n; int m; } constexpr b = { 0, b.n }; // expected-warning {{uninitialized}}
585struct C {
586  constexpr C(C *this_) : m(42), n(this_->m) {} // ok
587  int m, n;
588};
589struct D {
590  C c;
591  constexpr D() : c(&c) {}
592};
593static_assert(D().c.n == 42, "");
594
595struct E {
596  constexpr E() : p(&p) {}
597  void *p;
598};
599constexpr const E &e1 = E();
600// This is a constant expression if we elide the copy constructor call, and
601// is not a constant expression if we don't! But we do, so it is.
602constexpr E e2 = E();
603static_assert(e2.p == &e2.p, "");
604constexpr E e3;
605static_assert(e3.p == &e3.p, "");
606
607extern const class F f;
608struct F {
609  constexpr F() : p(&f.p) {}
610  const void *p;
611};
612constexpr F f;
613
614struct G {
615  struct T {
616    constexpr T(T *p) : u1(), u2(p) {}
617    union U1 {
618      constexpr U1() {}
619      int a, b = 42;
620    } u1;
621    union U2 {
622      constexpr U2(T *p) : c(p->u1.b) {}
623      int c, d;
624    } u2;
625  } t;
626  constexpr G() : t(&t) {}
627} constexpr g;
628
629static_assert(g.t.u1.a == 42, ""); // expected-error {{constant expression}} expected-note {{read of member 'a' of union with active member 'b'}}
630static_assert(g.t.u1.b == 42, "");
631static_assert(g.t.u2.c == 42, "");
632static_assert(g.t.u2.d == 42, ""); // expected-error {{constant expression}} expected-note {{read of member 'd' of union with active member 'c'}}
633
634struct S {
635  int a, b;
636  const S *p;
637  double d;
638  const char *q;
639
640  constexpr S(int n, const S *p) : a(5), b(n), p(p), d(n), q("hello") {}
641};
642
643S global(43, &global);
644
645static_assert(S(15, &global).b == 15, "");
646
647constexpr bool CheckS(const S &s) {
648  return s.a == 5 && s.b == 27 && s.p == &global && s.d == 27. && s.q[3] == 'l';
649}
650static_assert(CheckS(S(27, &global)), "");
651
652struct Arr {
653  char arr[3];
654  constexpr Arr() : arr{'x', 'y', 'z'} {}
655};
656constexpr int hash(Arr &&a) {
657  return a.arr[0] + a.arr[1] * 0x100 + a.arr[2] * 0x10000;
658}
659constexpr int k = hash(Arr());
660static_assert(k == 0x007a7978, "");
661
662
663struct AggregateInit {
664  const char &c;
665  int n;
666  double d;
667  int arr[5];
668  void *p;
669};
670
671constexpr AggregateInit agg1 = { "hello"[0] };
672
673static_assert(strcmp_ce(&agg1.c, "hello") == 0, "");
674static_assert(agg1.n == 0, "");
675static_assert(agg1.d == 0.0, "");
676static_assert(agg1.arr[-1] == 0, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element -1}}
677static_assert(agg1.arr[0] == 0, "");
678static_assert(agg1.arr[4] == 0, "");
679static_assert(agg1.arr[5] == 0, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end}}
680static_assert(agg1.p == nullptr, "");
681
682static constexpr const unsigned char uc[] = { "foo" };
683static_assert(uc[0] == 'f', "");
684static_assert(uc[3] == 0, "");
685
686namespace SimpleDerivedClass {
687
688struct B {
689  constexpr B(int n) : a(n) {}
690  int a;
691};
692struct D : B {
693  constexpr D(int n) : B(n) {}
694};
695constexpr D d(3);
696static_assert(d.a == 3, "");
697
698}
699
700struct Bottom { constexpr Bottom() {} };
701struct Base : Bottom {
702  constexpr Base(int a = 42, const char *b = "test") : a(a), b(b) {}
703  int a;
704  const char *b;
705};
706struct Base2 : Bottom {
707  constexpr Base2(const int &r) : r(r) {}
708  int q = 123;
709  const int &r;
710};
711struct Derived : Base, Base2 {
712  constexpr Derived() : Base(76), Base2(a) {}
713  int c = r + b[1];
714};
715
716constexpr bool operator==(const Base &a, const Base &b) {
717  return a.a == b.a && strcmp_ce(a.b, b.b) == 0;
718}
719
720constexpr Base base;
721constexpr Base base2(76);
722constexpr Derived derived;
723static_assert(derived.a == 76, "");
724static_assert(derived.b[2] == 's', "");
725static_assert(derived.c == 76 + 'e', "");
726static_assert(derived.q == 123, "");
727static_assert(derived.r == 76, "");
728static_assert(&derived.r == &derived.a, "");
729
730static_assert(!(derived == base), "");
731static_assert(derived == base2, "");
732
733constexpr Bottom &bot1 = (Base&)derived;
734constexpr Bottom &bot2 = (Base2&)derived;
735static_assert(&bot1 != &bot2, "");
736
737constexpr Bottom *pb1 = (Base*)&derived;
738constexpr Bottom *pb2 = (Base2*)&derived;
739static_assert(&pb1 != &pb2, "");
740static_assert(pb1 == &bot1, "");
741static_assert(pb2 == &bot2, "");
742
743constexpr Base2 &fail = (Base2&)bot1; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base2'}}
744constexpr Base &fail2 = (Base&)*pb2; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base'}}
745constexpr Base2 &ok2 = (Base2&)bot2;
746static_assert(&ok2 == &derived, "");
747
748constexpr Base2 *pfail = (Base2*)pb1; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base2'}}
749constexpr Base *pfail2 = (Base*)&bot2; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base'}}
750constexpr Base2 *pok2 = (Base2*)pb2;
751static_assert(pok2 == &derived, "");
752static_assert(&ok2 == pok2, "");
753static_assert((Base2*)(Derived*)(Base*)pb1 == pok2, "");
754static_assert((Derived*)(Base*)pb1 == (Derived*)pok2, "");
755
756constexpr Base *nullB = 42 - 6 * 7; // expected-warning {{expression which evaluates to zero treated as a null pointer constant of type 'Class::Base *const'}}
757static_assert((Bottom*)nullB == 0, "");
758static_assert((Derived*)nullB == 0, "");
759static_assert((void*)(Bottom*)nullB == (void*)(Derived*)nullB, "");
760Base * nullB2 = '\0'; // expected-warning {{expression which evaluates to zero treated as a null pointer constant of type 'Class::Base *'}}
761Base * nullB3 = (0);
762// We suppress the warning in unevaluated contexts to workaround some gtest
763// behavior. Once this becomes an error this isn't a problem anymore.
764static_assert(nullB == (1 - 1), "");
765
766
767namespace ConversionOperators {
768
769struct T {
770  constexpr T(int n) : k(5*n - 3) {}
771  constexpr operator int() const { return k; }
772  int k;
773};
774
775struct S {
776  constexpr S(int n) : k(2*n + 1) {}
777  constexpr operator int() const { return k; }
778  constexpr operator T() const { return T(k); }
779  int k;
780};
781
782constexpr bool check(T a, T b) { return a == b.k; }
783
784static_assert(S(5) == 11, "");
785static_assert(check(S(5), 11), "");
786
787namespace PR14171 {
788
789struct X {
790  constexpr (operator int)() const { return 0; }
791};
792static_assert(X() == 0, "");
793
794}
795
796}
797
798}
799
800namespace Temporaries {
801
802struct S {
803  constexpr S() {}
804  constexpr int f() const;
805  constexpr int g() const;
806};
807struct T : S {
808  constexpr T(int n) : S(), n(n) {}
809  int n;
810};
811constexpr int S::f() const {
812  return static_cast<const T*>(this)->n; // expected-note {{cannot cast}}
813}
814constexpr int S::g() const {
815  // FIXME: Better diagnostic for this.
816  return this->*(int(S::*))&T::n; // expected-note {{subexpression}}
817}
818// The T temporary is implicitly cast to an S subobject, but we can recover the
819// T full-object via a base-to-derived cast, or a derived-to-base-casted member
820// pointer.
821static_assert(S().f(), ""); // expected-error {{constant expression}} expected-note {{in call to '&Temporaries::S()->f()'}}
822static_assert(S().g(), ""); // expected-error {{constant expression}} expected-note {{in call to '&Temporaries::S()->g()'}}
823static_assert(T(3).f() == 3, "");
824static_assert(T(4).g() == 4, "");
825
826constexpr int f(const S &s) {
827  return static_cast<const T&>(s).n;
828}
829constexpr int n = f(T(5));
830static_assert(f(T(5)) == 5, "");
831
832constexpr bool b(int n) { return &n; }
833static_assert(b(0), "");
834
835}
836
837namespace Union {
838
839union U {
840  int a;
841  int b;
842};
843
844constexpr U u[4] = { { .a = 0 }, { .b = 1 }, { .a = 2 }, { .b = 3 } }; // expected-warning 4{{C99 feature}}
845static_assert(u[0].a == 0, "");
846static_assert(u[0].b, ""); // expected-error {{constant expression}} expected-note {{read of member 'b' of union with active member 'a'}}
847static_assert(u[1].b == 1, "");
848static_assert((&u[1].b)[1] == 2, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
849static_assert(*(&(u[1].b) + 1 + 1) == 3, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element 2 of non-array object}}
850static_assert((&(u[1]) + 1 + 1)->b == 3, "");
851
852constexpr U v = {};
853static_assert(v.a == 0, "");
854
855union Empty {};
856constexpr Empty e = {};
857
858// Make sure we handle trivial copy constructors for unions.
859constexpr U x = {42};
860constexpr U y = x;
861static_assert(y.a == 42, "");
862static_assert(y.b == 42, ""); // expected-error {{constant expression}} expected-note {{'b' of union with active member 'a'}}
863
864}
865
866namespace MemberPointer {
867  struct A {
868    constexpr A(int n) : n(n) {}
869    int n;
870    constexpr int f() const { return n + 3; }
871  };
872  constexpr A a(7);
873  static_assert(A(5).*&A::n == 5, "");
874  static_assert((&a)->*&A::n == 7, "");
875  static_assert((A(8).*&A::f)() == 11, "");
876  static_assert(((&a)->*&A::f)() == 10, "");
877
878  struct B : A {
879    constexpr B(int n, int m) : A(n), m(m) {}
880    int m;
881    constexpr int g() const { return n + m + 1; }
882  };
883  constexpr B b(9, 13);
884  static_assert(B(4, 11).*&A::n == 4, "");
885  static_assert(B(4, 11).*&B::m == 11, "");
886  static_assert(B(4, 11).*(int(A::*))&B::m == 11, "");
887  static_assert((&b)->*&A::n == 9, "");
888  static_assert((&b)->*&B::m == 13, "");
889  static_assert((&b)->*(int(A::*))&B::m == 13, "");
890  static_assert((B(4, 11).*&A::f)() == 7, "");
891  static_assert((B(4, 11).*&B::g)() == 16, "");
892  static_assert((B(4, 11).*(int(A::*)()const)&B::g)() == 16, "");
893  static_assert(((&b)->*&A::f)() == 12, "");
894  static_assert(((&b)->*&B::g)() == 23, "");
895  static_assert(((&b)->*(int(A::*)()const)&B::g)() == 23, "");
896
897  struct S {
898    constexpr S(int m, int n, int (S::*pf)() const, int S::*pn) :
899      m(m), n(n), pf(pf), pn(pn) {}
900    constexpr S() : m(), n(), pf(&S::f), pn(&S::n) {}
901
902    constexpr int f() const { return this->*pn; }
903    virtual int g() const;
904
905    int m, n;
906    int (S::*pf)() const;
907    int S::*pn;
908  };
909
910  constexpr int S::*pm = &S::m;
911  constexpr int S::*pn = &S::n;
912  constexpr int (S::*pf)() const = &S::f;
913  constexpr int (S::*pg)() const = &S::g;
914
915  constexpr S s(2, 5, &S::f, &S::m);
916
917  static_assert((s.*&S::f)() == 2, "");
918  static_assert((s.*s.pf)() == 2, "");
919
920  static_assert(pf == &S::f, "");
921  static_assert(pf == s.*&S::pf, "");
922  static_assert(pm == &S::m, "");
923  static_assert(pm != pn, "");
924  static_assert(s.pn != pn, "");
925  static_assert(s.pn == pm, "");
926  static_assert(pg != nullptr, "");
927  static_assert(pf != nullptr, "");
928  static_assert((int S::*)nullptr == nullptr, "");
929  static_assert(pg == pg, ""); // expected-error {{constant expression}} expected-note {{comparison of pointer to virtual member function 'g' has unspecified value}}
930  static_assert(pf != pg, ""); // expected-error {{constant expression}} expected-note {{comparison of pointer to virtual member function 'g' has unspecified value}}
931
932  template<int n> struct T : T<n-1> {};
933  template<> struct T<0> { int n; };
934  template<> struct T<30> : T<29> { int m; };
935
936  T<17> t17;
937  T<30> t30;
938
939  constexpr int (T<10>::*deepn) = &T<0>::n;
940  static_assert(&(t17.*deepn) == &t17.n, "");
941  static_assert(deepn == &T<2>::n, "");
942
943  constexpr int (T<15>::*deepm) = (int(T<10>::*))&T<30>::m;
944  constexpr int *pbad = &(t17.*deepm); // expected-error {{constant expression}}
945  static_assert(&(t30.*deepm) == &t30.m, "");
946  static_assert(deepm == &T<50>::m, "");
947  static_assert(deepm != deepn, "");
948
949  constexpr T<5> *p17_5 = &t17;
950  constexpr T<13> *p17_13 = (T<13>*)p17_5;
951  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>'}}
952  static_assert(&(p17_5->*(int(T<3>::*))deepn) == &t17.n, "");
953  static_assert(&(p17_13->*deepn) == &t17.n, "");
954  constexpr int *pbad2 = &(p17_13->*(int(T<9>::*))deepm); // expected-error {{constant expression}}
955
956  constexpr T<5> *p30_5 = &t30;
957  constexpr T<23> *p30_23 = (T<23>*)p30_5;
958  constexpr T<13> *p30_13 = p30_23;
959  static_assert(&(p30_5->*(int(T<3>::*))deepn) == &t30.n, "");
960  static_assert(&(p30_13->*deepn) == &t30.n, "");
961  static_assert(&(p30_23->*deepn) == &t30.n, "");
962  static_assert(&(p30_5->*(int(T<2>::*))deepm) == &t30.m, "");
963  static_assert(&(((T<17>*)p30_13)->*deepm) == &t30.m, "");
964  static_assert(&(p30_23->*deepm) == &t30.m, "");
965
966  struct Base { int n; };
967  template<int N> struct Mid : Base {};
968  struct Derived : Mid<0>, Mid<1> {};
969  static_assert(&Mid<0>::n == &Mid<1>::n, "");
970  static_assert((int Derived::*)(int Mid<0>::*)&Mid<0>::n !=
971                (int Derived::*)(int Mid<1>::*)&Mid<1>::n, "");
972  static_assert(&Mid<0>::n == (int Mid<0>::*)&Base::n, "");
973}
974
975namespace ArrayBaseDerived {
976
977  struct Base {
978    constexpr Base() {}
979    int n = 0;
980  };
981  struct Derived : Base {
982    constexpr Derived() {}
983    constexpr const int *f() const { return &n; }
984  };
985
986  constexpr Derived a[10];
987  constexpr Derived *pd3 = const_cast<Derived*>(&a[3]);
988  constexpr Base *pb3 = const_cast<Derived*>(&a[3]);
989  static_assert(pb3 == pd3, "");
990
991  // pb3 does not point to an array element.
992  constexpr Base *pb4 = pb3 + 1; // ok, one-past-the-end pointer.
993  constexpr int pb4n = pb4->n; // expected-error {{constant expression}} expected-note {{cannot access field of pointer past the end}}
994  constexpr Base *err_pb5 = pb3 + 2; // expected-error {{constant expression}} expected-note {{cannot refer to element 2}} expected-note {{here}}
995  constexpr int err_pb5n = err_pb5->n; // expected-error {{constant expression}} expected-note {{initializer of 'err_pb5' is not a constant expression}}
996  constexpr Base *err_pb2 = pb3 - 1; // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} expected-note {{here}}
997  constexpr int err_pb2n = err_pb2->n; // expected-error {{constant expression}} expected-note {{initializer of 'err_pb2'}}
998  constexpr Base *pb3a = pb4 - 1;
999
1000  // pb4 does not point to a Derived.
1001  constexpr Derived *err_pd4 = (Derived*)pb4; // expected-error {{constant expression}} expected-note {{cannot access derived class of pointer past the end}}
1002  constexpr Derived *pd3a = (Derived*)pb3a;
1003  constexpr int pd3n = pd3a->n;
1004
1005  // pd3a still points to the Derived array.
1006  constexpr Derived *pd6 = pd3a + 3;
1007  static_assert(pd6 == &a[6], "");
1008  constexpr Derived *pd9 = pd6 + 3;
1009  constexpr Derived *pd10 = pd6 + 4;
1010  constexpr int pd9n = pd9->n; // ok
1011  constexpr int err_pd10n = pd10->n; // expected-error {{constant expression}} expected-note {{cannot access base class of pointer past the end}}
1012  constexpr int pd0n = pd10[-10].n;
1013  constexpr int err_pdminus1n = pd10[-11].n; // expected-error {{constant expression}} expected-note {{cannot refer to element -1 of}}
1014
1015  constexpr Base *pb9 = pd9;
1016  constexpr const int *(Base::*pfb)() const =
1017      static_cast<const int *(Base::*)() const>(&Derived::f);
1018  static_assert((pb9->*pfb)() == &a[9].n, "");
1019}
1020
1021namespace Complex {
1022
1023class complex {
1024  int re, im;
1025public:
1026  constexpr complex(int re = 0, int im = 0) : re(re), im(im) {}
1027  constexpr complex(const complex &o) : re(o.re), im(o.im) {}
1028  constexpr complex operator-() const { return complex(-re, -im); }
1029  friend constexpr complex operator+(const complex &l, const complex &r) {
1030    return complex(l.re + r.re, l.im + r.im);
1031  }
1032  friend constexpr complex operator-(const complex &l, const complex &r) {
1033    return l + -r;
1034  }
1035  friend constexpr complex operator*(const complex &l, const complex &r) {
1036    return complex(l.re * r.re - l.im * r.im, l.re * r.im + l.im * r.re);
1037  }
1038  friend constexpr bool operator==(const complex &l, const complex &r) {
1039    return l.re == r.re && l.im == r.im;
1040  }
1041  constexpr bool operator!=(const complex &r) const {
1042    return re != r.re || im != r.im;
1043  }
1044  constexpr int real() const { return re; }
1045  constexpr int imag() const { return im; }
1046};
1047
1048constexpr complex i = complex(0, 1);
1049constexpr complex k = (3 + 4*i) * (6 - 4*i);
1050static_assert(complex(1,0).real() == 1, "");
1051static_assert(complex(1,0).imag() == 0, "");
1052static_assert(((complex)1).imag() == 0, "");
1053static_assert(k.real() == 34, "");
1054static_assert(k.imag() == 12, "");
1055static_assert(k - 34 == 12*i, "");
1056static_assert((complex)1 == complex(1), "");
1057static_assert((complex)1 != complex(0, 1), "");
1058static_assert(complex(1) == complex(1), "");
1059static_assert(complex(1) != complex(0, 1), "");
1060constexpr complex makeComplex(int re, int im) { return complex(re, im); }
1061static_assert(makeComplex(1,0) == complex(1), "");
1062static_assert(makeComplex(1,0) != complex(0, 1), "");
1063
1064class complex_wrap : public complex {
1065public:
1066  constexpr complex_wrap(int re, int im = 0) : complex(re, im) {}
1067  constexpr complex_wrap(const complex_wrap &o) : complex(o) {}
1068};
1069
1070static_assert((complex_wrap)1 == complex(1), "");
1071static_assert((complex)1 != complex_wrap(0, 1), "");
1072static_assert(complex(1) == complex_wrap(1), "");
1073static_assert(complex_wrap(1) != complex(0, 1), "");
1074constexpr complex_wrap makeComplexWrap(int re, int im) {
1075  return complex_wrap(re, im);
1076}
1077static_assert(makeComplexWrap(1,0) == complex(1), "");
1078static_assert(makeComplexWrap(1,0) != complex(0, 1), "");
1079
1080}
1081
1082namespace PR11595 {
1083  struct A { constexpr bool operator==(int x) const { return true; } };
1084  struct B { B(); A& x; };
1085  static_assert(B().x == 3, "");  // expected-error {{constant expression}} expected-note {{non-literal type 'PR11595::B' cannot be used in a constant expression}}
1086
1087  constexpr bool f(int k) { // expected-error {{constexpr function never produces a constant expression}}
1088    return B().x == k; // expected-note {{non-literal type 'PR11595::B' cannot be used in a constant expression}}
1089  }
1090}
1091
1092namespace ExprWithCleanups {
1093  struct A { A(); ~A(); int get(); };
1094  constexpr int get(bool FromA) { return FromA ? A().get() : 1; }
1095  constexpr int n = get(false);
1096}
1097
1098namespace Volatile {
1099
1100volatile constexpr int n1 = 0; // expected-note {{here}}
1101volatile const int n2 = 0; // expected-note {{here}}
1102int n3 = 37; // expected-note {{declared here}}
1103
1104constexpr int m1 = n1; // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}}
1105constexpr int m2 = n2; // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}}
1106constexpr int m1b = const_cast<const int&>(n1); // expected-error {{constant expression}} expected-note {{read of volatile object 'n1'}}
1107constexpr int m2b = const_cast<const int&>(n2); // expected-error {{constant expression}} expected-note {{read of volatile object 'n2'}}
1108
1109struct T { int n; };
1110const T t = { 42 }; // expected-note {{declared here}}
1111
1112constexpr int f(volatile int &&r) {
1113  return r; // expected-note {{read of volatile-qualified type 'volatile int'}}
1114}
1115constexpr int g(volatile int &&r) {
1116  return const_cast<int&>(r); // expected-note {{read of volatile temporary is not allowed in a constant expression}}
1117}
1118struct S {
1119  int j : f(0); // expected-error {{constant expression}} expected-note {{in call to 'f(0)'}}
1120  int k : g(0); // expected-error {{constant expression}} expected-note {{temporary created here}} expected-note {{in call to 'g(0)'}}
1121  int l : n3; // expected-error {{constant expression}} expected-note {{read of non-const variable}}
1122  int m : t.n; // expected-error {{constant expression}} expected-note {{read of non-constexpr variable}}
1123};
1124
1125}
1126
1127namespace ExternConstexpr {
1128  extern constexpr int n = 0;
1129  extern constexpr int m; // expected-error {{constexpr variable declaration must be a definition}}
1130  void f() {
1131    extern constexpr int i; // expected-error {{constexpr variable declaration must be a definition}}
1132    constexpr int j = 0;
1133    constexpr int k; // expected-error {{default initialization of an object of const type}}
1134  }
1135}
1136
1137namespace ComplexConstexpr {
1138  constexpr _Complex float test1 = {};
1139  constexpr _Complex float test2 = {1};
1140  constexpr _Complex double test3 = {1,2};
1141  constexpr _Complex int test4 = {4};
1142  constexpr _Complex int test5 = 4;
1143  constexpr _Complex int test6 = {5,6};
1144  typedef _Complex float fcomplex;
1145  constexpr fcomplex test7 = fcomplex();
1146
1147  constexpr const double &t2r = __real test3;
1148  constexpr const double &t2i = __imag test3;
1149  static_assert(&t2r + 1 == &t2i, "");
1150  static_assert(t2r == 1.0, "");
1151  static_assert(t2i == 2.0, "");
1152  constexpr const double *t2p = &t2r;
1153  static_assert(t2p[-1] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element -1 of array of 2 elements}}
1154  static_assert(t2p[0] == 1.0, "");
1155  static_assert(t2p[1] == 2.0, "");
1156  static_assert(t2p[2] == 0.0, ""); // expected-error {{constant expr}} expected-note {{one-past-the-end pointer}}
1157  static_assert(t2p[3] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element 3 of array of 2 elements}}
1158  constexpr _Complex float *p = 0;
1159  constexpr float pr = __real *p; // expected-error {{constant expr}} expected-note {{cannot access real component of null}}
1160  constexpr float pi = __imag *p; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of null}}
1161  constexpr const _Complex double *q = &test3 + 1;
1162  constexpr double qr = __real *q; // expected-error {{constant expr}} expected-note {{cannot access real component of pointer past the end}}
1163  constexpr double qi = __imag *q; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of pointer past the end}}
1164
1165  static_assert(__real test6 == 5, "");
1166  static_assert(__imag test6 == 6, "");
1167  static_assert(&__imag test6 == &__real test6 + 1, "");
1168}
1169
1170// _Atomic(T) is exactly like T for the purposes of constant expression
1171// evaluation..
1172namespace Atomic {
1173  constexpr _Atomic int n = 3;
1174
1175  struct S { _Atomic(double) d; };
1176  constexpr S s = { 0.5 };
1177  constexpr double d1 = s.d;
1178  constexpr double d2 = n;
1179  constexpr _Atomic double d3 = n;
1180
1181  constexpr _Atomic(int) n2 = d3;
1182  static_assert(d1 == 0.5, "");
1183  static_assert(d3 == 3.0, "");
1184
1185  namespace PR16056 {
1186    struct TestVar {
1187      _Atomic(int) value;
1188      constexpr TestVar(int value) : value(value) {}
1189    };
1190    constexpr TestVar testVar{-1};
1191    static_assert(testVar.value == -1, "");
1192  }
1193}
1194
1195namespace InstantiateCaseStmt {
1196  template<int x> constexpr int f() { return x; }
1197  template<int x> int g(int c) { switch(c) { case f<x>(): return 1; } return 0; }
1198  int gg(int c) { return g<4>(c); }
1199}
1200
1201namespace ConvertedConstantExpr {
1202  extern int &m;
1203  extern int &n;
1204
1205  constexpr int k = 4;
1206  int &m = const_cast<int&>(k);
1207
1208  // If we have nothing more interesting to say, ensure we don't produce a
1209  // useless note and instead just point to the non-constant subexpression.
1210  enum class E {
1211    em = m,
1212    en = n, // expected-error {{not a constant expression}}
1213    eo = (m +
1214          n // expected-error {{not a constant expression}}
1215          ),
1216    eq = reinterpret_cast<int>((int*)0) // expected-error {{not a constant expression}} expected-note {{reinterpret_cast}}
1217  };
1218}
1219
1220namespace IndirectField {
1221  struct S {
1222    struct { // expected-warning {{GNU extension}}
1223      union { // expected-warning {{declared in an anonymous struct}}
1224        struct { // expected-warning {{GNU extension}} expected-warning {{declared in an anonymous union}}
1225          int a;
1226          int b;
1227        };
1228        int c;
1229      };
1230      int d;
1231    };
1232    union {
1233      int e;
1234      int f;
1235    };
1236    constexpr S(int a, int b, int d, int e) : a(a), b(b), d(d), e(e) {}
1237    constexpr S(int c, int d, int f) : c(c), d(d), f(f) {}
1238  };
1239
1240  constexpr S s1(1, 2, 3, 4);
1241  constexpr S s2(5, 6, 7);
1242
1243  // FIXME: The diagnostics here do a very poor job of explaining which unnamed
1244  // member is active and which is requested.
1245  static_assert(s1.a == 1, "");
1246  static_assert(s1.b == 2, "");
1247  static_assert(s1.c == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1248  static_assert(s1.d == 3, "");
1249  static_assert(s1.e == 4, "");
1250  static_assert(s1.f == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1251
1252  static_assert(s2.a == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1253  static_assert(s2.b == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1254  static_assert(s2.c == 5, "");
1255  static_assert(s2.d == 6, "");
1256  static_assert(s2.e == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1257  static_assert(s2.f == 7, "");
1258}
1259
1260// DR1405: don't allow reading mutable members in constant expressions.
1261namespace MutableMembers {
1262  struct MM {
1263    mutable int n; // expected-note 3{{declared here}}
1264  } constexpr mm = { 4 };
1265  constexpr int mmn = mm.n; // expected-error {{constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}}
1266  int x = (mm.n = 1, 3);
1267  constexpr int mmn2 = mm.n; // expected-error {{constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}}
1268
1269  // Here's one reason why allowing this would be a disaster...
1270  template<int n> struct Id { int k = n; };
1271  int f() {
1272    constexpr MM m = { 0 };
1273    ++m.n;
1274    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}}
1275  }
1276
1277  struct A { int n; };
1278  struct B { mutable A a; }; // expected-note {{here}}
1279  struct C { B b; };
1280  constexpr C c[3] = {};
1281  constexpr int k = c[1].b.a.n; // expected-error {{constant expression}} expected-note {{mutable}}
1282}
1283
1284namespace Fold {
1285
1286  // This macro forces its argument to be constant-folded, even if it's not
1287  // otherwise a constant expression.
1288  #define fold(x) (__builtin_constant_p(x) ? (x) : (x))
1289
1290  constexpr int n = (int)(char*)123; // expected-error {{constant expression}} expected-note {{reinterpret_cast}}
1291  constexpr int m = fold((int)(char*)123); // ok
1292  static_assert(m == 123, "");
1293
1294  #undef fold
1295
1296}
1297
1298namespace DR1454 {
1299
1300constexpr const int &f(const int &n) { return n; }
1301constexpr int k1 = f(0); // ok
1302
1303struct Wrap {
1304  const int &value;
1305};
1306constexpr const Wrap &g(const Wrap &w) { return w; }
1307constexpr int k2 = g({0}).value; // ok
1308
1309// The temporary here has static storage duration, so we can bind a constexpr
1310// reference to it.
1311constexpr const int &i = 1;
1312constexpr const int j = i;
1313static_assert(j == 1, "");
1314
1315// The temporary here is not const, so it can't be read outside the expression
1316// in which it was created (per the C++14 rules, which we use to avoid a C++11
1317// defect).
1318constexpr int &&k = 1; // expected-note {{temporary created here}}
1319constexpr const int l = k; // expected-error {{constant expression}} expected-note {{read of temporary}}
1320
1321void f() {
1322  // The temporary here has automatic storage duration, so we can't bind a
1323  // constexpr reference to it.
1324  constexpr const int &i = 1; // expected-error {{constant expression}} expected-note 2{{temporary}}
1325}
1326
1327}
1328
1329namespace RecursiveOpaqueExpr {
1330  template<typename Iter>
1331  constexpr auto LastNonzero(Iter p, Iter q) -> decltype(+*p) {
1332    return p != q ? (LastNonzero(p+1, q) ?: *p) : 0; // expected-warning {{GNU}}
1333  }
1334
1335  constexpr int arr1[] = { 1, 0, 0, 3, 0, 2, 0, 4, 0, 0 };
1336  static_assert(LastNonzero(begin(arr1), end(arr1)) == 4, "");
1337
1338  constexpr int arr2[] = { 1, 0, 0, 3, 0, 2, 0, 4, 0, 5 };
1339  static_assert(LastNonzero(begin(arr2), end(arr2)) == 5, "");
1340
1341  constexpr int arr3[] = {
1342    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,
1343    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,
1344    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,
1345    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,
1346    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,
1347    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,
1348    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,
1349    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 };
1350  static_assert(LastNonzero(begin(arr3), end(arr3)) == 2, "");
1351}
1352
1353namespace VLASizeof {
1354
1355  void f(int k) {
1356    int arr[k]; // expected-warning {{C99}}
1357    constexpr int n = 1 +
1358        sizeof(arr) // expected-error {{constant expression}}
1359        * 3;
1360  }
1361}
1362
1363namespace CompoundLiteral {
1364  // FIXME:
1365  // We don't model the semantics of this correctly: the compound literal is
1366  // represented as a prvalue in the AST, but actually behaves like an lvalue.
1367  // We treat the compound literal as a temporary and refuse to produce a
1368  // pointer to it. This is OK: we're not required to treat this as a constant
1369  // in C++, and in C we model compound literals as lvalues.
1370  constexpr int *p = (int*)(int[1]){0}; // expected-warning {{C99}} expected-error {{constant expression}} expected-note 2{{temporary}}
1371}
1372
1373namespace Vector {
1374  typedef int __attribute__((vector_size(16))) VI4;
1375  constexpr VI4 f(int n) {
1376    return VI4 { n * 3, n + 4, n - 5, n / 6 };
1377  }
1378  constexpr auto v1 = f(10);
1379
1380  typedef double __attribute__((vector_size(32))) VD4;
1381  constexpr VD4 g(int n) {
1382    return (VD4) { n / 2.0, n + 1.5, n - 5.4, n * 0.9 }; // expected-warning {{C99}}
1383  }
1384  constexpr auto v2 = g(4);
1385}
1386
1387// PR12626, redux
1388namespace InvalidClasses {
1389  void test0() {
1390    struct X; // expected-note {{forward declaration}}
1391    struct Y { bool b; X x; }; // expected-error {{field has incomplete type}}
1392    Y y;
1393    auto& b = y.b;
1394  }
1395}
1396
1397namespace NamespaceAlias {
1398  constexpr int f() {
1399    namespace NS = NamespaceAlias; // expected-warning {{use of this statement in a constexpr function is a C++1y extension}}
1400    return &NS::f != nullptr;
1401  }
1402}
1403
1404// Constructors can be implicitly constexpr, even for a non-literal type.
1405namespace ImplicitConstexpr {
1406  struct Q { Q() = default; Q(const Q&) = default; Q(Q&&) = default; ~Q(); }; // expected-note 3{{here}}
1407  struct R { constexpr R() noexcept; constexpr R(const R&) noexcept; constexpr R(R&&) noexcept; ~R() noexcept; };
1408  struct S { R r; }; // expected-note 3{{here}}
1409  struct T { T(const T&) noexcept; T(T &&) noexcept; ~T() noexcept; };
1410  struct U { T t; }; // expected-note 3{{here}}
1411  static_assert(!__is_literal_type(Q), "");
1412  static_assert(!__is_literal_type(R), "");
1413  static_assert(!__is_literal_type(S), "");
1414  static_assert(!__is_literal_type(T), "");
1415  static_assert(!__is_literal_type(U), "");
1416  struct Test {
1417    friend Q::Q() noexcept; // expected-error {{follows constexpr}}
1418    friend Q::Q(Q&&) noexcept; // expected-error {{follows constexpr}}
1419    friend Q::Q(const Q&) noexcept; // expected-error {{follows constexpr}}
1420    friend S::S() noexcept; // expected-error {{follows constexpr}}
1421    friend S::S(S&&) noexcept; // expected-error {{follows constexpr}}
1422    friend S::S(const S&) noexcept; // expected-error {{follows constexpr}}
1423    friend constexpr U::U() noexcept; // expected-error {{follows non-constexpr}}
1424    friend constexpr U::U(U&&) noexcept; // expected-error {{follows non-constexpr}}
1425    friend constexpr U::U(const U&) noexcept; // expected-error {{follows non-constexpr}}
1426  };
1427}
1428
1429// Indirectly test that an implicit lvalue to xvalue conversion performed for
1430// an NRVO move operation isn't implemented as CK_LValueToRValue.
1431namespace PR12826 {
1432  struct Foo {};
1433  constexpr Foo id(Foo x) { return x; }
1434  constexpr Foo res(id(Foo()));
1435}
1436
1437namespace PR13273 {
1438  struct U {
1439    int t;
1440    U() = default;
1441  };
1442
1443  struct S : U {
1444    S() = default;
1445  };
1446
1447  // S's default constructor isn't constexpr, because U's default constructor
1448  // doesn't initialize 't', but it's trivial, so value-initialization doesn't
1449  // actually call it.
1450  static_assert(S{}.t == 0, "");
1451}
1452
1453namespace PR12670 {
1454  struct S {
1455    constexpr S(int a0) : m(a0) {}
1456    constexpr S() : m(6) {}
1457    int m;
1458  };
1459  constexpr S x[3] = { {4}, 5 };
1460  static_assert(x[0].m == 4, "");
1461  static_assert(x[1].m == 5, "");
1462  static_assert(x[2].m == 6, "");
1463}
1464
1465// Indirectly test that an implicit lvalue-to-rvalue conversion is performed
1466// when a conditional operator has one argument of type void and where the other
1467// is a glvalue of class type.
1468namespace ConditionalLValToRVal {
1469  struct A {
1470    constexpr A(int a) : v(a) {}
1471    int v;
1472  };
1473
1474  constexpr A f(const A &a) {
1475    return a.v == 0 ? throw a : a;
1476  }
1477
1478  constexpr A a(4);
1479  static_assert(f(a).v == 4, "");
1480}
1481
1482namespace TLS {
1483  __thread int n;
1484  int m;
1485
1486  constexpr bool b = &n == &n;
1487
1488  constexpr int *p = &n; // expected-error{{constexpr variable 'p' must be initialized by a constant expression}}
1489
1490  constexpr int *f() { return &n; }
1491  constexpr int *q = f(); // expected-error{{constexpr variable 'q' must be initialized by a constant expression}}
1492  constexpr bool c = f() == f();
1493
1494  constexpr int *g() { return &m; }
1495  constexpr int *r = g();
1496}
1497
1498namespace Void {
1499  constexpr void f() { return; } // expected-error{{constexpr function's return type 'void' is not a literal type}}
1500
1501  void assert_failed(const char *msg, const char *file, int line); // expected-note {{declared here}}
1502#define ASSERT(expr) ((expr) ? static_cast<void>(0) : assert_failed(#expr, __FILE__, __LINE__))
1503  template<typename T, size_t S>
1504  constexpr T get(T (&a)[S], size_t k) {
1505    return ASSERT(k > 0 && k < S), a[k]; // expected-note{{non-constexpr function 'assert_failed'}}
1506  }
1507#undef ASSERT
1508  template int get(int (&a)[4], size_t);
1509  constexpr int arr[] = { 4, 1, 2, 3, 4 };
1510  static_assert(get(arr, 1) == 1, "");
1511  static_assert(get(arr, 4) == 4, "");
1512  static_assert(get(arr, 0) == 4, ""); // expected-error{{not an integral constant expression}} \
1513  // expected-note{{in call to 'get(arr, 0)'}}
1514}
1515
1516namespace std { struct type_info; }
1517
1518namespace TypeId {
1519  struct A { virtual ~A(); };
1520  A f();
1521  A &g();
1522  constexpr auto &x = typeid(f());
1523  constexpr auto &y = typeid(g()); // expected-error{{constant expression}} \
1524  // expected-note{{typeid applied to expression of polymorphic type 'TypeId::A' is not allowed in a constant expression}}
1525}
1526
1527namespace PR14203 {
1528  struct duration {
1529    constexpr duration() {}
1530    constexpr operator int() const { return 0; }
1531  };
1532  template<typename T> void f() {
1533    // If we want to evaluate this at the point of the template definition, we
1534    // need to trigger the implicit definition of the move constructor at that
1535    // point.
1536    // FIXME: C++ does not permit us to implicitly define it at the appropriate
1537    // times, since it is only allowed to be implicitly defined when it is
1538    // odr-used.
1539    constexpr duration d = duration();
1540  }
1541  // FIXME: It's unclear whether this is valid. On the one hand, we're not
1542  // allowed to generate a move constructor. On the other hand, if we did,
1543  // this would be a constant expression. For now, we generate a move
1544  // constructor here.
1545  int n = sizeof(short{duration(duration())});
1546}
1547
1548namespace ArrayEltInit {
1549  struct A {
1550    constexpr A() : p(&p) {}
1551    void *p;
1552  };
1553  constexpr A a[10];
1554  static_assert(a[0].p == &a[0].p, "");
1555  static_assert(a[9].p == &a[9].p, "");
1556  static_assert(a[0].p != &a[9].p, "");
1557  static_assert(a[9].p != &a[0].p, "");
1558
1559  constexpr A b[10] = {};
1560  static_assert(b[0].p == &b[0].p, "");
1561  static_assert(b[9].p == &b[9].p, "");
1562  static_assert(b[0].p != &b[9].p, "");
1563  static_assert(b[9].p != &b[0].p, "");
1564}
1565
1566namespace PR15884 {
1567  struct S {};
1568  constexpr S f() { return {}; }
1569  constexpr S *p = &f();
1570  // expected-error@-1 {{taking the address of a temporary}}
1571  // expected-error@-2 {{constexpr variable 'p' must be initialized by a constant expression}}
1572  // expected-note@-3 {{pointer to temporary is not a constant expression}}
1573  // expected-note@-4 {{temporary created here}}
1574}
1575
1576namespace AfterError {
1577  // FIXME: Suppress the 'no return statements' diagnostic if the body is invalid.
1578  constexpr int error() { // expected-error {{no return statement}}
1579    return foobar; // expected-error {{undeclared identifier}}
1580  }
1581  constexpr int k = error(); // expected-error {{must be initialized by a constant expression}}
1582}
1583