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