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