constant-expression-cxx11.cpp revision de31aa7f0ef71f5c162372e319cbc03c0924f074
1// RUN: %clang_cc1 -triple i686-linux -Wno-string-plus-int -fsyntax-only -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() { 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 which 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 which 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 which 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 which 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
342}
343
344constexpr int strcmp_ce(const char *p, const char *q) {
345  return (!*p || *p != *q) ? *p - *q : strcmp_ce(p+1, q+1);
346}
347
348namespace StringLiteral {
349
350template<typename Char>
351constexpr int MangleChars(const Char *p) {
352  return *p + 3 * (*p ? MangleChars(p+1) : 0);
353}
354
355static_assert(MangleChars("constexpr!") == 1768383, "");
356static_assert(MangleChars(u8"constexpr!") == 1768383, "");
357static_assert(MangleChars(L"constexpr!") == 1768383, "");
358static_assert(MangleChars(u"constexpr!") == 1768383, "");
359static_assert(MangleChars(U"constexpr!") == 1768383, "");
360
361constexpr char c0 = "nought index"[0];
362constexpr char c1 = "nice index"[10];
363constexpr 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}}
364constexpr 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}}
365constexpr char c4 = ((char*)(int*)"no reinterpret_casts allowed")[14]; // expected-error {{must be initialized by a constant expression}} expected-note {{cast which performs the conversions of a reinterpret_cast}}
366
367constexpr const char *p = "test" + 2;
368static_assert(*p == 's', "");
369
370constexpr const char *max_iter(const char *a, const char *b) {
371  return *a < *b ? b : a;
372}
373constexpr const char *max_element(const char *a, const char *b) {
374  return (a+1 >= b) ? a : max_iter(a, max_element(a+1, b));
375}
376
377constexpr char str[] = "the quick brown fox jumped over the lazy dog";
378constexpr const char *max = max_element(begin(str), end(str));
379static_assert(*max == 'z', "");
380static_assert(max == str + 38, "");
381
382static_assert(strcmp_ce("hello world", "hello world") == 0, "");
383static_assert(strcmp_ce("hello world", "hello clang") > 0, "");
384static_assert(strcmp_ce("constexpr", "test") < 0, "");
385static_assert(strcmp_ce("", " ") < 0, "");
386
387struct S {
388  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}}
389};
390
391struct T {
392  char c[6];
393  constexpr T() : c{"foo"} {}
394};
395constexpr T t;
396
397static_assert(t.c[0] == 'f', "");
398static_assert(t.c[1] == 'o', "");
399static_assert(t.c[2] == 'o', "");
400static_assert(t.c[3] == 0, "");
401static_assert(t.c[4] == 0, "");
402static_assert(t.c[5] == 0, "");
403static_assert(t.c[6] == 0, ""); // expected-error {{constant expression}} expected-note {{one-past-the-end}}
404
405struct U {
406  wchar_t chars[6];
407  int n;
408} constexpr u = { { L"test" }, 0 };
409static_assert(u.chars[2] == L's', "");
410
411struct V {
412  char c[4];
413  constexpr V() : c("hi!") {}
414};
415static_assert(V().c[1] == "i"[0], "");
416
417}
418
419namespace Array {
420
421template<typename Iter>
422constexpr auto Sum(Iter begin, Iter end) -> decltype(+*begin) {
423  return begin == end ? 0 : *begin + Sum(begin+1, end);
424}
425
426constexpr int xs[] = { 1, 2, 3, 4, 5 };
427constexpr int ys[] = { 5, 4, 3, 2, 1 };
428constexpr int sum_xs = Sum(begin(xs), end(xs));
429static_assert(sum_xs == 15, "");
430
431constexpr int ZipFoldR(int (*F)(int x, int y, int c), int n,
432                       const int *xs, const int *ys, int c) {
433  return n ? F(
434               *xs, // expected-note {{read of dereferenced one-past-the-end pointer}}
435               *ys,
436               ZipFoldR(F, n-1, xs+1, ys+1, c)) // \
437      expected-note {{in call to 'ZipFoldR(&SubMul, 2, &xs[4], &ys[4], 1)'}} \
438      expected-note {{in call to 'ZipFoldR(&SubMul, 1, &xs[5], &ys[5], 1)'}}
439           : c;
440}
441constexpr int MulAdd(int x, int y, int c) { return x * y + c; }
442constexpr int InnerProduct = ZipFoldR(MulAdd, 5, xs, ys, 0);
443static_assert(InnerProduct == 35, "");
444
445constexpr int SubMul(int x, int y, int c) { return (x - y) * c; }
446constexpr int DiffProd = ZipFoldR(SubMul, 2, xs+3, ys+3, 1);
447static_assert(DiffProd == 8, "");
448static_assert(ZipFoldR(SubMul, 3, xs+3, ys+3, 1), ""); // \
449      expected-error {{constant expression}} \
450      expected-note {{in call to 'ZipFoldR(&SubMul, 3, &xs[3], &ys[3], 1)'}}
451
452constexpr const int *p = xs + 3;
453constexpr int xs4 = p[1]; // ok
454constexpr int xs5 = p[2]; // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
455constexpr int xs6 = p[3]; // expected-error {{constant expression}} expected-note {{cannot refer to element 6}}
456constexpr int xs0 = p[-3]; // ok
457constexpr int xs_1 = p[-4]; // expected-error {{constant expression}} expected-note {{cannot refer to element -1}}
458
459constexpr int zs[2][2][2][2] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
460static_assert(zs[0][0][0][0] == 1, "");
461static_assert(zs[1][1][1][1] == 16, "");
462static_assert(zs[0][0][0][2] == 3, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
463static_assert((&zs[0][0][0][2])[-1] == 2, "");
464static_assert(**(**(zs + 1) + 1) == 11, "");
465static_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}}
466static_assert(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][2] - 2) == 11, "");
467constexpr 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}}
468
469constexpr int fail(const int &p) {
470  return (&p)[64]; // expected-note {{cannot refer to element 64 of array of 2 elements}}
471}
472static_assert(fail(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][2] - 2)) == 11, ""); // \
473expected-error {{static_assert expression is not an integral constant expression}} \
474expected-note {{in call to 'fail(zs[1][0][1][0])'}}
475
476constexpr int arr[40] = { 1, 2, 3, [8] = 4 }; // expected-warning {{C99 feature}}
477constexpr int SumNonzero(const int *p) {
478  return *p + (*p ? SumNonzero(p+1) : 0);
479}
480constexpr int CountZero(const int *p, const int *q) {
481  return p == q ? 0 : (*p == 0) + CountZero(p+1, q);
482}
483static_assert(SumNonzero(arr) == 6, "");
484static_assert(CountZero(arr, arr + 40) == 36, "");
485
486struct ArrayElem {
487  constexpr ArrayElem() : n(0) {}
488  int n;
489  constexpr int f() { return n; }
490};
491struct ArrayRVal {
492  constexpr ArrayRVal() {}
493  ArrayElem elems[10];
494};
495static_assert(ArrayRVal().elems[3].f() == 0, "");
496
497constexpr int selfref[2][2][2] = {
498  selfref[1][1][1] + 1, selfref[0][0][0] + 1,
499  selfref[1][0][1] + 1, selfref[0][1][0] + 1,
500  selfref[1][0][0] + 1, selfref[0][1][1] + 1 };
501static_assert(selfref[0][0][0] == 1, "");
502static_assert(selfref[0][0][1] == 2, "");
503static_assert(selfref[0][1][0] == 1, "");
504static_assert(selfref[0][1][1] == 2, "");
505static_assert(selfref[1][0][0] == 1, "");
506static_assert(selfref[1][0][1] == 3, "");
507static_assert(selfref[1][1][0] == 0, "");
508static_assert(selfref[1][1][1] == 0, "");
509
510}
511
512namespace DependentValues {
513
514struct I { int n; typedef I V[10]; };
515I::V x, y;
516template<bool B> struct S {
517  int k;
518  void f() {
519    I::V &cells = B ? x : y;
520    I &i = cells[k];
521    switch (i.n) {}
522  }
523};
524
525}
526
527namespace Class {
528
529struct A { constexpr A(int a, int b) : k(a + b) {} int k; };
530constexpr int fn(const A &a) { return a.k; }
531static_assert(fn(A(4,5)) == 9, "");
532
533struct B { int n; int m; } constexpr b = { 0, b.n }; // expected-warning {{uninitialized}}
534struct C {
535  constexpr C(C *this_) : m(42), n(this_->m) {} // ok
536  int m, n;
537};
538struct D {
539  C c;
540  constexpr D() : c(&c) {}
541};
542static_assert(D().c.n == 42, "");
543
544struct E {
545  constexpr E() : p(&p) {}
546  void *p;
547};
548constexpr const E &e1 = E(); // expected-error {{constant expression}} expected-note {{reference to temporary is not a constant expression}} expected-note {{temporary created here}}
549// This is a constant expression if we elide the copy constructor call, and
550// is not a constant expression if we don't! But we do, so it is.
551constexpr E e2 = E();
552static_assert(e2.p == &e2.p, "");
553constexpr E e3;
554static_assert(e3.p == &e3.p, "");
555
556extern const class F f;
557struct F {
558  constexpr F() : p(&f.p) {}
559  const void *p;
560};
561constexpr F f;
562
563struct G {
564  struct T {
565    constexpr T(T *p) : u1(), u2(p) {}
566    union U1 {
567      constexpr U1() {}
568      int a, b = 42;
569    } u1;
570    union U2 {
571      constexpr U2(T *p) : c(p->u1.b) {}
572      int c, d;
573    } u2;
574  } t;
575  constexpr G() : t(&t) {}
576} constexpr g;
577
578static_assert(g.t.u1.a == 42, ""); // expected-error {{constant expression}} expected-note {{read of member 'a' of union with active member 'b'}}
579static_assert(g.t.u1.b == 42, "");
580static_assert(g.t.u2.c == 42, "");
581static_assert(g.t.u2.d == 42, ""); // expected-error {{constant expression}} expected-note {{read of member 'd' of union with active member 'c'}}
582
583struct S {
584  int a, b;
585  const S *p;
586  double d;
587  const char *q;
588
589  constexpr S(int n, const S *p) : a(5), b(n), p(p), d(n), q("hello") {}
590};
591
592S global(43, &global);
593
594static_assert(S(15, &global).b == 15, "");
595
596constexpr bool CheckS(const S &s) {
597  return s.a == 5 && s.b == 27 && s.p == &global && s.d == 27. && s.q[3] == 'l';
598}
599static_assert(CheckS(S(27, &global)), "");
600
601struct Arr {
602  char arr[3];
603  constexpr Arr() : arr{'x', 'y', 'z'} {}
604};
605constexpr int hash(Arr &&a) {
606  return a.arr[0] + a.arr[1] * 0x100 + a.arr[2] * 0x10000;
607}
608constexpr int k = hash(Arr());
609static_assert(k == 0x007a7978, "");
610
611
612struct AggregateInit {
613  const char &c;
614  int n;
615  double d;
616  int arr[5];
617  void *p;
618};
619
620constexpr AggregateInit agg1 = { "hello"[0] };
621
622static_assert(strcmp_ce(&agg1.c, "hello") == 0, "");
623static_assert(agg1.n == 0, "");
624static_assert(agg1.d == 0.0, "");
625static_assert(agg1.arr[-1] == 0, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element -1}}
626static_assert(agg1.arr[0] == 0, "");
627static_assert(agg1.arr[4] == 0, "");
628static_assert(agg1.arr[5] == 0, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end}}
629static_assert(agg1.p == nullptr, "");
630
631static constexpr const unsigned char uc[] = { "foo" };
632static_assert(uc[0] == 'f', "");
633static_assert(uc[3] == 0, "");
634
635namespace SimpleDerivedClass {
636
637struct B {
638  constexpr B(int n) : a(n) {}
639  int a;
640};
641struct D : B {
642  constexpr D(int n) : B(n) {}
643};
644constexpr D d(3);
645static_assert(d.a == 3, "");
646
647}
648
649struct Bottom { constexpr Bottom() {} };
650struct Base : Bottom {
651  constexpr Base(int a = 42, const char *b = "test") : a(a), b(b) {}
652  int a;
653  const char *b;
654};
655struct Base2 : Bottom {
656  constexpr Base2(const int &r) : r(r) {}
657  int q = 123;
658  const int &r;
659};
660struct Derived : Base, Base2 {
661  constexpr Derived() : Base(76), Base2(a) {}
662  int c = r + b[1];
663};
664
665constexpr bool operator==(const Base &a, const Base &b) {
666  return a.a == b.a && strcmp_ce(a.b, b.b) == 0;
667}
668
669constexpr Base base;
670constexpr Base base2(76);
671constexpr Derived derived;
672static_assert(derived.a == 76, "");
673static_assert(derived.b[2] == 's', "");
674static_assert(derived.c == 76 + 'e', "");
675static_assert(derived.q == 123, "");
676static_assert(derived.r == 76, "");
677static_assert(&derived.r == &derived.a, "");
678
679static_assert(!(derived == base), "");
680static_assert(derived == base2, "");
681
682constexpr Bottom &bot1 = (Base&)derived;
683constexpr Bottom &bot2 = (Base2&)derived;
684static_assert(&bot1 != &bot2, "");
685
686constexpr Bottom *pb1 = (Base*)&derived;
687constexpr Bottom *pb2 = (Base2*)&derived;
688static_assert(&pb1 != &pb2, "");
689static_assert(pb1 == &bot1, "");
690static_assert(pb2 == &bot2, "");
691
692constexpr Base2 &fail = (Base2&)bot1; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base2'}}
693constexpr Base &fail2 = (Base&)*pb2; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base'}}
694constexpr Base2 &ok2 = (Base2&)bot2;
695static_assert(&ok2 == &derived, "");
696
697constexpr Base2 *pfail = (Base2*)pb1; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base2'}}
698constexpr Base *pfail2 = (Base*)&bot2; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base'}}
699constexpr Base2 *pok2 = (Base2*)pb2;
700static_assert(pok2 == &derived, "");
701static_assert(&ok2 == pok2, "");
702static_assert((Base2*)(Derived*)(Base*)pb1 == pok2, "");
703static_assert((Derived*)(Base*)pb1 == (Derived*)pok2, "");
704
705constexpr Base *nullB = 42 - 6 * 7;
706static_assert((Bottom*)nullB == 0, "");
707static_assert((Derived*)nullB == 0, "");
708static_assert((void*)(Bottom*)nullB == (void*)(Derived*)nullB, "");
709
710namespace ConversionOperators {
711
712struct T {
713  constexpr T(int n) : k(5*n - 3) {}
714  constexpr operator int() { return k; }
715  int k;
716};
717
718struct S {
719  constexpr S(int n) : k(2*n + 1) {}
720  constexpr operator int() { return k; }
721  constexpr operator T() { return T(k); }
722  int k;
723};
724
725constexpr bool check(T a, T b) { return a == b.k; }
726
727static_assert(S(5) == 11, "");
728static_assert(check(S(5), 11), "");
729
730}
731
732}
733
734namespace Temporaries {
735
736struct S {
737  constexpr S() {}
738  constexpr int f();
739};
740struct T : S {
741  constexpr T(int n) : S(), n(n) {}
742  int n;
743};
744constexpr int S::f() {
745  // 'this' must be the postfix-expression in a class member access expression,
746  // so we can't just use
747  //   return static_cast<T*>(this)->n;
748  return this->*(int(S::*))&T::n;
749}
750// The T temporary is implicitly cast to an S subobject, but we can recover the
751// T full-object via a base-to-derived cast, or a derived-to-base-casted member
752// pointer.
753static_assert(T(3).f() == 3, "");
754
755constexpr int f(const S &s) {
756  return static_cast<const T&>(s).n;
757}
758constexpr int n = f(T(5));
759static_assert(f(T(5)) == 5, "");
760
761constexpr bool b(int n) { return &n; }
762static_assert(b(0), "");
763
764}
765
766namespace Union {
767
768union U {
769  int a;
770  int b;
771};
772
773constexpr U u[4] = { { .a = 0 }, { .b = 1 }, { .a = 2 }, { .b = 3 } }; // expected-warning 4{{C99 feature}}
774static_assert(u[0].a == 0, "");
775static_assert(u[0].b, ""); // expected-error {{constant expression}} expected-note {{read of member 'b' of union with active member 'a'}}
776static_assert(u[1].b == 1, "");
777static_assert((&u[1].b)[1] == 2, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
778static_assert(*(&(u[1].b) + 1 + 1) == 3, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element 2 of non-array object}}
779static_assert((&(u[1]) + 1 + 1)->b == 3, "");
780
781constexpr U v = {};
782static_assert(v.a == 0, "");
783
784union Empty {};
785constexpr Empty e = {};
786
787// Make sure we handle trivial copy constructors for unions.
788constexpr U x = {42};
789constexpr U y = x;
790static_assert(y.a == 42, "");
791static_assert(y.b == 42, ""); // expected-error {{constant expression}} expected-note {{'b' of union with active member 'a'}}
792
793}
794
795namespace MemberPointer {
796  struct A {
797    constexpr A(int n) : n(n) {}
798    int n;
799    constexpr int f() { return n + 3; }
800  };
801  constexpr A a(7);
802  static_assert(A(5).*&A::n == 5, "");
803  static_assert((&a)->*&A::n == 7, "");
804  static_assert((A(8).*&A::f)() == 11, "");
805  static_assert(((&a)->*&A::f)() == 10, "");
806
807  struct B : A {
808    constexpr B(int n, int m) : A(n), m(m) {}
809    int m;
810    constexpr int g() { return n + m + 1; }
811  };
812  constexpr B b(9, 13);
813  static_assert(B(4, 11).*&A::n == 4, "");
814  static_assert(B(4, 11).*&B::m == 11, "");
815  static_assert(B(4, 11).*(int(A::*))&B::m == 11, "");
816  static_assert((&b)->*&A::n == 9, "");
817  static_assert((&b)->*&B::m == 13, "");
818  static_assert((&b)->*(int(A::*))&B::m == 13, "");
819  static_assert((B(4, 11).*&A::f)() == 7, "");
820  static_assert((B(4, 11).*&B::g)() == 16, "");
821  static_assert((B(4, 11).*(int(A::*)()const)&B::g)() == 16, "");
822  static_assert(((&b)->*&A::f)() == 12, "");
823  static_assert(((&b)->*&B::g)() == 23, "");
824  static_assert(((&b)->*(int(A::*)()const)&B::g)() == 23, "");
825
826  struct S {
827    constexpr S(int m, int n, int (S::*pf)() const, int S::*pn) :
828      m(m), n(n), pf(pf), pn(pn) {}
829    constexpr S() : m(), n(), pf(&S::f), pn(&S::n) {}
830
831    constexpr int f() { return this->*pn; }
832    virtual int g() const;
833
834    int m, n;
835    int (S::*pf)() const;
836    int S::*pn;
837  };
838
839  constexpr int S::*pm = &S::m;
840  constexpr int S::*pn = &S::n;
841  constexpr int (S::*pf)() const = &S::f;
842  constexpr int (S::*pg)() const = &S::g;
843
844  constexpr S s(2, 5, &S::f, &S::m);
845
846  static_assert((s.*&S::f)() == 2, "");
847  static_assert((s.*s.pf)() == 2, "");
848
849  static_assert(pf == &S::f, "");
850  static_assert(pf == s.*&S::pf, "");
851  static_assert(pm == &S::m, "");
852  static_assert(pm != pn, "");
853  static_assert(s.pn != pn, "");
854  static_assert(s.pn == pm, "");
855  static_assert(pg != nullptr, "");
856  static_assert(pf != nullptr, "");
857  static_assert((int S::*)nullptr == nullptr, "");
858  static_assert(pg == pg, ""); // expected-error {{constant expression}} expected-note {{comparison of pointer to virtual member function 'g' has unspecified value}}
859  static_assert(pf != pg, ""); // expected-error {{constant expression}} expected-note {{comparison of pointer to virtual member function 'g' has unspecified value}}
860
861  template<int n> struct T : T<n-1> {};
862  template<> struct T<0> { int n; };
863  template<> struct T<30> : T<29> { int m; };
864
865  T<17> t17;
866  T<30> t30;
867
868  constexpr int (T<10>::*deepn) = &T<0>::n;
869  static_assert(&(t17.*deepn) == &t17.n, "");
870  static_assert(deepn == &T<2>::n, "");
871
872  constexpr int (T<15>::*deepm) = (int(T<10>::*))&T<30>::m;
873  constexpr int *pbad = &(t17.*deepm); // expected-error {{constant expression}}
874  static_assert(&(t30.*deepm) == &t30.m, "");
875  static_assert(deepm == &T<50>::m, "");
876  static_assert(deepm != deepn, "");
877
878  constexpr T<5> *p17_5 = &t17;
879  constexpr T<13> *p17_13 = (T<13>*)p17_5;
880  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>'}}
881  static_assert(&(p17_5->*(int(T<3>::*))deepn) == &t17.n, "");
882  static_assert(&(p17_13->*deepn) == &t17.n, "");
883  constexpr int *pbad2 = &(p17_13->*(int(T<9>::*))deepm); // expected-error {{constant expression}}
884
885  constexpr T<5> *p30_5 = &t30;
886  constexpr T<23> *p30_23 = (T<23>*)p30_5;
887  constexpr T<13> *p30_13 = p30_23;
888  static_assert(&(p30_5->*(int(T<3>::*))deepn) == &t30.n, "");
889  static_assert(&(p30_13->*deepn) == &t30.n, "");
890  static_assert(&(p30_23->*deepn) == &t30.n, "");
891  static_assert(&(p30_5->*(int(T<2>::*))deepm) == &t30.m, "");
892  static_assert(&(((T<17>*)p30_13)->*deepm) == &t30.m, "");
893  static_assert(&(p30_23->*deepm) == &t30.m, "");
894
895  struct Base { int n; };
896  template<int N> struct Mid : Base {};
897  struct Derived : Mid<0>, Mid<1> {};
898  static_assert(&Mid<0>::n == &Mid<1>::n, "");
899  static_assert((int Derived::*)(int Mid<0>::*)&Mid<0>::n !=
900                (int Derived::*)(int Mid<1>::*)&Mid<1>::n, "");
901  static_assert(&Mid<0>::n == (int Mid<0>::*)&Base::n, "");
902}
903
904namespace ArrayBaseDerived {
905
906  struct Base {
907    constexpr Base() {}
908    int n = 0;
909  };
910  struct Derived : Base {
911    constexpr Derived() {}
912    constexpr const int *f() { return &n; }
913  };
914
915  constexpr Derived a[10];
916  constexpr Derived *pd3 = const_cast<Derived*>(&a[3]);
917  constexpr Base *pb3 = const_cast<Derived*>(&a[3]);
918  static_assert(pb3 == pd3, "");
919
920  // pb3 does not point to an array element.
921  constexpr Base *pb4 = pb3 + 1; // ok, one-past-the-end pointer.
922  constexpr int pb4n = pb4->n; // expected-error {{constant expression}} expected-note {{cannot access field of pointer past the end}}
923  constexpr Base *err_pb5 = pb3 + 2; // expected-error {{constant expression}} expected-note {{cannot refer to element 2}} expected-note {{here}}
924  constexpr int err_pb5n = err_pb5->n; // expected-error {{constant expression}} expected-note {{initializer of 'err_pb5' is not a constant expression}}
925  constexpr Base *err_pb2 = pb3 - 1; // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} expected-note {{here}}
926  constexpr int err_pb2n = err_pb2->n; // expected-error {{constant expression}} expected-note {{initializer of 'err_pb2'}}
927  constexpr Base *pb3a = pb4 - 1;
928
929  // pb4 does not point to a Derived.
930  constexpr Derived *err_pd4 = (Derived*)pb4; // expected-error {{constant expression}} expected-note {{cannot access derived class of pointer past the end}}
931  constexpr Derived *pd3a = (Derived*)pb3a;
932  constexpr int pd3n = pd3a->n;
933
934  // pd3a still points to the Derived array.
935  constexpr Derived *pd6 = pd3a + 3;
936  static_assert(pd6 == &a[6], "");
937  constexpr Derived *pd9 = pd6 + 3;
938  constexpr Derived *pd10 = pd6 + 4;
939  constexpr int pd9n = pd9->n; // ok
940  constexpr int err_pd10n = pd10->n; // expected-error {{constant expression}} expected-note {{cannot access base class of pointer past the end}}
941  constexpr int pd0n = pd10[-10].n;
942  constexpr int err_pdminus1n = pd10[-11].n; // expected-error {{constant expression}} expected-note {{cannot refer to element -1 of}}
943
944  constexpr Base *pb9 = pd9;
945  constexpr const int *(Base::*pfb)() const =
946      static_cast<const int *(Base::*)() const>(&Derived::f);
947  static_assert((pb9->*pfb)() == &a[9].n, "");
948}
949
950namespace Complex {
951
952class complex {
953  int re, im;
954public:
955  constexpr complex(int re = 0, int im = 0) : re(re), im(im) {}
956  constexpr complex(const complex &o) : re(o.re), im(o.im) {}
957  constexpr complex operator-() const { return complex(-re, -im); }
958  friend constexpr complex operator+(const complex &l, const complex &r) {
959    return complex(l.re + r.re, l.im + r.im);
960  }
961  friend constexpr complex operator-(const complex &l, const complex &r) {
962    return l + -r;
963  }
964  friend constexpr complex operator*(const complex &l, const complex &r) {
965    return complex(l.re * r.re - l.im * r.im, l.re * r.im + l.im * r.re);
966  }
967  friend constexpr bool operator==(const complex &l, const complex &r) {
968    return l.re == r.re && l.im == r.im;
969  }
970  constexpr bool operator!=(const complex &r) const {
971    return re != r.re || im != r.im;
972  }
973  constexpr int real() const { return re; }
974  constexpr int imag() const { return im; }
975};
976
977constexpr complex i = complex(0, 1);
978constexpr complex k = (3 + 4*i) * (6 - 4*i);
979static_assert(complex(1,0).real() == 1, "");
980static_assert(complex(1,0).imag() == 0, "");
981static_assert(((complex)1).imag() == 0, "");
982static_assert(k.real() == 34, "");
983static_assert(k.imag() == 12, "");
984static_assert(k - 34 == 12*i, "");
985static_assert((complex)1 == complex(1), "");
986static_assert((complex)1 != complex(0, 1), "");
987static_assert(complex(1) == complex(1), "");
988static_assert(complex(1) != complex(0, 1), "");
989constexpr complex makeComplex(int re, int im) { return complex(re, im); }
990static_assert(makeComplex(1,0) == complex(1), "");
991static_assert(makeComplex(1,0) != complex(0, 1), "");
992
993class complex_wrap : public complex {
994public:
995  constexpr complex_wrap(int re, int im = 0) : complex(re, im) {}
996  constexpr complex_wrap(const complex_wrap &o) : complex(o) {}
997};
998
999static_assert((complex_wrap)1 == complex(1), "");
1000static_assert((complex)1 != complex_wrap(0, 1), "");
1001static_assert(complex(1) == complex_wrap(1), "");
1002static_assert(complex_wrap(1) != complex(0, 1), "");
1003constexpr complex_wrap makeComplexWrap(int re, int im) {
1004  return complex_wrap(re, im);
1005}
1006static_assert(makeComplexWrap(1,0) == complex(1), "");
1007static_assert(makeComplexWrap(1,0) != complex(0, 1), "");
1008
1009}
1010
1011namespace PR11595 {
1012  struct A { constexpr bool operator==(int x) { return true; } };
1013  struct B { B(); A& x; };
1014  static_assert(B().x == 3, "");  // expected-error {{constant expression}} expected-note {{non-literal type 'PR11595::B' cannot be used in a constant expression}}
1015
1016  constexpr bool f(int k) { // expected-error {{constexpr function never produces a constant expression}}
1017    return B().x == k; // expected-note {{non-literal type 'PR11595::B' cannot be used in a constant expression}}
1018  }
1019}
1020
1021namespace ExprWithCleanups {
1022  struct A { A(); ~A(); int get(); };
1023  constexpr int get(bool FromA) { return FromA ? A().get() : 1; }
1024  constexpr int n = get(false);
1025}
1026
1027namespace Volatile {
1028
1029volatile constexpr int n1 = 0; // expected-note {{here}}
1030volatile const int n2 = 0; // expected-note {{here}}
1031int n3 = 37; // expected-note {{declared here}}
1032
1033constexpr int m1 = n1; // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}}
1034constexpr int m2 = n2; // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}}
1035constexpr int m1b = const_cast<const int&>(n1); // expected-error {{constant expression}} expected-note {{read of volatile object 'n1'}}
1036constexpr int m2b = const_cast<const int&>(n2); // expected-error {{constant expression}} expected-note {{read of volatile object 'n2'}}
1037
1038struct T { int n; };
1039const T t = { 42 }; // expected-note {{declared here}}
1040
1041constexpr int f(volatile int &&r) {
1042  return r; // expected-note {{read of volatile-qualified type 'volatile int'}}
1043}
1044constexpr int g(volatile int &&r) {
1045  return const_cast<int&>(r); // expected-note {{read of volatile temporary is not allowed in a constant expression}}
1046}
1047struct S {
1048  int j : f(0); // expected-error {{constant expression}} expected-note {{in call to 'f(0)'}}
1049  int k : g(0); // expected-error {{constant expression}} expected-note {{temporary created here}} expected-note {{in call to 'g(0)'}}
1050  int l : n3; // expected-error {{constant expression}} expected-note {{read of non-const variable}}
1051  int m : t.n; // expected-error {{constant expression}} expected-note {{read of non-constexpr variable}}
1052};
1053
1054}
1055
1056namespace ExternConstexpr {
1057  extern constexpr int n = 0;
1058  extern constexpr int m; // expected-error {{constexpr variable declaration must be a definition}}
1059  void f() {
1060    extern constexpr int i; // expected-error {{constexpr variable declaration must be a definition}}
1061    constexpr int j = 0;
1062    constexpr int k; // expected-error {{default initialization of an object of const type}}
1063  }
1064}
1065
1066namespace ComplexConstexpr {
1067  constexpr _Complex float test1 = {};
1068  constexpr _Complex float test2 = {1};
1069  constexpr _Complex double test3 = {1,2};
1070  constexpr _Complex int test4 = {4};
1071  constexpr _Complex int test5 = 4;
1072  constexpr _Complex int test6 = {5,6};
1073  typedef _Complex float fcomplex;
1074  constexpr fcomplex test7 = fcomplex();
1075
1076  constexpr const double &t2r = __real test3;
1077  constexpr const double &t2i = __imag test3;
1078  static_assert(&t2r + 1 == &t2i, "");
1079  static_assert(t2r == 1.0, "");
1080  static_assert(t2i == 2.0, "");
1081  constexpr const double *t2p = &t2r;
1082  static_assert(t2p[-1] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element -1 of array of 2 elements}}
1083  static_assert(t2p[0] == 1.0, "");
1084  static_assert(t2p[1] == 2.0, "");
1085  static_assert(t2p[2] == 0.0, ""); // expected-error {{constant expr}} expected-note {{one-past-the-end pointer}}
1086  static_assert(t2p[3] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element 3 of array of 2 elements}}
1087  constexpr _Complex float *p = 0;
1088  constexpr float pr = __real *p; // expected-error {{constant expr}} expected-note {{cannot access real component of null}}
1089  constexpr float pi = __imag *p; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of null}}
1090  constexpr const _Complex double *q = &test3 + 1;
1091  constexpr double qr = __real *q; // expected-error {{constant expr}} expected-note {{cannot access real component of pointer past the end}}
1092  constexpr double qi = __imag *q; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of pointer past the end}}
1093
1094  static_assert(__real test6 == 5, "");
1095  static_assert(__imag test6 == 6, "");
1096  static_assert(&__imag test6 == &__real test6 + 1, "");
1097}
1098
1099namespace InstantiateCaseStmt {
1100  template<int x> constexpr int f() { return x; }
1101  template<int x> int g(int c) { switch(c) { case f<x>(): return 1; } return 0; }
1102  int gg(int c) { return g<4>(c); }
1103}
1104
1105namespace ConvertedConstantExpr {
1106  extern int &m;
1107  extern int &n;
1108
1109  constexpr int k = 4;
1110  int &m = const_cast<int&>(k);
1111
1112  // If we have nothing more interesting to say, ensure we don't produce a
1113  // useless note and instead just point to the non-constant subexpression.
1114  enum class E {
1115    em = m,
1116    en = n, // expected-error {{not a constant expression}}
1117    eo = (m +
1118          n // expected-error {{not a constant expression}}
1119          ),
1120    eq = reinterpret_cast<int>((int*)0) // expected-error {{not a constant expression}} expected-note {{reinterpret_cast}}
1121  };
1122}
1123
1124namespace IndirectField {
1125  struct S {
1126    struct { // expected-warning {{GNU extension}}
1127      union {
1128        struct { // expected-warning {{GNU extension}}
1129          int a;
1130          int b;
1131        };
1132        int c;
1133      };
1134      int d;
1135    };
1136    union {
1137      int e;
1138      int f;
1139    };
1140    constexpr S(int a, int b, int d, int e) : a(a), b(b), d(d), e(e) {}
1141    constexpr S(int c, int d, int f) : c(c), d(d), f(f) {}
1142  };
1143
1144  constexpr S s1(1, 2, 3, 4);
1145  constexpr S s2(5, 6, 7);
1146
1147  // FIXME: The diagnostics here do a very poor job of explaining which unnamed
1148  // member is active and which is requested.
1149  static_assert(s1.a == 1, "");
1150  static_assert(s1.b == 2, "");
1151  static_assert(s1.c == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1152  static_assert(s1.d == 3, "");
1153  static_assert(s1.e == 4, "");
1154  static_assert(s1.f == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1155
1156  static_assert(s2.a == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1157  static_assert(s2.b == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1158  static_assert(s2.c == 5, "");
1159  static_assert(s2.d == 6, "");
1160  static_assert(s2.e == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}}
1161  static_assert(s2.f == 7, "");
1162}
1163
1164// DR1405: don't allow reading mutable members in constant expressions.
1165namespace MutableMembers {
1166  struct MM {
1167    mutable int n; // expected-note 3{{declared here}}
1168  } constexpr mm = { 4 };
1169  constexpr int mmn = mm.n; // expected-error {{constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}}
1170  int x = (mm.n = 1, 3);
1171  constexpr int mmn2 = mm.n; // expected-error {{constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}}
1172
1173  // Here's one reason why allowing this would be a disaster...
1174  template<int n> struct Id { int k = n; };
1175  int f() {
1176    constexpr MM m = { 0 };
1177    ++m.n;
1178    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}}
1179  }
1180
1181  struct A { int n; };
1182  struct B { mutable A a; }; // expected-note {{here}}
1183  struct C { B b; };
1184  constexpr C c[3] = {};
1185  constexpr int k = c[1].b.a.n; // expected-error {{constant expression}} expected-note {{mutable}}
1186}
1187
1188namespace Fold {
1189
1190  // This macro forces its argument to be constant-folded, even if it's not
1191  // otherwise a constant expression.
1192  #define fold(x) (__builtin_constant_p(x) ? (x) : (x))
1193
1194  constexpr int n = (int)(char*)123; // expected-error {{constant expression}} expected-note {{reinterpret_cast}}
1195  constexpr int m = fold((int)(char*)123); // ok
1196  static_assert(m == 123, "");
1197
1198  #undef fold
1199
1200}
1201
1202namespace DR1454 {
1203
1204constexpr const int &f(const int &n) { return n; }
1205constexpr int k1 = f(0); // ok
1206
1207struct Wrap {
1208  const int &value;
1209};
1210constexpr const Wrap &g(const Wrap &w) { return w; }
1211constexpr int k2 = g({0}).value; // ok
1212
1213constexpr const int &i = 0; // expected-error {{constant expression}} expected-note {{temporary}} expected-note 2{{here}}
1214constexpr const int j = i; // expected-error {{constant expression}} expected-note {{initializer of 'i' is not a constant expression}}
1215
1216}
1217
1218namespace RecursiveOpaqueExpr {
1219  template<typename Iter>
1220  constexpr auto LastNonzero(Iter p, Iter q) -> decltype(+*p) {
1221    return p != q ? (LastNonzero(p+1, q) ?: *p) : 0; // expected-warning {{GNU}}
1222  }
1223
1224  constexpr int arr1[] = { 1, 0, 0, 3, 0, 2, 0, 4, 0, 0 };
1225  static_assert(LastNonzero(begin(arr1), end(arr1)) == 4, "");
1226
1227  constexpr int arr2[] = { 1, 0, 0, 3, 0, 2, 0, 4, 0, 5 };
1228  static_assert(LastNonzero(begin(arr2), end(arr2)) == 5, "");
1229
1230  constexpr int arr3[] = {
1231    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,
1232    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,
1233    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,
1234    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,
1235    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,
1236    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,
1237    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,
1238    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 };
1239  static_assert(LastNonzero(begin(arr3), end(arr3)) == 2, "");
1240}
1241
1242namespace VLASizeof {
1243
1244  void f(int k) {
1245    int arr[k]; // expected-warning {{C99}}
1246    constexpr int n = 1 +
1247        sizeof(arr) // expected-error {{constant expression}}
1248        * 3;
1249  }
1250}
1251
1252namespace CompoundLiteral {
1253  // FIXME:
1254  // We don't model the semantics of this correctly: the compound literal is
1255  // represented as a prvalue in the AST, but actually behaves like an lvalue.
1256  // We treat the compound literal as a temporary and refuse to produce a
1257  // pointer to it. This is OK: we're not required to treat this as a constant
1258  // in C++, and in C we model compound literals as lvalues.
1259  constexpr int *p = (int*)(int[1]){0}; // expected-warning {{C99}} expected-error {{constant expression}} expected-note 2{{temporary}}
1260}
1261
1262namespace Vector {
1263  typedef int __attribute__((vector_size(16))) VI4;
1264  constexpr VI4 f(int n) {
1265    return VI4 { n * 3, n + 4, n - 5, n / 6 };
1266  }
1267  constexpr auto v1 = f(10);
1268
1269  typedef double __attribute__((vector_size(32))) VD4;
1270  constexpr VD4 g(int n) {
1271    return (VD4) { n / 2.0, n + 1.5, n - 5.4, n * 0.9 }; // expected-warning {{C99}}
1272  }
1273  constexpr auto v2 = g(4);
1274}
1275
1276// PR12626, redux
1277namespace InvalidClasses {
1278  void test0() {
1279    struct X; // expected-note {{forward declaration}}
1280    struct Y { bool b; X x; }; // expected-error {{field has incomplete type}}
1281    Y y;
1282    auto& b = y.b;
1283  }
1284}
1285
1286// Constructors can be implicitly constexpr, even for a non-literal type.
1287namespace ImplicitConstexpr {
1288  struct Q { Q() = default; Q(const Q&) = default; Q(Q&&) = default; ~Q(); }; // expected-note 3{{here}}
1289  struct R { constexpr R(); constexpr R(const R&); constexpr R(R&&); ~R(); };
1290  struct S { R r; }; // expected-note 3{{here}}
1291  struct T { T(const T&); T(T &&); ~T(); };
1292  struct U { T t; }; // expected-note 3{{here}}
1293  static_assert(!__is_literal_type(Q), "");
1294  static_assert(!__is_literal_type(R), "");
1295  static_assert(!__is_literal_type(S), "");
1296  static_assert(!__is_literal_type(T), "");
1297  static_assert(!__is_literal_type(U), "");
1298  struct Test {
1299    friend Q::Q() noexcept; // expected-error {{follows constexpr}}
1300    friend Q::Q(Q&&) noexcept; // expected-error {{follows constexpr}}
1301    friend Q::Q(const Q&) noexcept; // expected-error {{follows constexpr}}
1302    friend S::S() noexcept; // expected-error {{follows constexpr}}
1303    friend S::S(S&&) noexcept; // expected-error {{follows constexpr}}
1304    friend S::S(const S&) noexcept; // expected-error {{follows constexpr}}
1305    friend constexpr U::U() noexcept; // expected-error {{follows non-constexpr}}
1306    friend constexpr U::U(U&&) noexcept; // expected-error {{follows non-constexpr}}
1307    friend constexpr U::U(const U&) noexcept; // expected-error {{follows non-constexpr}}
1308  };
1309}
1310
1311// Indirectly test that an implicit lvalue to xvalue conversion performed for
1312// an NRVO move operation isn't implemented as CK_LValueToRValue.
1313namespace PR12826 {
1314  struct Foo {};
1315  constexpr Foo id(Foo x) { return x; }
1316  constexpr Foo res(id(Foo()));
1317}
1318
1319namespace PR13273 {
1320  struct U {
1321    int t;
1322    U() = default;
1323  };
1324
1325  struct S : U {
1326    S() = default;
1327  };
1328
1329  // S's default constructor isn't constexpr, because U's default constructor
1330  // doesn't initialize 't', but it's trivial, so value-initialization doesn't
1331  // actually call it.
1332  static_assert(S{}.t == 0, "");
1333}
1334
1335namespace PR12670 {
1336  struct S {
1337    constexpr S(int a0) : m(a0) {}
1338    constexpr S() : m(6) {}
1339    int m;
1340  };
1341  constexpr S x[3] = { {4}, 5 };
1342  static_assert(x[0].m == 4, "");
1343  static_assert(x[1].m == 5, "");
1344  static_assert(x[2].m == 6, "");
1345}
1346