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