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