constant-expression-cxx11.cpp revision 604fb38cd943649bee579103d17ca6cda4aad144
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; 714static_assert((Bottom*)nullB == 0, ""); 715static_assert((Derived*)nullB == 0, ""); 716static_assert((void*)(Bottom*)nullB == (void*)(Derived*)nullB, ""); 717 718namespace ConversionOperators { 719 720struct T { 721 constexpr T(int n) : k(5*n - 3) {} 722 constexpr operator int() { return k; } 723 int k; 724}; 725 726struct S { 727 constexpr S(int n) : k(2*n + 1) {} 728 constexpr operator int() { return k; } 729 constexpr operator T() { return T(k); } 730 int k; 731}; 732 733constexpr bool check(T a, T b) { return a == b.k; } 734 735static_assert(S(5) == 11, ""); 736static_assert(check(S(5), 11), ""); 737 738} 739 740} 741 742namespace Temporaries { 743 744struct S { 745 constexpr S() {} 746 constexpr int f(); 747}; 748struct T : S { 749 constexpr T(int n) : S(), n(n) {} 750 int n; 751}; 752constexpr int S::f() { 753 // 'this' must be the postfix-expression in a class member access expression, 754 // so we can't just use 755 // return static_cast<T*>(this)->n; 756 return this->*(int(S::*))&T::n; 757} 758// The T temporary is implicitly cast to an S subobject, but we can recover the 759// T full-object via a base-to-derived cast, or a derived-to-base-casted member 760// pointer. 761static_assert(T(3).f() == 3, ""); 762 763constexpr int f(const S &s) { 764 return static_cast<const T&>(s).n; 765} 766constexpr int n = f(T(5)); 767static_assert(f(T(5)) == 5, ""); 768 769constexpr bool b(int n) { return &n; } 770static_assert(b(0), ""); 771 772} 773 774namespace Union { 775 776union U { 777 int a; 778 int b; 779}; 780 781constexpr U u[4] = { { .a = 0 }, { .b = 1 }, { .a = 2 }, { .b = 3 } }; // expected-warning 4{{C99 feature}} 782static_assert(u[0].a == 0, ""); 783static_assert(u[0].b, ""); // expected-error {{constant expression}} expected-note {{read of member 'b' of union with active member 'a'}} 784static_assert(u[1].b == 1, ""); 785static_assert((&u[1].b)[1] == 2, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}} 786static_assert(*(&(u[1].b) + 1 + 1) == 3, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element 2 of non-array object}} 787static_assert((&(u[1]) + 1 + 1)->b == 3, ""); 788 789constexpr U v = {}; 790static_assert(v.a == 0, ""); 791 792union Empty {}; 793constexpr Empty e = {}; 794 795// Make sure we handle trivial copy constructors for unions. 796constexpr U x = {42}; 797constexpr U y = x; 798static_assert(y.a == 42, ""); 799static_assert(y.b == 42, ""); // expected-error {{constant expression}} expected-note {{'b' of union with active member 'a'}} 800 801} 802 803namespace MemberPointer { 804 struct A { 805 constexpr A(int n) : n(n) {} 806 int n; 807 constexpr int f() { return n + 3; } 808 }; 809 constexpr A a(7); 810 static_assert(A(5).*&A::n == 5, ""); 811 static_assert((&a)->*&A::n == 7, ""); 812 static_assert((A(8).*&A::f)() == 11, ""); 813 static_assert(((&a)->*&A::f)() == 10, ""); 814 815 struct B : A { 816 constexpr B(int n, int m) : A(n), m(m) {} 817 int m; 818 constexpr int g() { return n + m + 1; } 819 }; 820 constexpr B b(9, 13); 821 static_assert(B(4, 11).*&A::n == 4, ""); 822 static_assert(B(4, 11).*&B::m == 11, ""); 823 static_assert(B(4, 11).*(int(A::*))&B::m == 11, ""); 824 static_assert((&b)->*&A::n == 9, ""); 825 static_assert((&b)->*&B::m == 13, ""); 826 static_assert((&b)->*(int(A::*))&B::m == 13, ""); 827 static_assert((B(4, 11).*&A::f)() == 7, ""); 828 static_assert((B(4, 11).*&B::g)() == 16, ""); 829 static_assert((B(4, 11).*(int(A::*)()const)&B::g)() == 16, ""); 830 static_assert(((&b)->*&A::f)() == 12, ""); 831 static_assert(((&b)->*&B::g)() == 23, ""); 832 static_assert(((&b)->*(int(A::*)()const)&B::g)() == 23, ""); 833 834 struct S { 835 constexpr S(int m, int n, int (S::*pf)() const, int S::*pn) : 836 m(m), n(n), pf(pf), pn(pn) {} 837 constexpr S() : m(), n(), pf(&S::f), pn(&S::n) {} 838 839 constexpr int f() { return this->*pn; } 840 virtual int g() const; 841 842 int m, n; 843 int (S::*pf)() const; 844 int S::*pn; 845 }; 846 847 constexpr int S::*pm = &S::m; 848 constexpr int S::*pn = &S::n; 849 constexpr int (S::*pf)() const = &S::f; 850 constexpr int (S::*pg)() const = &S::g; 851 852 constexpr S s(2, 5, &S::f, &S::m); 853 854 static_assert((s.*&S::f)() == 2, ""); 855 static_assert((s.*s.pf)() == 2, ""); 856 857 static_assert(pf == &S::f, ""); 858 static_assert(pf == s.*&S::pf, ""); 859 static_assert(pm == &S::m, ""); 860 static_assert(pm != pn, ""); 861 static_assert(s.pn != pn, ""); 862 static_assert(s.pn == pm, ""); 863 static_assert(pg != nullptr, ""); 864 static_assert(pf != nullptr, ""); 865 static_assert((int S::*)nullptr == nullptr, ""); 866 static_assert(pg == pg, ""); // expected-error {{constant expression}} expected-note {{comparison of pointer to virtual member function 'g' has unspecified value}} 867 static_assert(pf != pg, ""); // expected-error {{constant expression}} expected-note {{comparison of pointer to virtual member function 'g' has unspecified value}} 868 869 template<int n> struct T : T<n-1> {}; 870 template<> struct T<0> { int n; }; 871 template<> struct T<30> : T<29> { int m; }; 872 873 T<17> t17; 874 T<30> t30; 875 876 constexpr int (T<10>::*deepn) = &T<0>::n; 877 static_assert(&(t17.*deepn) == &t17.n, ""); 878 static_assert(deepn == &T<2>::n, ""); 879 880 constexpr int (T<15>::*deepm) = (int(T<10>::*))&T<30>::m; 881 constexpr int *pbad = &(t17.*deepm); // expected-error {{constant expression}} 882 static_assert(&(t30.*deepm) == &t30.m, ""); 883 static_assert(deepm == &T<50>::m, ""); 884 static_assert(deepm != deepn, ""); 885 886 constexpr T<5> *p17_5 = &t17; 887 constexpr T<13> *p17_13 = (T<13>*)p17_5; 888 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>'}} 889 static_assert(&(p17_5->*(int(T<3>::*))deepn) == &t17.n, ""); 890 static_assert(&(p17_13->*deepn) == &t17.n, ""); 891 constexpr int *pbad2 = &(p17_13->*(int(T<9>::*))deepm); // expected-error {{constant expression}} 892 893 constexpr T<5> *p30_5 = &t30; 894 constexpr T<23> *p30_23 = (T<23>*)p30_5; 895 constexpr T<13> *p30_13 = p30_23; 896 static_assert(&(p30_5->*(int(T<3>::*))deepn) == &t30.n, ""); 897 static_assert(&(p30_13->*deepn) == &t30.n, ""); 898 static_assert(&(p30_23->*deepn) == &t30.n, ""); 899 static_assert(&(p30_5->*(int(T<2>::*))deepm) == &t30.m, ""); 900 static_assert(&(((T<17>*)p30_13)->*deepm) == &t30.m, ""); 901 static_assert(&(p30_23->*deepm) == &t30.m, ""); 902 903 struct Base { int n; }; 904 template<int N> struct Mid : Base {}; 905 struct Derived : Mid<0>, Mid<1> {}; 906 static_assert(&Mid<0>::n == &Mid<1>::n, ""); 907 static_assert((int Derived::*)(int Mid<0>::*)&Mid<0>::n != 908 (int Derived::*)(int Mid<1>::*)&Mid<1>::n, ""); 909 static_assert(&Mid<0>::n == (int Mid<0>::*)&Base::n, ""); 910} 911 912namespace ArrayBaseDerived { 913 914 struct Base { 915 constexpr Base() {} 916 int n = 0; 917 }; 918 struct Derived : Base { 919 constexpr Derived() {} 920 constexpr const int *f() { return &n; } 921 }; 922 923 constexpr Derived a[10]; 924 constexpr Derived *pd3 = const_cast<Derived*>(&a[3]); 925 constexpr Base *pb3 = const_cast<Derived*>(&a[3]); 926 static_assert(pb3 == pd3, ""); 927 928 // pb3 does not point to an array element. 929 constexpr Base *pb4 = pb3 + 1; // ok, one-past-the-end pointer. 930 constexpr int pb4n = pb4->n; // expected-error {{constant expression}} expected-note {{cannot access field of pointer past the end}} 931 constexpr Base *err_pb5 = pb3 + 2; // expected-error {{constant expression}} expected-note {{cannot refer to element 2}} expected-note {{here}} 932 constexpr int err_pb5n = err_pb5->n; // expected-error {{constant expression}} expected-note {{initializer of 'err_pb5' is not a constant expression}} 933 constexpr Base *err_pb2 = pb3 - 1; // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} expected-note {{here}} 934 constexpr int err_pb2n = err_pb2->n; // expected-error {{constant expression}} expected-note {{initializer of 'err_pb2'}} 935 constexpr Base *pb3a = pb4 - 1; 936 937 // pb4 does not point to a Derived. 938 constexpr Derived *err_pd4 = (Derived*)pb4; // expected-error {{constant expression}} expected-note {{cannot access derived class of pointer past the end}} 939 constexpr Derived *pd3a = (Derived*)pb3a; 940 constexpr int pd3n = pd3a->n; 941 942 // pd3a still points to the Derived array. 943 constexpr Derived *pd6 = pd3a + 3; 944 static_assert(pd6 == &a[6], ""); 945 constexpr Derived *pd9 = pd6 + 3; 946 constexpr Derived *pd10 = pd6 + 4; 947 constexpr int pd9n = pd9->n; // ok 948 constexpr int err_pd10n = pd10->n; // expected-error {{constant expression}} expected-note {{cannot access base class of pointer past the end}} 949 constexpr int pd0n = pd10[-10].n; 950 constexpr int err_pdminus1n = pd10[-11].n; // expected-error {{constant expression}} expected-note {{cannot refer to element -1 of}} 951 952 constexpr Base *pb9 = pd9; 953 constexpr const int *(Base::*pfb)() const = 954 static_cast<const int *(Base::*)() const>(&Derived::f); 955 static_assert((pb9->*pfb)() == &a[9].n, ""); 956} 957 958namespace Complex { 959 960class complex { 961 int re, im; 962public: 963 constexpr complex(int re = 0, int im = 0) : re(re), im(im) {} 964 constexpr complex(const complex &o) : re(o.re), im(o.im) {} 965 constexpr complex operator-() const { return complex(-re, -im); } 966 friend constexpr complex operator+(const complex &l, const complex &r) { 967 return complex(l.re + r.re, l.im + r.im); 968 } 969 friend constexpr complex operator-(const complex &l, const complex &r) { 970 return l + -r; 971 } 972 friend constexpr complex operator*(const complex &l, const complex &r) { 973 return complex(l.re * r.re - l.im * r.im, l.re * r.im + l.im * r.re); 974 } 975 friend constexpr bool operator==(const complex &l, const complex &r) { 976 return l.re == r.re && l.im == r.im; 977 } 978 constexpr bool operator!=(const complex &r) const { 979 return re != r.re || im != r.im; 980 } 981 constexpr int real() const { return re; } 982 constexpr int imag() const { return im; } 983}; 984 985constexpr complex i = complex(0, 1); 986constexpr complex k = (3 + 4*i) * (6 - 4*i); 987static_assert(complex(1,0).real() == 1, ""); 988static_assert(complex(1,0).imag() == 0, ""); 989static_assert(((complex)1).imag() == 0, ""); 990static_assert(k.real() == 34, ""); 991static_assert(k.imag() == 12, ""); 992static_assert(k - 34 == 12*i, ""); 993static_assert((complex)1 == complex(1), ""); 994static_assert((complex)1 != complex(0, 1), ""); 995static_assert(complex(1) == complex(1), ""); 996static_assert(complex(1) != complex(0, 1), ""); 997constexpr complex makeComplex(int re, int im) { return complex(re, im); } 998static_assert(makeComplex(1,0) == complex(1), ""); 999static_assert(makeComplex(1,0) != complex(0, 1), ""); 1000 1001class complex_wrap : public complex { 1002public: 1003 constexpr complex_wrap(int re, int im = 0) : complex(re, im) {} 1004 constexpr complex_wrap(const complex_wrap &o) : complex(o) {} 1005}; 1006 1007static_assert((complex_wrap)1 == complex(1), ""); 1008static_assert((complex)1 != complex_wrap(0, 1), ""); 1009static_assert(complex(1) == complex_wrap(1), ""); 1010static_assert(complex_wrap(1) != complex(0, 1), ""); 1011constexpr complex_wrap makeComplexWrap(int re, int im) { 1012 return complex_wrap(re, im); 1013} 1014static_assert(makeComplexWrap(1,0) == complex(1), ""); 1015static_assert(makeComplexWrap(1,0) != complex(0, 1), ""); 1016 1017} 1018 1019namespace PR11595 { 1020 struct A { constexpr bool operator==(int x) { return true; } }; 1021 struct B { B(); A& x; }; 1022 static_assert(B().x == 3, ""); // expected-error {{constant expression}} expected-note {{non-literal type 'PR11595::B' cannot be used in a constant expression}} 1023 1024 constexpr bool f(int k) { // expected-error {{constexpr function never produces a constant expression}} 1025 return B().x == k; // expected-note {{non-literal type 'PR11595::B' cannot be used in a constant expression}} 1026 } 1027} 1028 1029namespace ExprWithCleanups { 1030 struct A { A(); ~A(); int get(); }; 1031 constexpr int get(bool FromA) { return FromA ? A().get() : 1; } 1032 constexpr int n = get(false); 1033} 1034 1035namespace Volatile { 1036 1037volatile constexpr int n1 = 0; // expected-note {{here}} 1038volatile const int n2 = 0; // expected-note {{here}} 1039int n3 = 37; // expected-note {{declared here}} 1040 1041constexpr int m1 = n1; // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}} 1042constexpr int m2 = n2; // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}} 1043constexpr int m1b = const_cast<const int&>(n1); // expected-error {{constant expression}} expected-note {{read of volatile object 'n1'}} 1044constexpr int m2b = const_cast<const int&>(n2); // expected-error {{constant expression}} expected-note {{read of volatile object 'n2'}} 1045 1046struct T { int n; }; 1047const T t = { 42 }; // expected-note {{declared here}} 1048 1049constexpr int f(volatile int &&r) { 1050 return r; // expected-note {{read of volatile-qualified type 'volatile int'}} 1051} 1052constexpr int g(volatile int &&r) { 1053 return const_cast<int&>(r); // expected-note {{read of volatile temporary is not allowed in a constant expression}} 1054} 1055struct S { 1056 int j : f(0); // expected-error {{constant expression}} expected-note {{in call to 'f(0)'}} 1057 int k : g(0); // expected-error {{constant expression}} expected-note {{temporary created here}} expected-note {{in call to 'g(0)'}} 1058 int l : n3; // expected-error {{constant expression}} expected-note {{read of non-const variable}} 1059 int m : t.n; // expected-error {{constant expression}} expected-note {{read of non-constexpr variable}} 1060}; 1061 1062} 1063 1064namespace ExternConstexpr { 1065 extern constexpr int n = 0; 1066 extern constexpr int m; // expected-error {{constexpr variable declaration must be a definition}} 1067 void f() { 1068 extern constexpr int i; // expected-error {{constexpr variable declaration must be a definition}} 1069 constexpr int j = 0; 1070 constexpr int k; // expected-error {{default initialization of an object of const type}} 1071 } 1072} 1073 1074namespace ComplexConstexpr { 1075 constexpr _Complex float test1 = {}; 1076 constexpr _Complex float test2 = {1}; 1077 constexpr _Complex double test3 = {1,2}; 1078 constexpr _Complex int test4 = {4}; 1079 constexpr _Complex int test5 = 4; 1080 constexpr _Complex int test6 = {5,6}; 1081 typedef _Complex float fcomplex; 1082 constexpr fcomplex test7 = fcomplex(); 1083 1084 constexpr const double &t2r = __real test3; 1085 constexpr const double &t2i = __imag test3; 1086 static_assert(&t2r + 1 == &t2i, ""); 1087 static_assert(t2r == 1.0, ""); 1088 static_assert(t2i == 2.0, ""); 1089 constexpr const double *t2p = &t2r; 1090 static_assert(t2p[-1] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element -1 of array of 2 elements}} 1091 static_assert(t2p[0] == 1.0, ""); 1092 static_assert(t2p[1] == 2.0, ""); 1093 static_assert(t2p[2] == 0.0, ""); // expected-error {{constant expr}} expected-note {{one-past-the-end pointer}} 1094 static_assert(t2p[3] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element 3 of array of 2 elements}} 1095 constexpr _Complex float *p = 0; 1096 constexpr float pr = __real *p; // expected-error {{constant expr}} expected-note {{cannot access real component of null}} 1097 constexpr float pi = __imag *p; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of null}} 1098 constexpr const _Complex double *q = &test3 + 1; 1099 constexpr double qr = __real *q; // expected-error {{constant expr}} expected-note {{cannot access real component of pointer past the end}} 1100 constexpr double qi = __imag *q; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of pointer past the end}} 1101 1102 static_assert(__real test6 == 5, ""); 1103 static_assert(__imag test6 == 6, ""); 1104 static_assert(&__imag test6 == &__real test6 + 1, ""); 1105} 1106 1107namespace InstantiateCaseStmt { 1108 template<int x> constexpr int f() { return x; } 1109 template<int x> int g(int c) { switch(c) { case f<x>(): return 1; } return 0; } 1110 int gg(int c) { return g<4>(c); } 1111} 1112 1113namespace ConvertedConstantExpr { 1114 extern int &m; 1115 extern int &n; 1116 1117 constexpr int k = 4; 1118 int &m = const_cast<int&>(k); 1119 1120 // If we have nothing more interesting to say, ensure we don't produce a 1121 // useless note and instead just point to the non-constant subexpression. 1122 enum class E { 1123 em = m, 1124 en = n, // expected-error {{not a constant expression}} 1125 eo = (m + 1126 n // expected-error {{not a constant expression}} 1127 ), 1128 eq = reinterpret_cast<int>((int*)0) // expected-error {{not a constant expression}} expected-note {{reinterpret_cast}} 1129 }; 1130} 1131 1132namespace IndirectField { 1133 struct S { 1134 struct { // expected-warning {{GNU extension}} 1135 union { 1136 struct { // expected-warning {{GNU extension}} 1137 int a; 1138 int b; 1139 }; 1140 int c; 1141 }; 1142 int d; 1143 }; 1144 union { 1145 int e; 1146 int f; 1147 }; 1148 constexpr S(int a, int b, int d, int e) : a(a), b(b), d(d), e(e) {} 1149 constexpr S(int c, int d, int f) : c(c), d(d), f(f) {} 1150 }; 1151 1152 constexpr S s1(1, 2, 3, 4); 1153 constexpr S s2(5, 6, 7); 1154 1155 // FIXME: The diagnostics here do a very poor job of explaining which unnamed 1156 // member is active and which is requested. 1157 static_assert(s1.a == 1, ""); 1158 static_assert(s1.b == 2, ""); 1159 static_assert(s1.c == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}} 1160 static_assert(s1.d == 3, ""); 1161 static_assert(s1.e == 4, ""); 1162 static_assert(s1.f == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}} 1163 1164 static_assert(s2.a == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}} 1165 static_assert(s2.b == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}} 1166 static_assert(s2.c == 5, ""); 1167 static_assert(s2.d == 6, ""); 1168 static_assert(s2.e == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}} 1169 static_assert(s2.f == 7, ""); 1170} 1171 1172// DR1405: don't allow reading mutable members in constant expressions. 1173namespace MutableMembers { 1174 struct MM { 1175 mutable int n; // expected-note 3{{declared here}} 1176 } constexpr mm = { 4 }; 1177 constexpr int mmn = mm.n; // expected-error {{constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}} 1178 int x = (mm.n = 1, 3); 1179 constexpr int mmn2 = mm.n; // expected-error {{constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}} 1180 1181 // Here's one reason why allowing this would be a disaster... 1182 template<int n> struct Id { int k = n; }; 1183 int f() { 1184 constexpr MM m = { 0 }; 1185 ++m.n; 1186 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}} 1187 } 1188 1189 struct A { int n; }; 1190 struct B { mutable A a; }; // expected-note {{here}} 1191 struct C { B b; }; 1192 constexpr C c[3] = {}; 1193 constexpr int k = c[1].b.a.n; // expected-error {{constant expression}} expected-note {{mutable}} 1194} 1195 1196namespace Fold { 1197 1198 // This macro forces its argument to be constant-folded, even if it's not 1199 // otherwise a constant expression. 1200 #define fold(x) (__builtin_constant_p(x) ? (x) : (x)) 1201 1202 constexpr int n = (int)(char*)123; // expected-error {{constant expression}} expected-note {{reinterpret_cast}} 1203 constexpr int m = fold((int)(char*)123); // ok 1204 static_assert(m == 123, ""); 1205 1206 #undef fold 1207 1208} 1209 1210namespace DR1454 { 1211 1212constexpr const int &f(const int &n) { return n; } 1213constexpr int k1 = f(0); // ok 1214 1215struct Wrap { 1216 const int &value; 1217}; 1218constexpr const Wrap &g(const Wrap &w) { return w; } 1219constexpr int k2 = g({0}).value; // ok 1220 1221constexpr const int &i = 0; // expected-error {{constant expression}} expected-note {{temporary}} expected-note 2{{here}} 1222constexpr const int j = i; // expected-error {{constant expression}} expected-note {{initializer of 'i' is not a constant expression}} 1223 1224} 1225 1226namespace RecursiveOpaqueExpr { 1227 template<typename Iter> 1228 constexpr auto LastNonzero(Iter p, Iter q) -> decltype(+*p) { 1229 return p != q ? (LastNonzero(p+1, q) ?: *p) : 0; // expected-warning {{GNU}} 1230 } 1231 1232 constexpr int arr1[] = { 1, 0, 0, 3, 0, 2, 0, 4, 0, 0 }; 1233 static_assert(LastNonzero(begin(arr1), end(arr1)) == 4, ""); 1234 1235 constexpr int arr2[] = { 1, 0, 0, 3, 0, 2, 0, 4, 0, 5 }; 1236 static_assert(LastNonzero(begin(arr2), end(arr2)) == 5, ""); 1237 1238 constexpr int arr3[] = { 1239 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, 1240 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, 1241 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, 1242 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, 1243 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, 1244 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, 1245 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, 1246 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 }; 1247 static_assert(LastNonzero(begin(arr3), end(arr3)) == 2, ""); 1248} 1249 1250namespace VLASizeof { 1251 1252 void f(int k) { 1253 int arr[k]; // expected-warning {{C99}} 1254 constexpr int n = 1 + 1255 sizeof(arr) // expected-error {{constant expression}} 1256 * 3; 1257 } 1258} 1259 1260namespace CompoundLiteral { 1261 // FIXME: 1262 // We don't model the semantics of this correctly: the compound literal is 1263 // represented as a prvalue in the AST, but actually behaves like an lvalue. 1264 // We treat the compound literal as a temporary and refuse to produce a 1265 // pointer to it. This is OK: we're not required to treat this as a constant 1266 // in C++, and in C we model compound literals as lvalues. 1267 constexpr int *p = (int*)(int[1]){0}; // expected-warning {{C99}} expected-error {{constant expression}} expected-note 2{{temporary}} 1268} 1269 1270namespace Vector { 1271 typedef int __attribute__((vector_size(16))) VI4; 1272 constexpr VI4 f(int n) { 1273 return VI4 { n * 3, n + 4, n - 5, n / 6 }; 1274 } 1275 constexpr auto v1 = f(10); 1276 1277 typedef double __attribute__((vector_size(32))) VD4; 1278 constexpr VD4 g(int n) { 1279 return (VD4) { n / 2.0, n + 1.5, n - 5.4, n * 0.9 }; // expected-warning {{C99}} 1280 } 1281 constexpr auto v2 = g(4); 1282} 1283 1284// PR12626, redux 1285namespace InvalidClasses { 1286 void test0() { 1287 struct X; // expected-note {{forward declaration}} 1288 struct Y { bool b; X x; }; // expected-error {{field has incomplete type}} 1289 Y y; 1290 auto& b = y.b; 1291 } 1292} 1293 1294// Constructors can be implicitly constexpr, even for a non-literal type. 1295namespace ImplicitConstexpr { 1296 struct Q { Q() = default; Q(const Q&) = default; Q(Q&&) = default; ~Q(); }; // expected-note 3{{here}} 1297 struct R { constexpr R() noexcept; constexpr R(const R&) noexcept; constexpr R(R&&) noexcept; ~R() noexcept; }; 1298 struct S { R r; }; // expected-note 3{{here}} 1299 struct T { T(const T&) noexcept; T(T &&) noexcept; ~T() noexcept; }; 1300 struct U { T t; }; // expected-note 3{{here}} 1301 static_assert(!__is_literal_type(Q), ""); 1302 static_assert(!__is_literal_type(R), ""); 1303 static_assert(!__is_literal_type(S), ""); 1304 static_assert(!__is_literal_type(T), ""); 1305 static_assert(!__is_literal_type(U), ""); 1306 struct Test { 1307 friend Q::Q() noexcept; // expected-error {{follows constexpr}} 1308 friend Q::Q(Q&&) noexcept; // expected-error {{follows constexpr}} 1309 friend Q::Q(const Q&) noexcept; // expected-error {{follows constexpr}} 1310 friend S::S() noexcept; // expected-error {{follows constexpr}} 1311 friend S::S(S&&) noexcept; // expected-error {{follows constexpr}} 1312 friend S::S(const S&) noexcept; // expected-error {{follows constexpr}} 1313 friend constexpr U::U() noexcept; // expected-error {{follows non-constexpr}} 1314 friend constexpr U::U(U&&) noexcept; // expected-error {{follows non-constexpr}} 1315 friend constexpr U::U(const U&) noexcept; // expected-error {{follows non-constexpr}} 1316 }; 1317} 1318 1319// Indirectly test that an implicit lvalue to xvalue conversion performed for 1320// an NRVO move operation isn't implemented as CK_LValueToRValue. 1321namespace PR12826 { 1322 struct Foo {}; 1323 constexpr Foo id(Foo x) { return x; } 1324 constexpr Foo res(id(Foo())); 1325} 1326 1327namespace PR13273 { 1328 struct U { 1329 int t; 1330 U() = default; 1331 }; 1332 1333 struct S : U { 1334 S() = default; 1335 }; 1336 1337 // S's default constructor isn't constexpr, because U's default constructor 1338 // doesn't initialize 't', but it's trivial, so value-initialization doesn't 1339 // actually call it. 1340 static_assert(S{}.t == 0, ""); 1341} 1342 1343namespace PR12670 { 1344 struct S { 1345 constexpr S(int a0) : m(a0) {} 1346 constexpr S() : m(6) {} 1347 int m; 1348 }; 1349 constexpr S x[3] = { {4}, 5 }; 1350 static_assert(x[0].m == 4, ""); 1351 static_assert(x[1].m == 5, ""); 1352 static_assert(x[2].m == 6, ""); 1353} 1354 1355// Indirectly test that an implicit lvalue-to-rvalue conversion is performed 1356// when a conditional operator has one argument of type void and where the other 1357// is a glvalue of class type. 1358namespace ConditionalLValToRVal { 1359 struct A { 1360 constexpr A(int a) : v(a) {} 1361 int v; 1362 }; 1363 1364 constexpr A f(const A &a) { 1365 return a.v == 0 ? throw a : a; 1366 } 1367 1368 constexpr A a(4); 1369 static_assert(f(a).v == 4, ""); 1370} 1371