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