1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -triple i686-linux -Wno-string-plus-int -Wno-pointer-arith -Wno-zero-length-array -fsyntax-only -fcxx-exceptions -verify -std=c++11 -pedantic %s -Wno-comment -Wno-tautological-pointer-compare -Wno-bool-conversion 259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace StaticAssertFoldTest { 459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithint x; 69eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(++x, "test"); // expected-error {{not an integral constant expression}} 79eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(false, "test"); // expected-error {{test}} 859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 1059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 111d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smithtypedef decltype(sizeof(char)) size_t; 121d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smith 131d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smithtemplate<typename T> constexpr T id(const T &t) { return t; } 141d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smithtemplate<typename T> constexpr T min(const T &a, const T &b) { 151d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smith return a < b ? a : b; 161d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smith} 171d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smithtemplate<typename T> constexpr T max(const T &a, const T &b) { 181d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smith return a < b ? b : a; 191d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smith} 201d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smithtemplate<typename T, size_t N> constexpr T *begin(T (&xs)[N]) { return xs; } 211d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smithtemplate<typename T, size_t N> constexpr T *end(T (&xs)[N]) { return xs + N; } 2259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 2359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct MemberZero { 24840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr int zero() const { return 0; } 2559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 2659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 2759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace DerivedToVBaseCast { 2859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 2959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct U { int n; }; 3059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct V : U { int n; }; 3159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct A : virtual V { int n; }; 3259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct Aa { int n; }; 3359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct B : virtual A, Aa {}; 3459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct C : virtual A, Aa {}; 3559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct D : B, C {}; 3659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 3759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith D d; 3859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr B *p = &d; 3959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr C *q = &d; 40f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith 419eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((void*)p != (void*)q, ""); 429eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((A*)p == (A*)q, ""); 439eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((Aa*)p != (Aa*)q, ""); 4459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 4559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr B &pp = d; 4659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr C &qq = d; 479eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((void*)&pp != (void*)&qq, ""); 489eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(A&)pp == &(A&)qq, ""); 499eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(Aa&)pp != &(Aa&)qq, ""); 5059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 5159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr V *v = p; 5259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr V *w = q; 5359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr V *x = (A*)p; 549eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(v == w, ""); 559eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(v == x, ""); 5659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 579eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((U*)&d == p, ""); 589eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((U*)&d == q, ""); 599eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((U*)&d == v, ""); 609eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((U*)&d == w, ""); 619eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((U*)&d == x, ""); 6259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 6359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct X {}; 6459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct Y1 : virtual X {}; 6559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct Y2 : X {}; 6659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct Z : Y1, Y2 {}; 6759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith Z z; 689eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((X*)(Y1*)&z != (X*)(Y2*)&z, ""); 6959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 7059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 71f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smithnamespace ConstCast { 72f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smith 73f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smithconstexpr int n1 = 0; 74f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smithconstexpr int n2 = const_cast<int&>(n1); 75f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smithconstexpr int *n3 = const_cast<int*>(&n1); 76f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smithconstexpr int n4 = *const_cast<int*>(&n1); 77f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smithconstexpr const int * const *n5 = const_cast<const int* const*>(&n3); 78f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smithconstexpr int **n6 = const_cast<int**>(&n3); 79f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smithconstexpr int n7 = **n5; 80f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smithconstexpr int n8 = **n6; 81f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smith 8241cb3d90c2114a7df7aa04f80c8be4b62994fb0dRichard Smith// const_cast from prvalue to xvalue. 8341cb3d90c2114a7df7aa04f80c8be4b62994fb0dRichard Smithstruct A { int n; }; 8441cb3d90c2114a7df7aa04f80c8be4b62994fb0dRichard Smithconstexpr int n9 = (const_cast<A&&>(A{123})).n; 8541cb3d90c2114a7df7aa04f80c8be4b62994fb0dRichard Smithstatic_assert(n9 == 123, ""); 8641cb3d90c2114a7df7aa04f80c8be4b62994fb0dRichard Smith 87f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smith} 88f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smith 8959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace TemplateArgumentConversion { 9059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith template<int n> struct IntParam {}; 9159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 9259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith using IntParam0 = IntParam<0>; 931d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smith using IntParam0 = IntParam<id(0)>; 946180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith using IntParam0 = IntParam<MemberZero().zero>; // expected-error {{did you mean to call it with no arguments?}} 9559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 9659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 9759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace CaseStatements { 98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int x; 9959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith void f(int n) { 10059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith switch (n) { 1018ef7b203332b0c8d65876a1f5e6d1db4e6f40e4bRichard Smith case MemberZero().zero: // expected-error {{did you mean to call it with no arguments?}} expected-note {{previous}} 1028ef7b203332b0c8d65876a1f5e6d1db4e6f40e4bRichard Smith case id(0): // expected-error {{duplicate case value '0'}} 10359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return; 104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case __builtin_constant_p(true) ? (__SIZE_TYPE__)&x : 0:; // expected-error {{constant}} 10559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 10659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 10759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 10859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 10959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithextern int &Recurse1; 11016581335fc32abcbc6ab14eda7af38cf759664b7Richard Smithint &Recurse2 = Recurse1; // expected-note {{declared here}} 11116581335fc32abcbc6ab14eda7af38cf759664b7Richard Smithint &Recurse1 = Recurse2; 112099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithconstexpr int &Recurse3 = Recurse2; // expected-error {{must be initialized by a constant expression}} expected-note {{initializer of 'Recurse2' is not a constant expression}} 113099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith 114099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithextern const int RecurseA; 115099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithconst int RecurseB = RecurseA; // expected-note {{declared here}} 116099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithconst int RecurseA = 10; 117099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithconstexpr int RecurseC = RecurseB; // expected-error {{must be initialized by a constant expression}} expected-note {{initializer of 'RecurseB' is not a constant expression}} 11859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 11959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace MemberEnum { 12059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct WithMemberEnum { 12159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith enum E { A = 42 }; 12259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } wme; 12359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 1249eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(wme.A == 42, ""); 12559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 12659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 12759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace DefaultArguments { 12859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 12959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconst int z = int(); 13059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int Sum(int a = 0, const int &b = 0, const int *c = &z, char d = 0) { 13159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return a + b + *c + d; 13259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 13359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconst int four = 4; 13459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int eight = 8; 13559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr const int twentyseven = 27; 1369eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(Sum() == 0, ""); 1379eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(Sum(1) == 1, ""); 1389eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(Sum(1, four) == 5, ""); 1399eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(Sum(1, eight, &twentyseven) == 36, ""); 1409eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(Sum(1, 2, &four, eight) == 15, ""); 14159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 14259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 14359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 14459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace Ellipsis { 14559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 14659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith// Note, values passed through an ellipsis can't actually be used. 14759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int F(int a, ...) { return a; } 1489eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(F(0) == 0, ""); 1499eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(F(1, 0) == 1, ""); 1509eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(F(2, "test") == 2, ""); 1519eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(F(3, &F) == 3, ""); 1527098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithint k = 0; // expected-note {{here}} 1537098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithstatic_assert(F(4, k) == 3, ""); // expected-error {{constant expression}} expected-note {{read of non-const variable 'k'}} 15459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 15559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 15659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 15759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace Recursion { 15859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int fib(int n) { return n > 1 ? fib(n-1) + fib(n-2) : n; } 1599eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(fib(11) == 89, ""); 16059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 16159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int gcd_inner(int a, int b) { 16259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return b == 0 ? a : gcd_inner(b, a % b); 16359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 16459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int gcd(int a, int b) { 16559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return gcd_inner(max(a, b), min(a, b)); 16659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 16759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 1689eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(gcd(1749237, 5628959) == 7, ""); 16959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 17059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 17159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace FunctionCast { 17259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // When folding, we allow functions to be cast to different types. Such 17359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // cast functions cannot be called, even if they're constexpr. 17459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int f() { return 1; } 17559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith typedef double (*DoubleFn)(); 17659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith typedef int (*IntFn)(); 177d7c56e1114bfe7d461786903bb720d2c6efc05a1Richard Smith int a[(int)DoubleFn(f)()]; // expected-error {{variable length array}} expected-warning{{C99 feature}} 17859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int b[(int)IntFn(f)()]; // ok 17959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 18059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 18159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace StaticMemberFunction { 18259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct S { 18359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith static constexpr int k = 42; 18459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith static constexpr int f(int n) { return n * k + 2; } 18559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } s; 18659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 18759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int n = s.f(19); 1889eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(S::f(19) == 800, ""); 1899eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(s.f(19) == 800, ""); 1909eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(n == 800, ""); 1911bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith 1921bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith constexpr int (*sf1)(int) = &S::f; 1931bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith constexpr int (*sf2)(int) = &s.f; 1941bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith constexpr const int *sk = &s.k; 19559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 19659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 19759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace ParameterScopes { 19859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 19959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const int k = 42; 20083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith constexpr const int &ObscureTheTruth(const int &a) { return a; } 201099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith constexpr const int &MaybeReturnJunk(bool b, const int a) { // expected-note 2{{declared here}} 20283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith return ObscureTheTruth(b ? a : k); 20359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 2049eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(MaybeReturnJunk(false, 0) == 42, ""); // ok 20583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith constexpr int a = MaybeReturnJunk(true, 0); // expected-error {{constant expression}} expected-note {{read of variable whose lifetime has ended}} 20659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 20783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith constexpr const int MaybeReturnNonstaticRef(bool b, const int a) { 20883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith return ObscureTheTruth(b ? a : k); 20959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 2109eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(MaybeReturnNonstaticRef(false, 0) == 42, ""); // ok 21183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith constexpr int b = MaybeReturnNonstaticRef(true, 0); // ok 21259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 21359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int InternalReturnJunk(int n) { 21483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith return MaybeReturnJunk(true, n); // expected-note {{read of variable whose lifetime has ended}} 21559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 216099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith constexpr int n3 = InternalReturnJunk(0); // expected-error {{must be initialized by a constant expression}} expected-note {{in call to 'InternalReturnJunk(0)'}} 21759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 21859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int LToR(int &n) { return n; } 21959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int GrabCallersArgument(bool which, int a, int b) { 22059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return LToR(which ? b : a); 22159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 2229eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(GrabCallersArgument(false, 1, 2) == 1, ""); 2239eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(GrabCallersArgument(true, 4, 8) == 8, ""); 22459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 22559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 22659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 22759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace Pointers { 22859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 22959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int f(int n, const int *a, const int *b, const int *c) { 23059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return n == 0 ? 0 : *a + f(n-1, b, c, a); 23159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 23259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 23359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const int x = 1, y = 10, z = 100; 2349eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(f(23, &x, &y, &z) == 788, ""); 23559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 23659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int g(int n, int a, int b, int c) { 23759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return f(n, &a, &b, &c); 23859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 2399eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(g(23, x, y, z) == 788, ""); 24059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 24159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 24259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 24359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace FunctionPointers { 24459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 24559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int Double(int n) { return 2 * n; } 24659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int Triple(int n) { return 3 * n; } 24759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int Twice(int (*F)(int), int n) { return F(F(n)); } 24859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int Quadruple(int n) { return Twice(Double, n); } 24959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr auto Select(int n) -> int (*)(int) { 25059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return n == 2 ? &Double : n == 3 ? &Triple : n == 4 ? &Quadruple : 0; 25159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 252099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith constexpr int Apply(int (*F)(int), int n) { return F(n); } // expected-note {{subexpression}} 25359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 2549eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(1 + Apply(Select(4), 5) + Apply(Select(3), 7) == 42, ""); 25559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 256099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith constexpr int Invalid = Apply(Select(0), 0); // expected-error {{must be initialized by a constant expression}} expected-note {{in call to 'Apply(0, 0)'}} 25759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 25859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 25959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 26059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace PointerComparison { 26159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 26259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithint x, y; 2639eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&x == &y, "false"); // expected-error {{false}} 2649eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&x != &y, ""); 26559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool g1 = &x == &y; 26659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool g2 = &x != &y; 26759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool g3 = &x <= &y; // expected-error {{must be initialized by a constant expression}} 26859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool g4 = &x >= &y; // expected-error {{must be initialized by a constant expression}} 26959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool g5 = &x < &y; // expected-error {{must be initialized by a constant expression}} 27059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool g6 = &x > &y; // expected-error {{must be initialized by a constant expression}} 27159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 27259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct S { int x, y; } s; 2739eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&s.x == &s.y, "false"); // expected-error {{false}} 2749eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&s.x != &s.y, ""); 2759eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&s.x <= &s.y, ""); 2769eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&s.x >= &s.y, "false"); // expected-error {{false}} 2779eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&s.x < &s.y, ""); 2789eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&s.x > &s.y, "false"); // expected-error {{false}} 2799eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith 2809eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(0 == &y, "false"); // expected-error {{false}} 2819eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(0 != &y, ""); 28259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool n3 = 0 <= &y; // expected-error {{must be initialized by a constant expression}} 28359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool n4 = 0 >= &y; // expected-error {{must be initialized by a constant expression}} 28459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool n5 = 0 < &y; // expected-error {{must be initialized by a constant expression}} 28559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool n6 = 0 > &y; // expected-error {{must be initialized by a constant expression}} 28659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 2879eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&x == 0, "false"); // expected-error {{false}} 2889eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&x != 0, ""); 28959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool n9 = &x <= 0; // expected-error {{must be initialized by a constant expression}} 29059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool n10 = &x >= 0; // expected-error {{must be initialized by a constant expression}} 29159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool n11 = &x < 0; // expected-error {{must be initialized by a constant expression}} 29259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool n12 = &x > 0; // expected-error {{must be initialized by a constant expression}} 29359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 2949eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&x == &x, ""); 2959eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&x != &x, "false"); // expected-error {{false}} 2969eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&x <= &x, ""); 2979eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&x >= &x, ""); 2989eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&x < &x, "false"); // expected-error {{false}} 2999eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&x > &x, "false"); // expected-error {{false}} 30059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 30159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr S* sptr = &s; 302099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithconstexpr bool dyncast = sptr == dynamic_cast<S*>(sptr); // expected-error {{constant expression}} expected-note {{dynamic_cast}} 30359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 3042fd5983e0da447291a651a347c206aee37a1de5fRichard Smithstruct U {}; 305c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smithstruct Str { 306c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith int a : dynamic_cast<S*>(sptr) == dynamic_cast<S*>(sptr); // \ 307244ee7b89a483fd3764637abdf95de2893b437d0Richard Smith expected-warning {{not an integral constant expression}} \ 3084cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith expected-note {{dynamic_cast is not allowed in a constant expression}} 309c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith int b : reinterpret_cast<S*>(sptr) == reinterpret_cast<S*>(sptr); // \ 310244ee7b89a483fd3764637abdf95de2893b437d0Richard Smith expected-warning {{not an integral constant expression}} \ 3114cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith expected-note {{reinterpret_cast is not allowed in a constant expression}} 312c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith int c : (S*)(long)(sptr) == (S*)(long)(sptr); // \ 313244ee7b89a483fd3764637abdf95de2893b437d0Richard Smith expected-warning {{not an integral constant expression}} \ 314bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}} 315c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith int d : (S*)(42) == (S*)(42); // \ 316244ee7b89a483fd3764637abdf95de2893b437d0Richard Smith expected-warning {{not an integral constant expression}} \ 317bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}} 318c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith int e : (Str*)(sptr) == (Str*)(sptr); // \ 319244ee7b89a483fd3764637abdf95de2893b437d0Richard Smith expected-warning {{not an integral constant expression}} \ 320bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}} 3212fd5983e0da447291a651a347c206aee37a1de5fRichard Smith int f : &(U&)(*sptr) == &(U&)(*sptr); // \ 322244ee7b89a483fd3764637abdf95de2893b437d0Richard Smith expected-warning {{not an integral constant expression}} \ 323bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}} 324c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith int g : (S*)(void*)(sptr) == sptr; // \ 325244ee7b89a483fd3764637abdf95de2893b437d0Richard Smith expected-warning {{not an integral constant expression}} \ 3264cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith expected-note {{cast from 'void *' is not allowed in a constant expression}} 327c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith}; 328c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith 32959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithextern char externalvar[]; 3309eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithconstexpr bool constaddress = (void *)externalvar == (void *)0x4000UL; // expected-error {{must be initialized by a constant expression}} 33159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool litaddress = "foo" == "foo"; // expected-error {{must be initialized by a constant expression}} expected-warning {{unspecified}} 3329eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(0 != "foo", ""); 33359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 33459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 33559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 33659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace MaterializeTemporary { 33759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 33859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int f(const int &r) { return r; } 33959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int n = f(1); 34059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 34159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool same(const int &a, const int &b) { return &a == &b; } 34259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool sameTemporary(const int &n) { return same(n, n); } 34359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 3449eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(n, ""); 3459eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(!same(4, 4), ""); 3469eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(same(n, n), ""); 3479eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(sameTemporary(9), ""); 34859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 349211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithstruct A { int &&r; }; 350211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithstruct B { A &&a1; A &&a2; }; 351211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 352211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithconstexpr B b1 { { 1 }, { 2 } }; // expected-note {{temporary created here}} 353211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithstatic_assert(&b1.a1 != &b1.a2, ""); 354211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithstatic_assert(&b1.a1.r != &b1.a2.r, ""); // expected-error {{constant expression}} expected-note {{outside the expression that created the temporary}} 355211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 356211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithconstexpr B &&b2 { { 3 }, { 4 } }; // expected-note {{temporary created here}} 357211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithstatic_assert(&b1 != &b2, ""); 358211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithstatic_assert(&b1.a1 != &b2.a1, ""); // expected-error {{constant expression}} expected-note {{outside the expression that created the temporary}} 359211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 360211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithconstexpr thread_local B b3 { { 1 }, { 2 } }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}} 361211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithvoid foo() { 362211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith constexpr static B b1 { { 1 }, { 2 } }; // ok 363211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith constexpr thread_local B b2 { { 1 }, { 2 } }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}} 364211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith constexpr B b3 { { 1 }, { 2 } }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}} 365211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith} 366211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 367211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithconstexpr B &&b4 = ((1, 2), 3, 4, B { {10}, {{20}} }); // expected-warning 4{{unused}} 368211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithstatic_assert(&b4 != &b2, ""); 369211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 370211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith// Proposed DR: copy-elision doesn't trigger lifetime extension. 371211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithconstexpr B b5 = B{ {0}, {0} }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}} 372211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 373f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smithnamespace NestedNonStatic { 374f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith // Proposed DR: for a reference constant expression to refer to a static 375f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith // storage duration temporary, that temporary must itself be initialized 376f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith // by a constant expression (a core constant expression is not enough). 377f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith struct A { int &&r; }; 378f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith struct B { A &&a; }; 379f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith constexpr B a = { A{0} }; // ok 380f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith constexpr B b = { A(A{0}) }; // expected-error {{constant expression}} expected-note {{reference to temporary}} expected-note {{here}} 381f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith} 382f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith 383b6e3808bfe385da8d90bb431e41e30d721d5433fRichard Smithnamespace FakeInitList { 384b6e3808bfe385da8d90bb431e41e30d721d5433fRichard Smith struct init_list_3_ints { const int (&x)[3]; }; 385b6e3808bfe385da8d90bb431e41e30d721d5433fRichard Smith struct init_list_2_init_list_3_ints { const init_list_3_ints (&x)[2]; }; 386b6e3808bfe385da8d90bb431e41e30d721d5433fRichard Smith constexpr init_list_2_init_list_3_ints ils = { { { { 1, 2, 3 } }, { { 4, 5, 6 } } } }; 387b6e3808bfe385da8d90bb431e41e30d721d5433fRichard Smith} 388b6e3808bfe385da8d90bb431e41e30d721d5433fRichard Smith 38959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 39059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 39159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int strcmp_ce(const char *p, const char *q) { 39259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return (!*p || *p != *q) ? *p - *q : strcmp_ce(p+1, q+1); 39359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 39459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 39559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace StringLiteral { 39659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 3971d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smithtemplate<typename Char> 3981d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smithconstexpr int MangleChars(const Char *p) { 39959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return *p + 3 * (*p ? MangleChars(p+1) : 0); 40059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 40159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 4029eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(MangleChars("constexpr!") == 1768383, ""); 403ec789163a42a7be654ac34aadb750b508954d53cRichard Smithstatic_assert(MangleChars(u8"constexpr!") == 1768383, ""); 404ec789163a42a7be654ac34aadb750b508954d53cRichard Smithstatic_assert(MangleChars(L"constexpr!") == 1768383, ""); 4059eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(MangleChars(u"constexpr!") == 1768383, ""); 4069eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(MangleChars(U"constexpr!") == 1768383, ""); 40759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 40859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr char c0 = "nought index"[0]; 40959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr char c1 = "nice index"[10]; 4107098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithconstexpr 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}} 411b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithconstexpr 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}} 412bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithconstexpr 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}} 41359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 41459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr const char *p = "test" + 2; 4159eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(*p == 's', ""); 41659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 41759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr const char *max_iter(const char *a, const char *b) { 41859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return *a < *b ? b : a; 41959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 42059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr const char *max_element(const char *a, const char *b) { 42159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return (a+1 >= b) ? a : max_iter(a, max_element(a+1, b)); 42259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 42359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 42459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr char str[] = "the quick brown fox jumped over the lazy dog"; 42559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr const char *max = max_element(begin(str), end(str)); 4269eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(*max == 'z', ""); 4279eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(max == str + 38, ""); 42859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 4299eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(strcmp_ce("hello world", "hello world") == 0, ""); 4309eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(strcmp_ce("hello world", "hello clang") > 0, ""); 4319eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(strcmp_ce("constexpr", "test") < 0, ""); 4329eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(strcmp_ce("", " ") < 0, ""); 43359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 4347098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithstruct S { 4357098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 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}} 4367098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith}; 4377098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 438974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smithstruct T { 439974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith char c[6]; 440974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith constexpr T() : c{"foo"} {} 441974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith}; 442974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smithconstexpr T t; 443974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith 444974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smithstatic_assert(t.c[0] == 'f', ""); 445974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smithstatic_assert(t.c[1] == 'o', ""); 446974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smithstatic_assert(t.c[2] == 'o', ""); 447974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smithstatic_assert(t.c[3] == 0, ""); 448974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smithstatic_assert(t.c[4] == 0, ""); 449974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smithstatic_assert(t.c[5] == 0, ""); 450974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smithstatic_assert(t.c[6] == 0, ""); // expected-error {{constant expression}} expected-note {{one-past-the-end}} 451974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith 452ec789163a42a7be654ac34aadb750b508954d53cRichard Smithstruct U { 453ec789163a42a7be654ac34aadb750b508954d53cRichard Smith wchar_t chars[6]; 454ec789163a42a7be654ac34aadb750b508954d53cRichard Smith int n; 455ec789163a42a7be654ac34aadb750b508954d53cRichard Smith} constexpr u = { { L"test" }, 0 }; 456ec789163a42a7be654ac34aadb750b508954d53cRichard Smithstatic_assert(u.chars[2] == L's', ""); 457ec789163a42a7be654ac34aadb750b508954d53cRichard Smith 458f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smithstruct V { 459f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith char c[4]; 460f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith constexpr V() : c("hi!") {} 461f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith}; 462f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smithstatic_assert(V().c[1] == "i"[0], ""); 463f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith 46430ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smithnamespace Parens { 46530ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith constexpr unsigned char a[] = ("foo"), b[] = {"foo"}, c[] = {("foo")}, 46630ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith d[4] = ("foo"), e[5] = {"foo"}, f[6] = {("foo")}; 46730ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith static_assert(a[0] == 'f', ""); 46830ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith static_assert(b[1] == 'o', ""); 46930ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith static_assert(c[2] == 'o', ""); 47030ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith static_assert(d[0] == 'f', ""); 47130ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith static_assert(e[1] == 'o', ""); 47230ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith static_assert(f[2] == 'o', ""); 47330ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith static_assert(f[5] == 0, ""); 47430ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith static_assert(f[6] == 0, ""); // expected-error {{constant expression}} expected-note {{one-past-the-end}} 47530ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith} 47630ae1ed71dc99a396b7ddba9cabe9846a0c4449dRichard Smith 47759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 47859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 47959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace Array { 48059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 4811d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smithtemplate<typename Iter> 4821d238ea926bbdd04356ce475934fcd4cac654c4bRichard Smithconstexpr auto Sum(Iter begin, Iter end) -> decltype(+*begin) { 48359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return begin == end ? 0 : *begin + Sum(begin+1, end); 48459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 48559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 48659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int xs[] = { 1, 2, 3, 4, 5 }; 48759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int ys[] = { 5, 4, 3, 2, 1 }; 48859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int sum_xs = Sum(begin(xs), end(xs)); 4899eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(sum_xs == 15, ""); 49059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 49159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int ZipFoldR(int (*F)(int x, int y, int c), int n, 49259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const int *xs, const int *ys, int c) { 493daaefc5381f9aafbb1cb6f88fb5ac6aaf34d65bfRichard Smith return n ? F( 4947098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith *xs, // expected-note {{read of dereferenced one-past-the-end pointer}} 49508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith *ys, 49608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith ZipFoldR(F, n-1, xs+1, ys+1, c)) // \ 49708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith expected-note {{in call to 'ZipFoldR(&SubMul, 2, &xs[4], &ys[4], 1)'}} \ 49808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith expected-note {{in call to 'ZipFoldR(&SubMul, 1, &xs[5], &ys[5], 1)'}} 49908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith : c; 50059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 50159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int MulAdd(int x, int y, int c) { return x * y + c; } 50259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int InnerProduct = ZipFoldR(MulAdd, 5, xs, ys, 0); 5039eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(InnerProduct == 35, ""); 50459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 50559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int SubMul(int x, int y, int c) { return (x - y) * c; } 50659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int DiffProd = ZipFoldR(SubMul, 2, xs+3, ys+3, 1); 5079eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(DiffProd == 8, ""); 50808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstatic_assert(ZipFoldR(SubMul, 3, xs+3, ys+3, 1), ""); // \ 50908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith expected-error {{constant expression}} \ 51008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith expected-note {{in call to 'ZipFoldR(&SubMul, 3, &xs[3], &ys[3], 1)'}} 51159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 51259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr const int *p = xs + 3; 51359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int xs4 = p[1]; // ok 5147098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithconstexpr int xs5 = p[2]; // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}} 515b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithconstexpr int xs6 = p[3]; // expected-error {{constant expression}} expected-note {{cannot refer to element 6}} 51659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int xs0 = p[-3]; // ok 517b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithconstexpr int xs_1 = p[-4]; // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} 51859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 51959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int zs[2][2][2][2] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; 5209eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(zs[0][0][0][0] == 1, ""); 5219eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(zs[1][1][1][1] == 16, ""); 5227098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithstatic_assert(zs[0][0][0][2] == 3, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}} 5239eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((&zs[0][0][0][2])[-1] == 2, ""); 5249eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(**(**(zs + 1) + 1) == 11, ""); 525b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithstatic_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}} 526b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithstatic_assert(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][2] - 2) == 11, ""); 527b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithconstexpr 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}} 52859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 52908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithconstexpr int fail(const int &p) { 530b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith return (&p)[64]; // expected-note {{cannot refer to element 64 of array of 2 elements}} 53108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith} 532b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithstatic_assert(fail(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][2] - 2)) == 11, ""); // \ 53308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithexpected-error {{static_assert expression is not an integral constant expression}} \ 53408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithexpected-note {{in call to 'fail(zs[1][0][1][0])'}} 53508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 536d7c56e1114bfe7d461786903bb720d2c6efc05a1Richard Smithconstexpr int arr[40] = { 1, 2, 3, [8] = 4 }; // expected-warning {{C99 feature}} 53759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int SumNonzero(const int *p) { 53859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return *p + (*p ? SumNonzero(p+1) : 0); 53959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 54059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int CountZero(const int *p, const int *q) { 54159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return p == q ? 0 : (*p == 0) + CountZero(p+1, q); 54259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 5439eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(SumNonzero(arr) == 6, ""); 5449eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(CountZero(arr, arr + 40) == 36, ""); 54559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 546e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstruct ArrayElem { 547e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr ArrayElem() : n(0) {} 548e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith int n; 549840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr int f() const { return n; } 550e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 551e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstruct ArrayRVal { 552e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr ArrayRVal() {} 553e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ArrayElem elems[10]; 554e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 5559eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(ArrayRVal().elems[3].f() == 0, ""); 556e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 557de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smithconstexpr int selfref[2][2][2] = { 558de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith selfref[1][1][1] + 1, selfref[0][0][0] + 1, 559de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith selfref[1][0][1] + 1, selfref[0][1][0] + 1, 560de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith selfref[1][0][0] + 1, selfref[0][1][1] + 1 }; 561de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smithstatic_assert(selfref[0][0][0] == 1, ""); 562de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smithstatic_assert(selfref[0][0][1] == 2, ""); 563de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smithstatic_assert(selfref[0][1][0] == 1, ""); 564de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smithstatic_assert(selfref[0][1][1] == 2, ""); 565de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smithstatic_assert(selfref[1][0][0] == 1, ""); 566de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smithstatic_assert(selfref[1][0][1] == 3, ""); 567de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smithstatic_assert(selfref[1][1][0] == 0, ""); 568de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smithstatic_assert(selfref[1][1][1] == 0, ""); 569de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith 570a4334dffde250c22c339a974a7131914fe723180Richard Smithstruct TrivialDefCtor { int n; }; 571a4334dffde250c22c339a974a7131914fe723180Richard Smithtypedef TrivialDefCtor TDCArray[2][2]; 572a4334dffde250c22c339a974a7131914fe723180Richard Smithstatic_assert(TDCArray{}[1][1].n == 0, ""); 573a4334dffde250c22c339a974a7131914fe723180Richard Smith 574a4334dffde250c22c339a974a7131914fe723180Richard Smithstruct NonAggregateTDC : TrivialDefCtor {}; 575a4334dffde250c22c339a974a7131914fe723180Richard Smithtypedef NonAggregateTDC NATDCArray[2][2]; 576a4334dffde250c22c339a974a7131914fe723180Richard Smithstatic_assert(NATDCArray{}[1][1].n == 0, ""); 577a4334dffde250c22c339a974a7131914fe723180Richard Smith 57859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 57959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 58059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace DependentValues { 58159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 58259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct I { int n; typedef I V[10]; }; 58359efe266b804330f4c1f3a1b0ff783e67dd90378Richard SmithI::V x, y; 5849568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smithint g(); 5851432a43e3076eec84967305bd85bace3a6e9102bRichard Smithtemplate<bool B, typename T> struct S : T { 58659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int k; 58759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith void f() { 58859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith I::V &cells = B ? x : y; 58959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith I &i = cells[k]; 59059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith switch (i.n) {} 5911432a43e3076eec84967305bd85bace3a6e9102bRichard Smith 5929568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith // FIXME: We should be able to diagnose this. 5939568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith constexpr int n = g(); 5941432a43e3076eec84967305bd85bace3a6e9102bRichard Smith 5951432a43e3076eec84967305bd85bace3a6e9102bRichard Smith constexpr int m = this->g(); // ok, could be constexpr 59659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 59759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 59859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 59959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 60059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 60159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace Class { 60259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 60359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct A { constexpr A(int a, int b) : k(a + b) {} int k; }; 60459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int fn(const A &a) { return a.k; } 6059eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(fn(A(4,5)) == 9, ""); 60659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 607176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct B { int n; int m; } constexpr b = { 0, b.n }; 60859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct C { 60959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr C(C *this_) : m(42), n(this_->m) {} // ok 61059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int m, n; 61159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 61259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct D { 61359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith C c; 61459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr D() : c(&c) {} 61559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 6169eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(D().c.n == 42, ""); 61759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 6186180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct E { 61983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith constexpr E() : p(&p) {} 62059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith void *p; 62159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 622211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithconstexpr const E &e1 = E(); 62359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith// This is a constant expression if we elide the copy constructor call, and 62459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith// is not a constant expression if we don't! But we do, so it is. 6256180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr E e2 = E(); 6266180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstatic_assert(e2.p == &e2.p, ""); 627099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithconstexpr E e3; 6289eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(e3.p == &e3.p, ""); 62959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 63059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithextern const class F f; 63159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct F { 63259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr F() : p(&f.p) {} 63359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const void *p; 63459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 635099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithconstexpr F f; 63659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 63759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct G { 63859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith struct T { 63959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr T(T *p) : u1(), u2(p) {} 64059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith union U1 { 64159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr U1() {} 64259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int a, b = 42; 64359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } u1; 64459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith union U2 { 64559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr U2(T *p) : c(p->u1.b) {} 64659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int c, d; 64759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } u2; 64859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } t; 64959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr G() : t(&t) {} 65059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} constexpr g; 65159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 6527098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithstatic_assert(g.t.u1.a == 42, ""); // expected-error {{constant expression}} expected-note {{read of member 'a' of union with active member 'b'}} 6539eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(g.t.u1.b == 42, ""); 6549eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(g.t.u2.c == 42, ""); 6557098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithstatic_assert(g.t.u2.d == 42, ""); // expected-error {{constant expression}} expected-note {{read of member 'd' of union with active member 'c'}} 65659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 65759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct S { 65859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int a, b; 65959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const S *p; 66059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith double d; 66159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const char *q; 66259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 66359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr S(int n, const S *p) : a(5), b(n), p(p), d(n), q("hello") {} 66459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 66559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 66659efe266b804330f4c1f3a1b0ff783e67dd90378Richard SmithS global(43, &global); 66759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 6689eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(S(15, &global).b == 15, ""); 66959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 67059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool CheckS(const S &s) { 67159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return s.a == 5 && s.b == 27 && s.p == &global && s.d == 27. && s.q[3] == 'l'; 67259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 6739eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(CheckS(S(27, &global)), ""); 67459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 67559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct Arr { 67659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith char arr[3]; 67759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr Arr() : arr{'x', 'y', 'z'} {} 67859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 67959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int hash(Arr &&a) { 68059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return a.arr[0] + a.arr[1] * 0x100 + a.arr[2] * 0x10000; 68159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 68259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr int k = hash(Arr()); 6839eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(k == 0x007a7978, ""); 68459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 68559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 68659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct AggregateInit { 68759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const char &c; 68859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int n; 68959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith double d; 69059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int arr[5]; 69159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith void *p; 69259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 69359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 69459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr AggregateInit agg1 = { "hello"[0] }; 69559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 6969eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(strcmp_ce(&agg1.c, "hello") == 0, ""); 6979eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(agg1.n == 0, ""); 6989eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(agg1.d == 0.0, ""); 699b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithstatic_assert(agg1.arr[-1] == 0, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} 7009eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(agg1.arr[0] == 0, ""); 7019eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(agg1.arr[4] == 0, ""); 7027098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithstatic_assert(agg1.arr[5] == 0, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end}} 7039eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(agg1.p == nullptr, ""); 70459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 705fe587201feaebc69e6d18858bea85c77926b6ecfRichard Smithstatic constexpr const unsigned char uc[] = { "foo" }; 706fe587201feaebc69e6d18858bea85c77926b6ecfRichard Smithstatic_assert(uc[0] == 'f', ""); 707fe587201feaebc69e6d18858bea85c77926b6ecfRichard Smithstatic_assert(uc[3] == 0, ""); 708fe587201feaebc69e6d18858bea85c77926b6ecfRichard Smith 70959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace SimpleDerivedClass { 71059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 71159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct B { 71259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr B(int n) : a(n) {} 71359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int a; 71459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 71559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct D : B { 71659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr D(int n) : B(n) {} 71759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 71859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr D d(3); 7199eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(d.a == 3, ""); 72059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 72159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 72259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 723e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstruct Bottom { constexpr Bottom() {} }; 724e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstruct Base : Bottom { 72559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr Base(int a = 42, const char *b = "test") : a(a), b(b) {} 72659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int a; 72759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const char *b; 72859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 729e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstruct Base2 : Bottom { 73059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr Base2(const int &r) : r(r) {} 73159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int q = 123; 732099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith const int &r; 73359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 73459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstruct Derived : Base, Base2 { 73559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr Derived() : Base(76), Base2(a) {} 73659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int c = r + b[1]; 73759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 73859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 73959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr bool operator==(const Base &a, const Base &b) { 74059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return a.a == b.a && strcmp_ce(a.b, b.b) == 0; 74159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 74259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 74359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr Base base; 74459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr Base base2(76); 74559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr Derived derived; 7469eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(derived.a == 76, ""); 7479eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(derived.b[2] == 's', ""); 7489eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(derived.c == 76 + 'e', ""); 7499eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(derived.q == 123, ""); 7509eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(derived.r == 76, ""); 751099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithstatic_assert(&derived.r == &derived.a, ""); 75259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 7539eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(!(derived == base), ""); 7549eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(derived == base2, ""); 75559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 756e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithconstexpr Bottom &bot1 = (Base&)derived; 757e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithconstexpr Bottom &bot2 = (Base2&)derived; 7589eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&bot1 != &bot2, ""); 759e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 760e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithconstexpr Bottom *pb1 = (Base*)&derived; 761e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithconstexpr Bottom *pb2 = (Base2*)&derived; 762f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smithstatic_assert(&pb1 != &pb2, ""); 7639eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(pb1 == &bot1, ""); 7649eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(pb2 == &bot2, ""); 765e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 766b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithconstexpr Base2 &fail = (Base2&)bot1; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base2'}} 767b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithconstexpr Base &fail2 = (Base&)*pb2; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base'}} 768e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithconstexpr Base2 &ok2 = (Base2&)bot2; 7699eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&ok2 == &derived, ""); 770e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 771b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithconstexpr Base2 *pfail = (Base2*)pb1; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base2'}} 772b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithconstexpr Base *pfail2 = (Base*)&bot2; // expected-error {{constant expression}} expected-note {{cannot cast object of dynamic type 'const Class::Derived' to type 'Class::Base'}} 773e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithconstexpr Base2 *pok2 = (Base2*)pb2; 7749eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(pok2 == &derived, ""); 7759eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(&ok2 == pok2, ""); 7769eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((Base2*)(Derived*)(Base*)pb1 == pok2, ""); 7779eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((Derived*)(Base*)pb1 == (Derived*)pok2, ""); 778e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 779f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith// Core issue 903: we do not perform constant evaluation when checking for a 780f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith// null pointer in C++11. Just check for an integer literal with value 0. 781f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smithconstexpr Base *nullB = 42 - 6 * 7; // expected-error {{cannot initialize a variable of type 'Class::Base *const' with an rvalue of type 'int'}} 782f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smithconstexpr Base *nullB1 = 0; 7839eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((Bottom*)nullB == 0, ""); 7849eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((Derived*)nullB == 0, ""); 7859eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((void*)(Bottom*)nullB == (void*)(Derived*)nullB, ""); 786f050d2445ed75569ccfe0740caa900403d2ce3b3Richard SmithBase *nullB2 = '\0'; // expected-error {{cannot initialize a variable of type 'Class::Base *' with an rvalue of type 'char'}} 787f050d2445ed75569ccfe0740caa900403d2ce3b3Richard SmithBase *nullB3 = (0); 788f050d2445ed75569ccfe0740caa900403d2ce3b3Richard SmithBase *nullB4 = false; // expected-error {{cannot initialize a variable of type 'Class::Base *' with an rvalue of type 'bool'}} 789f050d2445ed75569ccfe0740caa900403d2ce3b3Richard SmithBase *nullB5 = ((0ULL)); 790f050d2445ed75569ccfe0740caa900403d2ce3b3Richard SmithBase *nullB6 = 0.; // expected-error {{cannot initialize a variable of type 'Class::Base *' with an rvalue of type 'double'}} 791f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smithenum Null { kNull }; 792f050d2445ed75569ccfe0740caa900403d2ce3b3Richard SmithBase *nullB7 = kNull; // expected-error {{cannot initialize a variable of type 'Class::Base *' with an rvalue of type 'Class::Null'}} 793f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smithstatic_assert(nullB1 == (1 - 1), ""); // expected-error {{comparison between pointer and integer}} 794f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith 79550800fc551ac6b8a95cca662223e7f061bbd169aDavid Blaikie 796e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 7977d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smithnamespace ConversionOperators { 7987d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith 7997d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smithstruct T { 8007d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith constexpr T(int n) : k(5*n - 3) {} 801840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr operator int() const { return k; } 8027d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith int k; 8037d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith}; 8047d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith 8057d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smithstruct S { 8067d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith constexpr S(int n) : k(2*n + 1) {} 807840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr operator int() const { return k; } 808840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr operator T() const { return T(k); } 8097d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith int k; 8107d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith}; 8117d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith 8127d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smithconstexpr bool check(T a, T b) { return a == b.k; } 8137d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith 8147d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smithstatic_assert(S(5) == 11, ""); 8157d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smithstatic_assert(check(S(5), 11), ""); 8167d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith 817e925322569cb4aad26cc62036a13e2d3daed862dRichard Smithnamespace PR14171 { 818e925322569cb4aad26cc62036a13e2d3daed862dRichard Smith 819e925322569cb4aad26cc62036a13e2d3daed862dRichard Smithstruct X { 820840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr (operator int)() const { return 0; } 821e925322569cb4aad26cc62036a13e2d3daed862dRichard Smith}; 822e925322569cb4aad26cc62036a13e2d3daed862dRichard Smithstatic_assert(X() == 0, ""); 823e925322569cb4aad26cc62036a13e2d3daed862dRichard Smith 824e925322569cb4aad26cc62036a13e2d3daed862dRichard Smith} 825e925322569cb4aad26cc62036a13e2d3daed862dRichard Smith 8267d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith} 8277d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith 828c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct This { 829c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines constexpr int f() const { return 0; } 830c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines static constexpr int g() { return 0; } 831c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void h() { 832c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines constexpr int x = f(); // expected-error {{must be initialized by a constant}} 833c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // expected-note@-1 {{implicit use of 'this' pointer is only allowed within the evaluation of a call to a 'constexpr' member function}} 834c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines constexpr int y = this->f(); // expected-error {{must be initialized by a constant}} 835c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // expected-note-re@-1 {{{{^}}use of 'this' pointer}} 836c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines constexpr int z = g(); 837c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines static_assert(z == 0, ""); 838c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 839c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}; 840c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 841e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 842e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 843e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace Temporaries { 844e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 845e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstruct S { 846e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr S() {} 847840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr int f() const; 8488a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith constexpr int g() const; 849e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 850e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstruct T : S { 851e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr T(int n) : S(), n(n) {} 852e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith int n; 853e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 854840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smithconstexpr int S::f() const { 8558a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith return static_cast<const T*>(this)->n; // expected-note {{cannot cast}} 8568a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith} 8578a66bf78becf05a24e8251379f3843d1fceb627fRichard Smithconstexpr int S::g() const { 8588a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith // FIXME: Better diagnostic for this. 8598a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith return this->*(int(S::*))&T::n; // expected-note {{subexpression}} 860e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 861e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// The T temporary is implicitly cast to an S subobject, but we can recover the 862e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// T full-object via a base-to-derived cast, or a derived-to-base-casted member 863e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// pointer. 8648a66bf78becf05a24e8251379f3843d1fceb627fRichard Smithstatic_assert(S().f(), ""); // expected-error {{constant expression}} expected-note {{in call to '&Temporaries::S()->f()'}} 8658a66bf78becf05a24e8251379f3843d1fceb627fRichard Smithstatic_assert(S().g(), ""); // expected-error {{constant expression}} expected-note {{in call to '&Temporaries::S()->g()'}} 8669eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(T(3).f() == 3, ""); 8678a66bf78becf05a24e8251379f3843d1fceb627fRichard Smithstatic_assert(T(4).g() == 4, ""); 868e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 869e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithconstexpr int f(const S &s) { 870e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return static_cast<const T&>(s).n; 871e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 872e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithconstexpr int n = f(T(5)); 8739eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(f(T(5)) == 5, ""); 874e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 875f2e4cd760a5836ee8941d1b9be6b2e2c2dde23e6Richard Smithconstexpr bool b(int n) { return &n; } 876f2e4cd760a5836ee8941d1b9be6b2e2c2dde23e6Richard Smithstatic_assert(b(0), ""); 877f2e4cd760a5836ee8941d1b9be6b2e2c2dde23e6Richard Smith 878c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct NonLiteral { 879c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines NonLiteral(); 880c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines int f(); 881c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}; 882c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesconstexpr int k = NonLiteral().f(); // expected-error {{constant expression}} expected-note {{non-literal type 'Temporaries::NonLiteral'}} 883c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 88459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 88559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 88659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace Union { 88759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 88859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithunion U { 88959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int a; 89059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int b; 89159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 89259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 893d7c56e1114bfe7d461786903bb720d2c6efc05a1Richard Smithconstexpr U u[4] = { { .a = 0 }, { .b = 1 }, { .a = 2 }, { .b = 3 } }; // expected-warning 4{{C99 feature}} 8949eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(u[0].a == 0, ""); 8957098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithstatic_assert(u[0].b, ""); // expected-error {{constant expression}} expected-note {{read of member 'b' of union with active member 'a'}} 8969eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(u[1].b == 1, ""); 8977098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithstatic_assert((&u[1].b)[1] == 2, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}} 898b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithstatic_assert(*(&(u[1].b) + 1 + 1) == 3, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element 2 of non-array object}} 8999eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((&(u[1]) + 1 + 1)->b == 3, ""); 90059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 901ec789163a42a7be654ac34aadb750b508954d53cRichard Smithconstexpr U v = {}; 902ec789163a42a7be654ac34aadb750b508954d53cRichard Smithstatic_assert(v.a == 0, ""); 903ec789163a42a7be654ac34aadb750b508954d53cRichard Smith 904ec789163a42a7be654ac34aadb750b508954d53cRichard Smithunion Empty {}; 905ec789163a42a7be654ac34aadb750b508954d53cRichard Smithconstexpr Empty e = {}; 906ec789163a42a7be654ac34aadb750b508954d53cRichard Smith 907610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith// Make sure we handle trivial copy constructors for unions. 908610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smithconstexpr U x = {42}; 909610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smithconstexpr U y = x; 910610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smithstatic_assert(y.a == 42, ""); 911610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smithstatic_assert(y.b == 42, ""); // expected-error {{constant expression}} expected-note {{'b' of union with active member 'a'}} 912610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith 91359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 91459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 915e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace MemberPointer { 916e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith struct A { 917e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr A(int n) : n(n) {} 918e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith int n; 919840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr int f() const { return n + 3; } 920e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith }; 921e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr A a(7); 9229eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(A(5).*&A::n == 5, ""); 9239eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((&a)->*&A::n == 7, ""); 9249eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((A(8).*&A::f)() == 11, ""); 9259eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(((&a)->*&A::f)() == 10, ""); 926e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 927e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith struct B : A { 928e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr B(int n, int m) : A(n), m(m) {} 929e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith int m; 930840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr int g() const { return n + m + 1; } 931e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith }; 932e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr B b(9, 13); 9339eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(B(4, 11).*&A::n == 4, ""); 9349eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(B(4, 11).*&B::m == 11, ""); 9359eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(B(4, 11).*(int(A::*))&B::m == 11, ""); 9369eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((&b)->*&A::n == 9, ""); 9379eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((&b)->*&B::m == 13, ""); 9389eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((&b)->*(int(A::*))&B::m == 13, ""); 9399eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((B(4, 11).*&A::f)() == 7, ""); 9409eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((B(4, 11).*&B::g)() == 16, ""); 9419eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((B(4, 11).*(int(A::*)()const)&B::g)() == 16, ""); 9429eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(((&b)->*&A::f)() == 12, ""); 9439eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(((&b)->*&B::g)() == 23, ""); 9449eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(((&b)->*(int(A::*)()const)&B::g)() == 23, ""); 945e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 946e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith struct S { 947e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr S(int m, int n, int (S::*pf)() const, int S::*pn) : 948e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith m(m), n(n), pf(pf), pn(pn) {} 949e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr S() : m(), n(), pf(&S::f), pn(&S::n) {} 950e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 951840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr int f() const { return this->*pn; } 952e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith virtual int g() const; 953e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 954e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith int m, n; 955e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith int (S::*pf)() const; 956e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith int S::*pn; 957e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith }; 958e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 959e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int S::*pm = &S::m; 960e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int S::*pn = &S::n; 961e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int (S::*pf)() const = &S::f; 962e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int (S::*pg)() const = &S::g; 963e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 964e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr S s(2, 5, &S::f, &S::m); 965e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 9669eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((s.*&S::f)() == 2, ""); 9679eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((s.*s.pf)() == 2, ""); 968e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 969b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(pf == &S::f, ""); 970b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(pf == s.*&S::pf, ""); 971b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(pm == &S::m, ""); 972b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(pm != pn, ""); 973b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(s.pn != pn, ""); 974b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(s.pn == pm, ""); 975b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(pg != nullptr, ""); 976b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(pf != nullptr, ""); 977b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert((int S::*)nullptr == nullptr, ""); 978b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(pg == pg, ""); // expected-error {{constant expression}} expected-note {{comparison of pointer to virtual member function 'g' has unspecified value}} 979b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(pf != pg, ""); // expected-error {{constant expression}} expected-note {{comparison of pointer to virtual member function 'g' has unspecified value}} 980b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith 981e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith template<int n> struct T : T<n-1> {}; 982e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith template<> struct T<0> { int n; }; 983e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith template<> struct T<30> : T<29> { int m; }; 984e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 985e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith T<17> t17; 986e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith T<30> t30; 987e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 988e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int (T<10>::*deepn) = &T<0>::n; 9899eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(t17.*deepn) == &t17.n, ""); 990b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(deepn == &T<2>::n, ""); 991e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 992e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int (T<15>::*deepm) = (int(T<10>::*))&T<30>::m; 993e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int *pbad = &(t17.*deepm); // expected-error {{constant expression}} 9949eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(t30.*deepm) == &t30.m, ""); 995b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(deepm == &T<50>::m, ""); 996b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(deepm != deepn, ""); 997e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 998e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr T<5> *p17_5 = &t17; 999e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr T<13> *p17_13 = (T<13>*)p17_5; 1000b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith 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>'}} 10019eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(p17_5->*(int(T<3>::*))deepn) == &t17.n, ""); 10029eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(p17_13->*deepn) == &t17.n, ""); 1003e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int *pbad2 = &(p17_13->*(int(T<9>::*))deepm); // expected-error {{constant expression}} 1004e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1005e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr T<5> *p30_5 = &t30; 1006e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr T<23> *p30_23 = (T<23>*)p30_5; 1007e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr T<13> *p30_13 = p30_23; 10089eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(p30_5->*(int(T<3>::*))deepn) == &t30.n, ""); 10099eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(p30_13->*deepn) == &t30.n, ""); 10109eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(p30_23->*deepn) == &t30.n, ""); 10119eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(p30_5->*(int(T<2>::*))deepm) == &t30.m, ""); 10129eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(((T<17>*)p30_13)->*deepm) == &t30.m, ""); 10139eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(&(p30_23->*deepm) == &t30.m, ""); 1014b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith 1015b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith struct Base { int n; }; 1016b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith template<int N> struct Mid : Base {}; 1017b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith struct Derived : Mid<0>, Mid<1> {}; 1018b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(&Mid<0>::n == &Mid<1>::n, ""); 1019b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert((int Derived::*)(int Mid<0>::*)&Mid<0>::n != 1020b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith (int Derived::*)(int Mid<1>::*)&Mid<1>::n, ""); 1021b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith static_assert(&Mid<0>::n == (int Mid<0>::*)&Base::n, ""); 1022e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 1023e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1024e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace ArrayBaseDerived { 1025e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1026e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith struct Base { 1027e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Base() {} 1028e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith int n = 0; 1029e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith }; 1030e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith struct Derived : Base { 1031e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Derived() {} 1032840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr const int *f() const { return &n; } 1033e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith }; 1034e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1035e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Derived a[10]; 1036e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Derived *pd3 = const_cast<Derived*>(&a[3]); 1037e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Base *pb3 = const_cast<Derived*>(&a[3]); 10389eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(pb3 == pd3, ""); 1039e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1040e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // pb3 does not point to an array element. 1041e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Base *pb4 = pb3 + 1; // ok, one-past-the-end pointer. 1042b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith constexpr int pb4n = pb4->n; // expected-error {{constant expression}} expected-note {{cannot access field of pointer past the end}} 1043b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith constexpr Base *err_pb5 = pb3 + 2; // expected-error {{constant expression}} expected-note {{cannot refer to element 2}} expected-note {{here}} 1044b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith constexpr int err_pb5n = err_pb5->n; // expected-error {{constant expression}} expected-note {{initializer of 'err_pb5' is not a constant expression}} 1045b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith constexpr Base *err_pb2 = pb3 - 1; // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} expected-note {{here}} 1046b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith constexpr int err_pb2n = err_pb2->n; // expected-error {{constant expression}} expected-note {{initializer of 'err_pb2'}} 1047e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Base *pb3a = pb4 - 1; 1048e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1049e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // pb4 does not point to a Derived. 1050b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith constexpr Derived *err_pd4 = (Derived*)pb4; // expected-error {{constant expression}} expected-note {{cannot access derived class of pointer past the end}} 1051e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Derived *pd3a = (Derived*)pb3a; 1052e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int pd3n = pd3a->n; 1053e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1054e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // pd3a still points to the Derived array. 1055e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Derived *pd6 = pd3a + 3; 10569eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert(pd6 == &a[6], ""); 1057e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Derived *pd9 = pd6 + 3; 1058e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Derived *pd10 = pd6 + 4; 1059e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int pd9n = pd9->n; // ok 1060b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith constexpr int err_pd10n = pd10->n; // expected-error {{constant expression}} expected-note {{cannot access base class of pointer past the end}} 1061e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr int pd0n = pd10[-10].n; 1062b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith constexpr int err_pdminus1n = pd10[-11].n; // expected-error {{constant expression}} expected-note {{cannot refer to element -1 of}} 1063e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1064e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr Base *pb9 = pd9; 1065e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith constexpr const int *(Base::*pfb)() const = 1066e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith static_cast<const int *(Base::*)() const>(&Derived::f); 10679eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smith static_assert((pb9->*pfb)() == &a[9].n, ""); 1068e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 1069e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 107059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithnamespace Complex { 107159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 107259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithclass complex { 107359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith int re, im; 107459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithpublic: 107559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr complex(int re = 0, int im = 0) : re(re), im(im) {} 107659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr complex(const complex &o) : re(o.re), im(o.im) {} 107759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr complex operator-() const { return complex(-re, -im); } 107859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith friend constexpr complex operator+(const complex &l, const complex &r) { 107959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return complex(l.re + r.re, l.im + r.im); 108059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 108159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith friend constexpr complex operator-(const complex &l, const complex &r) { 108259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return l + -r; 108359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 108459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith friend constexpr complex operator*(const complex &l, const complex &r) { 108559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return complex(l.re * r.re - l.im * r.im, l.re * r.im + l.im * r.re); 108659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 108759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith friend constexpr bool operator==(const complex &l, const complex &r) { 108859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return l.re == r.re && l.im == r.im; 108959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 109059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr bool operator!=(const complex &r) const { 109159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return re != r.re || im != r.im; 109259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 109359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int real() const { return re; } 109459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr int imag() const { return im; } 109559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 109659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 109759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr complex i = complex(0, 1); 109859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr complex k = (3 + 4*i) * (6 - 4*i); 10999eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(complex(1,0).real() == 1, ""); 11009eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(complex(1,0).imag() == 0, ""); 11019eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(((complex)1).imag() == 0, ""); 11029eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(k.real() == 34, ""); 11039eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(k.imag() == 12, ""); 11049eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(k - 34 == 12*i, ""); 11059eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((complex)1 == complex(1), ""); 11069eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((complex)1 != complex(0, 1), ""); 11079eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(complex(1) == complex(1), ""); 11089eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(complex(1) != complex(0, 1), ""); 110959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr complex makeComplex(int re, int im) { return complex(re, im); } 11109eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(makeComplex(1,0) == complex(1), ""); 11119eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(makeComplex(1,0) != complex(0, 1), ""); 111259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 111359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithclass complex_wrap : public complex { 111459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithpublic: 111559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr complex_wrap(int re, int im = 0) : complex(re, im) {} 111659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith constexpr complex_wrap(const complex_wrap &o) : complex(o) {} 111759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}; 111859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 11199eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((complex_wrap)1 == complex(1), ""); 11209eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert((complex)1 != complex_wrap(0, 1), ""); 11219eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(complex(1) == complex_wrap(1), ""); 11229eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(complex_wrap(1) != complex(0, 1), ""); 112359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithconstexpr complex_wrap makeComplexWrap(int re, int im) { 112459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return complex_wrap(re, im); 112559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 11269eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(makeComplexWrap(1,0) == complex(1), ""); 11279eed49c2bb0f37bbfefefd0998b6303a686a66c0Richard Smithstatic_assert(makeComplexWrap(1,0) != complex(0, 1), ""); 112859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 112959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 1130f59ff8c777379bd54137853a58c58b72fb869152Eli Friedman 1131f59ff8c777379bd54137853a58c58b72fb869152Eli Friedmannamespace PR11595 { 1132840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith struct A { constexpr bool operator==(int x) const { return true; } }; 1133af2c7a194592401394233b7cbcdd3cfd0a7a38ddRichard Smith struct B { B(); A& x; }; 1134af2c7a194592401394233b7cbcdd3cfd0a7a38ddRichard Smith static_assert(B().x == 3, ""); // expected-error {{constant expression}} expected-note {{non-literal type 'PR11595::B' cannot be used in a constant expression}} 1135af2c7a194592401394233b7cbcdd3cfd0a7a38ddRichard Smith 1136745f5147e065900267c85a5568785a1991d4838fRichard Smith constexpr bool f(int k) { // expected-error {{constexpr function never produces a constant expression}} 1137af2c7a194592401394233b7cbcdd3cfd0a7a38ddRichard Smith return B().x == k; // expected-note {{non-literal type 'PR11595::B' cannot be used in a constant expression}} 1138af2c7a194592401394233b7cbcdd3cfd0a7a38ddRichard Smith } 1139f59ff8c777379bd54137853a58c58b72fb869152Eli Friedman} 1140bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith 1141bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smithnamespace ExprWithCleanups { 1142bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith struct A { A(); ~A(); int get(); }; 1143bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith constexpr int get(bool FromA) { return FromA ? A().get() : 1; } 1144bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith constexpr int n = get(false); 1145bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith} 11467098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 11477098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithnamespace Volatile { 11487098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 11497098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithvolatile constexpr int n1 = 0; // expected-note {{here}} 11507098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithvolatile const int n2 = 0; // expected-note {{here}} 11517098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithint n3 = 37; // expected-note {{declared here}} 11527098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 11539ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smithconstexpr int m1 = n1; // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}} 11549ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smithconstexpr int m2 = n2; // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}} 11559ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smithconstexpr int m1b = const_cast<const int&>(n1); // expected-error {{constant expression}} expected-note {{read of volatile object 'n1'}} 11569ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smithconstexpr int m2b = const_cast<const int&>(n2); // expected-error {{constant expression}} expected-note {{read of volatile object 'n2'}} 11577098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 11587098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithstruct T { int n; }; 11597098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithconst T t = { 42 }; // expected-note {{declared here}} 11607098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 11617098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithconstexpr int f(volatile int &&r) { 11629ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smith return r; // expected-note {{read of volatile-qualified type 'volatile int'}} 11639ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smith} 11649ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smithconstexpr int g(volatile int &&r) { 11659ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smith return const_cast<int&>(r); // expected-note {{read of volatile temporary is not allowed in a constant expression}} 11667098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith} 11677098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithstruct S { 11689ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smith int j : f(0); // expected-error {{constant expression}} expected-note {{in call to 'f(0)'}} 11699ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smith int k : g(0); // expected-error {{constant expression}} expected-note {{temporary created here}} expected-note {{in call to 'g(0)'}} 11707098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith int l : n3; // expected-error {{constant expression}} expected-note {{read of non-const variable}} 11717098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith int m : t.n; // expected-error {{constant expression}} expected-note {{read of non-constexpr variable}} 11727098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith}; 11737098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 11747098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith} 1175dd4b350143c26c030a482f091908a2e077503411Richard Smith 1176dd4b350143c26c030a482f091908a2e077503411Richard Smithnamespace ExternConstexpr { 1177dd4b350143c26c030a482f091908a2e077503411Richard Smith extern constexpr int n = 0; 1178dd4b350143c26c030a482f091908a2e077503411Richard Smith extern constexpr int m; // expected-error {{constexpr variable declaration must be a definition}} 1179dd4b350143c26c030a482f091908a2e077503411Richard Smith void f() { 1180dd4b350143c26c030a482f091908a2e077503411Richard Smith extern constexpr int i; // expected-error {{constexpr variable declaration must be a definition}} 1181dd4b350143c26c030a482f091908a2e077503411Richard Smith constexpr int j = 0; 1182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int k; // expected-error {{default initialization of an object of const type}} expected-note{{add an explicit initializer to initialize 'k'}} 1183dd4b350143c26c030a482f091908a2e077503411Richard Smith } 1184dd4b350143c26c030a482f091908a2e077503411Richard Smith} 11857ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman 11867ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedmannamespace ComplexConstexpr { 11877ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman constexpr _Complex float test1 = {}; 11887ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman constexpr _Complex float test2 = {1}; 11897ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman constexpr _Complex double test3 = {1,2}; 11907ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman constexpr _Complex int test4 = {4}; 11917ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman constexpr _Complex int test5 = 4; 11927ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman constexpr _Complex int test6 = {5,6}; 1193f6c17a439f3320ac620639a3ee66dbdabb93810cEli Friedman typedef _Complex float fcomplex; 1194f6c17a439f3320ac620639a3ee66dbdabb93810cEli Friedman constexpr fcomplex test7 = fcomplex(); 119586024013d4c3728122c58fa07a2a67e6c15837efRichard Smith 119686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith constexpr const double &t2r = __real test3; 119786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith constexpr const double &t2i = __imag test3; 119886024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(&t2r + 1 == &t2i, ""); 119986024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(t2r == 1.0, ""); 120086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(t2i == 2.0, ""); 120186024013d4c3728122c58fa07a2a67e6c15837efRichard Smith constexpr const double *t2p = &t2r; 120286024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(t2p[-1] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element -1 of array of 2 elements}} 120386024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(t2p[0] == 1.0, ""); 120486024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(t2p[1] == 2.0, ""); 120586024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(t2p[2] == 0.0, ""); // expected-error {{constant expr}} expected-note {{one-past-the-end pointer}} 120686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(t2p[3] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element 3 of array of 2 elements}} 120786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith constexpr _Complex float *p = 0; 120886024013d4c3728122c58fa07a2a67e6c15837efRichard Smith constexpr float pr = __real *p; // expected-error {{constant expr}} expected-note {{cannot access real component of null}} 120986024013d4c3728122c58fa07a2a67e6c15837efRichard Smith constexpr float pi = __imag *p; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of null}} 121086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith constexpr const _Complex double *q = &test3 + 1; 121186024013d4c3728122c58fa07a2a67e6c15837efRichard Smith constexpr double qr = __real *q; // expected-error {{constant expr}} expected-note {{cannot access real component of pointer past the end}} 121286024013d4c3728122c58fa07a2a67e6c15837efRichard Smith constexpr double qi = __imag *q; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of pointer past the end}} 121386024013d4c3728122c58fa07a2a67e6c15837efRichard Smith 121486024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(__real test6 == 5, ""); 121586024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(__imag test6 == 6, ""); 121686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith static_assert(&__imag test6 == &__real test6 + 1, ""); 12177ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman} 12186b3014b07c40a6ed8b0c8ed63950df02eeb82c28Eli Friedman 12195705f211472f19fc38e58d81365f9261024b3ba3Richard Smith// _Atomic(T) is exactly like T for the purposes of constant expression 12205705f211472f19fc38e58d81365f9261024b3ba3Richard Smith// evaluation.. 12215705f211472f19fc38e58d81365f9261024b3ba3Richard Smithnamespace Atomic { 12225705f211472f19fc38e58d81365f9261024b3ba3Richard Smith constexpr _Atomic int n = 3; 12235705f211472f19fc38e58d81365f9261024b3ba3Richard Smith 12245705f211472f19fc38e58d81365f9261024b3ba3Richard Smith struct S { _Atomic(double) d; }; 12255705f211472f19fc38e58d81365f9261024b3ba3Richard Smith constexpr S s = { 0.5 }; 12265705f211472f19fc38e58d81365f9261024b3ba3Richard Smith constexpr double d1 = s.d; 12275705f211472f19fc38e58d81365f9261024b3ba3Richard Smith constexpr double d2 = n; 12285705f211472f19fc38e58d81365f9261024b3ba3Richard Smith constexpr _Atomic double d3 = n; 12295705f211472f19fc38e58d81365f9261024b3ba3Richard Smith 12305705f211472f19fc38e58d81365f9261024b3ba3Richard Smith constexpr _Atomic(int) n2 = d3; 12315705f211472f19fc38e58d81365f9261024b3ba3Richard Smith static_assert(d1 == 0.5, ""); 12325705f211472f19fc38e58d81365f9261024b3ba3Richard Smith static_assert(d3 == 3.0, ""); 12335705f211472f19fc38e58d81365f9261024b3ba3Richard Smith 12345705f211472f19fc38e58d81365f9261024b3ba3Richard Smith namespace PR16056 { 12355705f211472f19fc38e58d81365f9261024b3ba3Richard Smith struct TestVar { 12365705f211472f19fc38e58d81365f9261024b3ba3Richard Smith _Atomic(int) value; 12375705f211472f19fc38e58d81365f9261024b3ba3Richard Smith constexpr TestVar(int value) : value(value) {} 12385705f211472f19fc38e58d81365f9261024b3ba3Richard Smith }; 12395705f211472f19fc38e58d81365f9261024b3ba3Richard Smith constexpr TestVar testVar{-1}; 12405705f211472f19fc38e58d81365f9261024b3ba3Richard Smith static_assert(testVar.value == -1, ""); 12415705f211472f19fc38e58d81365f9261024b3ba3Richard Smith } 12425705f211472f19fc38e58d81365f9261024b3ba3Richard Smith} 12435705f211472f19fc38e58d81365f9261024b3ba3Richard Smith 12446b3014b07c40a6ed8b0c8ed63950df02eeb82c28Eli Friedmannamespace InstantiateCaseStmt { 12456b3014b07c40a6ed8b0c8ed63950df02eeb82c28Eli Friedman template<int x> constexpr int f() { return x; } 12466b3014b07c40a6ed8b0c8ed63950df02eeb82c28Eli Friedman template<int x> int g(int c) { switch(c) { case f<x>(): return 1; } return 0; } 12476b3014b07c40a6ed8b0c8ed63950df02eeb82c28Eli Friedman int gg(int c) { return g<4>(c); } 12486b3014b07c40a6ed8b0c8ed63950df02eeb82c28Eli Friedman} 1249495f42a32610c03591b49cd06ac09c5408742f86Richard Smith 1250495f42a32610c03591b49cd06ac09c5408742f86Richard Smithnamespace ConvertedConstantExpr { 1251495f42a32610c03591b49cd06ac09c5408742f86Richard Smith extern int &m; 1252495f42a32610c03591b49cd06ac09c5408742f86Richard Smith extern int &n; 1253495f42a32610c03591b49cd06ac09c5408742f86Richard Smith 1254495f42a32610c03591b49cd06ac09c5408742f86Richard Smith constexpr int k = 4; 1255495f42a32610c03591b49cd06ac09c5408742f86Richard Smith int &m = const_cast<int&>(k); 1256495f42a32610c03591b49cd06ac09c5408742f86Richard Smith 1257495f42a32610c03591b49cd06ac09c5408742f86Richard Smith // If we have nothing more interesting to say, ensure we don't produce a 1258495f42a32610c03591b49cd06ac09c5408742f86Richard Smith // useless note and instead just point to the non-constant subexpression. 1259495f42a32610c03591b49cd06ac09c5408742f86Richard Smith enum class E { 1260495f42a32610c03591b49cd06ac09c5408742f86Richard Smith em = m, 1261495f42a32610c03591b49cd06ac09c5408742f86Richard Smith en = n, // expected-error {{not a constant expression}} 1262495f42a32610c03591b49cd06ac09c5408742f86Richard Smith eo = (m + 1263495f42a32610c03591b49cd06ac09c5408742f86Richard Smith n // expected-error {{not a constant expression}} 1264495f42a32610c03591b49cd06ac09c5408742f86Richard Smith ), 1265495f42a32610c03591b49cd06ac09c5408742f86Richard Smith eq = reinterpret_cast<int>((int*)0) // expected-error {{not a constant expression}} expected-note {{reinterpret_cast}} 1266495f42a32610c03591b49cd06ac09c5408742f86Richard Smith }; 1267495f42a32610c03591b49cd06ac09c5408742f86Richard Smith} 1268d9b02e726262e4009dda830998bb934172ac0020Richard Smith 1269d9b02e726262e4009dda830998bb934172ac0020Richard Smithnamespace IndirectField { 1270d9b02e726262e4009dda830998bb934172ac0020Richard Smith struct S { 1271d9b02e726262e4009dda830998bb934172ac0020Richard Smith struct { // expected-warning {{GNU extension}} 1272f2705196d83a162665d4350bf3bb464972974ee3Richard Smith union { // expected-warning {{declared in an anonymous struct}} 1273f2705196d83a162665d4350bf3bb464972974ee3Richard Smith struct { // expected-warning {{GNU extension}} expected-warning {{declared in an anonymous union}} 1274d9b02e726262e4009dda830998bb934172ac0020Richard Smith int a; 1275d9b02e726262e4009dda830998bb934172ac0020Richard Smith int b; 1276d9b02e726262e4009dda830998bb934172ac0020Richard Smith }; 1277d9b02e726262e4009dda830998bb934172ac0020Richard Smith int c; 1278d9b02e726262e4009dda830998bb934172ac0020Richard Smith }; 1279d9b02e726262e4009dda830998bb934172ac0020Richard Smith int d; 1280d9b02e726262e4009dda830998bb934172ac0020Richard Smith }; 1281d9b02e726262e4009dda830998bb934172ac0020Richard Smith union { 1282d9b02e726262e4009dda830998bb934172ac0020Richard Smith int e; 1283d9b02e726262e4009dda830998bb934172ac0020Richard Smith int f; 1284d9b02e726262e4009dda830998bb934172ac0020Richard Smith }; 1285d9b02e726262e4009dda830998bb934172ac0020Richard Smith constexpr S(int a, int b, int d, int e) : a(a), b(b), d(d), e(e) {} 1286d9b02e726262e4009dda830998bb934172ac0020Richard Smith constexpr S(int c, int d, int f) : c(c), d(d), f(f) {} 1287d9b02e726262e4009dda830998bb934172ac0020Richard Smith }; 1288d9b02e726262e4009dda830998bb934172ac0020Richard Smith 1289d9b02e726262e4009dda830998bb934172ac0020Richard Smith constexpr S s1(1, 2, 3, 4); 1290d9b02e726262e4009dda830998bb934172ac0020Richard Smith constexpr S s2(5, 6, 7); 1291d9b02e726262e4009dda830998bb934172ac0020Richard Smith 1292d9b02e726262e4009dda830998bb934172ac0020Richard Smith // FIXME: The diagnostics here do a very poor job of explaining which unnamed 1293d9b02e726262e4009dda830998bb934172ac0020Richard Smith // member is active and which is requested. 1294d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s1.a == 1, ""); 1295d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s1.b == 2, ""); 1296d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s1.c == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}} 1297d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s1.d == 3, ""); 1298d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s1.e == 4, ""); 1299d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s1.f == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}} 1300d9b02e726262e4009dda830998bb934172ac0020Richard Smith 1301d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s2.a == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}} 1302d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s2.b == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}} 1303d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s2.c == 5, ""); 1304d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s2.d == 6, ""); 1305d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s2.e == 0, ""); // expected-error {{constant expression}} expected-note {{union with active member}} 1306d9b02e726262e4009dda830998bb934172ac0020Richard Smith static_assert(s2.f == 7, ""); 1307d9b02e726262e4009dda830998bb934172ac0020Richard Smith} 1308f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith 1309b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith// DR1405: don't allow reading mutable members in constant expressions. 1310b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smithnamespace MutableMembers { 1311b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith struct MM { 1312b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith mutable int n; // expected-note 3{{declared here}} 1313b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith } constexpr mm = { 4 }; 1314b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith constexpr int mmn = mm.n; // expected-error {{constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}} 1315b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith int x = (mm.n = 1, 3); 1316b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith constexpr int mmn2 = mm.n; // expected-error {{constant expression}} expected-note {{read of mutable member 'n' is not allowed in a constant expression}} 1317b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith 1318b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith // Here's one reason why allowing this would be a disaster... 1319b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith template<int n> struct Id { int k = n; }; 1320b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith int f() { 1321b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith constexpr MM m = { 0 }; 1322b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith ++m.n; 1323b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith 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}} 1324b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith } 1325b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith 1326b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith struct A { int n; }; 1327b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith struct B { mutable A a; }; // expected-note {{here}} 1328b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith struct C { B b; }; 1329b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith constexpr C c[3] = {}; 1330b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith constexpr int k = c[1].b.a.n; // expected-error {{constant expression}} expected-note {{mutable}} 1331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct D { int x; mutable int y; }; // expected-note {{here}} 1333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr D d1 = { 1, 2 }; 1334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int l = ++d1.y; 1335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr D d2 = d1; // expected-error {{constant}} expected-note {{mutable}} expected-note {{in call}} 1336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1337176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct E { 1338176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines union { 1339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int a; 1340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines mutable int b; // expected-note {{here}} 1341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 1342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 1343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr E e1 = {{1}}; 1344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr E e2 = e1; // expected-error {{constant}} expected-note {{mutable}} expected-note {{in call}} 1345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct F { 1347176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines union U { }; 1348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines mutable U u; 1349176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct X { }; 1350176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines mutable X x; 1351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct Y : X { X x; U u; }; 1352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines mutable Y y; 1353176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int n; 1354176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 1355176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // This is OK; we don't actually read any mutable state here. 1356176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr F f1 = {}; 1357176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr F f2 = f1; 1358176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1359176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct G { 1360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct X {}; 1361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines union U { X a; }; 1362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines mutable U u; // expected-note {{here}} 1363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 1364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr G g1 = {}; 1365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr G g2 = g1; // expected-error {{constant}} expected-note {{mutable}} expected-note {{in call}} 1366176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr G::U gu1 = {}; 1367176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr G::U gu2 = gu1; 1368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1369176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines union H { 1370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines mutable G::X gx; // expected-note {{here}} 1371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 1372176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr H h1 = {}; 1373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr H h2 = h1; // expected-error {{constant}} expected-note {{mutable}} expected-note {{in call}} 1374b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith} 1375b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith 1376f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smithnamespace Fold { 1377f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith 1378f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith // This macro forces its argument to be constant-folded, even if it's not 1379f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith // otherwise a constant expression. 1380f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith #define fold(x) (__builtin_constant_p(x) ? (x) : (x)) 1381f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith 1382f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith constexpr int n = (int)(char*)123; // expected-error {{constant expression}} expected-note {{reinterpret_cast}} 1383f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith constexpr int m = fold((int)(char*)123); // ok 1384f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith static_assert(m == 123, ""); 1385f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith 1386f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith #undef fold 1387f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith 1388f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith} 138983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith 139083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithnamespace DR1454 { 139183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith 139283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithconstexpr const int &f(const int &n) { return n; } 139383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithconstexpr int k1 = f(0); // ok 139483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith 139583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithstruct Wrap { 139683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith const int &value; 139783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith}; 139883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithconstexpr const Wrap &g(const Wrap &w) { return w; } 139983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithconstexpr int k2 = g({0}).value; // ok 140083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith 1401211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith// The temporary here has static storage duration, so we can bind a constexpr 1402211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith// reference to it. 1403211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithconstexpr const int &i = 1; 1404211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithconstexpr const int j = i; 1405211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithstatic_assert(j == 1, ""); 1406211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 1407211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith// The temporary here is not const, so it can't be read outside the expression 1408211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith// in which it was created (per the C++14 rules, which we use to avoid a C++11 1409211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith// defect). 1410211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithconstexpr int &&k = 1; // expected-note {{temporary created here}} 1411211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithconstexpr const int l = k; // expected-error {{constant expression}} expected-note {{read of temporary}} 1412211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 1413211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithvoid f() { 1414211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // The temporary here has automatic storage duration, so we can't bind a 1415211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // constexpr reference to it. 1416211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith constexpr const int &i = 1; // expected-error {{constant expression}} expected-note 2{{temporary}} 1417211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith} 141883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith 141983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith} 142074e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith 142174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smithnamespace RecursiveOpaqueExpr { 142274e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith template<typename Iter> 142374e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith constexpr auto LastNonzero(Iter p, Iter q) -> decltype(+*p) { 142474e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith return p != q ? (LastNonzero(p+1, q) ?: *p) : 0; // expected-warning {{GNU}} 142574e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith } 142674e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith 142774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith constexpr int arr1[] = { 1, 0, 0, 3, 0, 2, 0, 4, 0, 0 }; 142874e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith static_assert(LastNonzero(begin(arr1), end(arr1)) == 4, ""); 142974e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith 143074e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith constexpr int arr2[] = { 1, 0, 0, 3, 0, 2, 0, 4, 0, 5 }; 143174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith static_assert(LastNonzero(begin(arr2), end(arr2)) == 5, ""); 1432e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith 1433e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith constexpr int arr3[] = { 1434e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith 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, 1435e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith 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, 1436e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith 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, 1437e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith 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, 1438e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith 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, 1439e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith 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, 1440e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith 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, 1441e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith 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 }; 1442e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith static_assert(LastNonzero(begin(arr3), end(arr3)) == 2, ""); 144374e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith} 144474e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith 144574e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smithnamespace VLASizeof { 144674e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith 144774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith void f(int k) { 144874e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith int arr[k]; // expected-warning {{C99}} 144974e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith constexpr int n = 1 + 145074e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith sizeof(arr) // expected-error {{constant expression}} 145174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith * 3; 145274e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith } 145374e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith} 1454b78ae9716576399145786b93f687943f8b197170Richard Smith 1455b78ae9716576399145786b93f687943f8b197170Richard Smithnamespace CompoundLiteral { 1456b78ae9716576399145786b93f687943f8b197170Richard Smith // FIXME: 1457b78ae9716576399145786b93f687943f8b197170Richard Smith // We don't model the semantics of this correctly: the compound literal is 1458b78ae9716576399145786b93f687943f8b197170Richard Smith // represented as a prvalue in the AST, but actually behaves like an lvalue. 1459b78ae9716576399145786b93f687943f8b197170Richard Smith // We treat the compound literal as a temporary and refuse to produce a 1460b78ae9716576399145786b93f687943f8b197170Richard Smith // pointer to it. This is OK: we're not required to treat this as a constant 1461b78ae9716576399145786b93f687943f8b197170Richard Smith // in C++, and in C we model compound literals as lvalues. 1462b78ae9716576399145786b93f687943f8b197170Richard Smith constexpr int *p = (int*)(int[1]){0}; // expected-warning {{C99}} expected-error {{constant expression}} expected-note 2{{temporary}} 1463b78ae9716576399145786b93f687943f8b197170Richard Smith} 14644b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith 14654b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smithnamespace Vector { 14664b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith typedef int __attribute__((vector_size(16))) VI4; 14674b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith constexpr VI4 f(int n) { 14684b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith return VI4 { n * 3, n + 4, n - 5, n / 6 }; 14694b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith } 14704b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith constexpr auto v1 = f(10); 14714b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith 14724b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith typedef double __attribute__((vector_size(32))) VD4; 14734b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith constexpr VD4 g(int n) { 14744b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith return (VD4) { n / 2.0, n + 1.5, n - 5.4, n * 0.9 }; // expected-warning {{C99}} 14754b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith } 14764b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith constexpr auto v2 = g(4); 14774b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith} 14788d59deec807ed53efcd07855199cdc9c979f447fJohn McCall 14798d59deec807ed53efcd07855199cdc9c979f447fJohn McCall// PR12626, redux 14808d59deec807ed53efcd07855199cdc9c979f447fJohn McCallnamespace InvalidClasses { 14818d59deec807ed53efcd07855199cdc9c979f447fJohn McCall void test0() { 14828d59deec807ed53efcd07855199cdc9c979f447fJohn McCall struct X; // expected-note {{forward declaration}} 14838d59deec807ed53efcd07855199cdc9c979f447fJohn McCall struct Y { bool b; X x; }; // expected-error {{field has incomplete type}} 14848d59deec807ed53efcd07855199cdc9c979f447fJohn McCall Y y; 14858d59deec807ed53efcd07855199cdc9c979f447fJohn McCall auto& b = y.b; 14868d59deec807ed53efcd07855199cdc9c979f447fJohn McCall } 14878d59deec807ed53efcd07855199cdc9c979f447fJohn McCall} 1488dbbecccb8431bb4545fc01c6401abc4253667360Richard Smith 1489a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithnamespace NamespaceAlias { 1490a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith constexpr int f() { 1491176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines namespace NS = NamespaceAlias; // expected-warning {{use of this statement in a constexpr function is a C++14 extension}} 1492a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return &NS::f != nullptr; 1493a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith } 1494a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 1495a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 1496622da859b816036290b7e6f046521e4dea388361Richard Smith// Constructors can be implicitly constexpr, even for a non-literal type. 1497622da859b816036290b7e6f046521e4dea388361Richard Smithnamespace ImplicitConstexpr { 1498622da859b816036290b7e6f046521e4dea388361Richard Smith struct Q { Q() = default; Q(const Q&) = default; Q(Q&&) = default; ~Q(); }; // expected-note 3{{here}} 1499604fb38cd943649bee579103d17ca6cda4aad144Richard Smith struct R { constexpr R() noexcept; constexpr R(const R&) noexcept; constexpr R(R&&) noexcept; ~R() noexcept; }; 1500622da859b816036290b7e6f046521e4dea388361Richard Smith struct S { R r; }; // expected-note 3{{here}} 1501604fb38cd943649bee579103d17ca6cda4aad144Richard Smith struct T { T(const T&) noexcept; T(T &&) noexcept; ~T() noexcept; }; 1502622da859b816036290b7e6f046521e4dea388361Richard Smith struct U { T t; }; // expected-note 3{{here}} 1503622da859b816036290b7e6f046521e4dea388361Richard Smith static_assert(!__is_literal_type(Q), ""); 1504622da859b816036290b7e6f046521e4dea388361Richard Smith static_assert(!__is_literal_type(R), ""); 1505622da859b816036290b7e6f046521e4dea388361Richard Smith static_assert(!__is_literal_type(S), ""); 1506622da859b816036290b7e6f046521e4dea388361Richard Smith static_assert(!__is_literal_type(T), ""); 1507622da859b816036290b7e6f046521e4dea388361Richard Smith static_assert(!__is_literal_type(U), ""); 1508622da859b816036290b7e6f046521e4dea388361Richard Smith struct Test { 1509622da859b816036290b7e6f046521e4dea388361Richard Smith friend Q::Q() noexcept; // expected-error {{follows constexpr}} 1510622da859b816036290b7e6f046521e4dea388361Richard Smith friend Q::Q(Q&&) noexcept; // expected-error {{follows constexpr}} 1511622da859b816036290b7e6f046521e4dea388361Richard Smith friend Q::Q(const Q&) noexcept; // expected-error {{follows constexpr}} 1512622da859b816036290b7e6f046521e4dea388361Richard Smith friend S::S() noexcept; // expected-error {{follows constexpr}} 1513622da859b816036290b7e6f046521e4dea388361Richard Smith friend S::S(S&&) noexcept; // expected-error {{follows constexpr}} 1514622da859b816036290b7e6f046521e4dea388361Richard Smith friend S::S(const S&) noexcept; // expected-error {{follows constexpr}} 1515622da859b816036290b7e6f046521e4dea388361Richard Smith friend constexpr U::U() noexcept; // expected-error {{follows non-constexpr}} 1516622da859b816036290b7e6f046521e4dea388361Richard Smith friend constexpr U::U(U&&) noexcept; // expected-error {{follows non-constexpr}} 1517622da859b816036290b7e6f046521e4dea388361Richard Smith friend constexpr U::U(const U&) noexcept; // expected-error {{follows non-constexpr}} 1518622da859b816036290b7e6f046521e4dea388361Richard Smith }; 1519622da859b816036290b7e6f046521e4dea388361Richard Smith} 1520622da859b816036290b7e6f046521e4dea388361Richard Smith 1521dbbecccb8431bb4545fc01c6401abc4253667360Richard Smith// Indirectly test that an implicit lvalue to xvalue conversion performed for 1522dbbecccb8431bb4545fc01c6401abc4253667360Richard Smith// an NRVO move operation isn't implemented as CK_LValueToRValue. 1523dbbecccb8431bb4545fc01c6401abc4253667360Richard Smithnamespace PR12826 { 1524dbbecccb8431bb4545fc01c6401abc4253667360Richard Smith struct Foo {}; 1525dbbecccb8431bb4545fc01c6401abc4253667360Richard Smith constexpr Foo id(Foo x) { return x; } 1526dbbecccb8431bb4545fc01c6401abc4253667360Richard Smith constexpr Foo res(id(Foo())); 1527dbbecccb8431bb4545fc01c6401abc4253667360Richard Smith} 1528f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 1529f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smithnamespace PR13273 { 1530f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith struct U { 1531f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith int t; 1532f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith U() = default; 1533f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith }; 1534f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 1535f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith struct S : U { 1536f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith S() = default; 1537f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith }; 1538f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith 1539f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // S's default constructor isn't constexpr, because U's default constructor 1540f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // doesn't initialize 't', but it's trivial, so value-initialization doesn't 1541f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith // actually call it. 1542f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith static_assert(S{}.t == 0, ""); 1543f4bb8d06c4f1665f89a9e9ddd61f2a2d26904da0Richard Smith} 154420599392a99956eaac4cf351a0935574090cb6c3Richard Smith 154520599392a99956eaac4cf351a0935574090cb6c3Richard Smithnamespace PR12670 { 154620599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct S { 154720599392a99956eaac4cf351a0935574090cb6c3Richard Smith constexpr S(int a0) : m(a0) {} 154820599392a99956eaac4cf351a0935574090cb6c3Richard Smith constexpr S() : m(6) {} 154920599392a99956eaac4cf351a0935574090cb6c3Richard Smith int m; 155020599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 155120599392a99956eaac4cf351a0935574090cb6c3Richard Smith constexpr S x[3] = { {4}, 5 }; 155220599392a99956eaac4cf351a0935574090cb6c3Richard Smith static_assert(x[0].m == 4, ""); 155320599392a99956eaac4cf351a0935574090cb6c3Richard Smith static_assert(x[1].m == 5, ""); 155420599392a99956eaac4cf351a0935574090cb6c3Richard Smith static_assert(x[2].m == 6, ""); 155520599392a99956eaac4cf351a0935574090cb6c3Richard Smith} 1556604fb38cd943649bee579103d17ca6cda4aad144Richard Smith 1557604fb38cd943649bee579103d17ca6cda4aad144Richard Smith// Indirectly test that an implicit lvalue-to-rvalue conversion is performed 1558604fb38cd943649bee579103d17ca6cda4aad144Richard Smith// when a conditional operator has one argument of type void and where the other 1559604fb38cd943649bee579103d17ca6cda4aad144Richard Smith// is a glvalue of class type. 1560604fb38cd943649bee579103d17ca6cda4aad144Richard Smithnamespace ConditionalLValToRVal { 1561604fb38cd943649bee579103d17ca6cda4aad144Richard Smith struct A { 1562604fb38cd943649bee579103d17ca6cda4aad144Richard Smith constexpr A(int a) : v(a) {} 1563604fb38cd943649bee579103d17ca6cda4aad144Richard Smith int v; 1564604fb38cd943649bee579103d17ca6cda4aad144Richard Smith }; 1565604fb38cd943649bee579103d17ca6cda4aad144Richard Smith 1566604fb38cd943649bee579103d17ca6cda4aad144Richard Smith constexpr A f(const A &a) { 1567604fb38cd943649bee579103d17ca6cda4aad144Richard Smith return a.v == 0 ? throw a : a; 1568604fb38cd943649bee579103d17ca6cda4aad144Richard Smith } 1569604fb38cd943649bee579103d17ca6cda4aad144Richard Smith 1570604fb38cd943649bee579103d17ca6cda4aad144Richard Smith constexpr A a(4); 1571604fb38cd943649bee579103d17ca6cda4aad144Richard Smith static_assert(f(a).v == 4, ""); 1572604fb38cd943649bee579103d17ca6cda4aad144Richard Smith} 157329f431b3e310ae6bd367dccf5a2794ad1cac9592Hans Wennborg 157429f431b3e310ae6bd367dccf5a2794ad1cac9592Hans Wennborgnamespace TLS { 157529f431b3e310ae6bd367dccf5a2794ad1cac9592Hans Wennborg __thread int n; 157648def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg int m; 157748def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg 157848def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg constexpr bool b = &n == &n; 157948def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg 158048def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg constexpr int *p = &n; // expected-error{{constexpr variable 'p' must be initialized by a constant expression}} 158148def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg 158248def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg constexpr int *f() { return &n; } 158348def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg constexpr int *q = f(); // expected-error{{constexpr variable 'q' must be initialized by a constant expression}} 158448def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg constexpr bool c = f() == f(); 158548def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg 158648def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg constexpr int *g() { return &m; } 158748def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg constexpr int *r = g(); 158829f431b3e310ae6bd367dccf5a2794ad1cac9592Hans Wennborg} 158901cad02220180b9646525295f502c00c64a172d0Richard Smith 159001cad02220180b9646525295f502c00c64a172d0Richard Smithnamespace Void { 159101cad02220180b9646525295f502c00c64a172d0Richard Smith constexpr void f() { return; } // expected-error{{constexpr function's return type 'void' is not a literal type}} 159201cad02220180b9646525295f502c00c64a172d0Richard Smith 159301cad02220180b9646525295f502c00c64a172d0Richard Smith void assert_failed(const char *msg, const char *file, int line); // expected-note {{declared here}} 159401cad02220180b9646525295f502c00c64a172d0Richard Smith#define ASSERT(expr) ((expr) ? static_cast<void>(0) : assert_failed(#expr, __FILE__, __LINE__)) 159501cad02220180b9646525295f502c00c64a172d0Richard Smith template<typename T, size_t S> 159601cad02220180b9646525295f502c00c64a172d0Richard Smith constexpr T get(T (&a)[S], size_t k) { 159701cad02220180b9646525295f502c00c64a172d0Richard Smith return ASSERT(k > 0 && k < S), a[k]; // expected-note{{non-constexpr function 'assert_failed'}} 159801cad02220180b9646525295f502c00c64a172d0Richard Smith } 159901cad02220180b9646525295f502c00c64a172d0Richard Smith#undef ASSERT 160001cad02220180b9646525295f502c00c64a172d0Richard Smith template int get(int (&a)[4], size_t); 160101cad02220180b9646525295f502c00c64a172d0Richard Smith constexpr int arr[] = { 4, 1, 2, 3, 4 }; 160201cad02220180b9646525295f502c00c64a172d0Richard Smith static_assert(get(arr, 1) == 1, ""); 160301cad02220180b9646525295f502c00c64a172d0Richard Smith static_assert(get(arr, 4) == 4, ""); 160401cad02220180b9646525295f502c00c64a172d0Richard Smith static_assert(get(arr, 0) == 4, ""); // expected-error{{not an integral constant expression}} \ 160501cad02220180b9646525295f502c00c64a172d0Richard Smith // expected-note{{in call to 'get(arr, 0)'}} 160601cad02220180b9646525295f502c00c64a172d0Richard Smith} 16079be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith 16089be36ab27b874b404099650e0c29bc92f3c7662dRichard Smithnamespace std { struct type_info; } 16099be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith 16109be36ab27b874b404099650e0c29bc92f3c7662dRichard Smithnamespace TypeId { 16119be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith struct A { virtual ~A(); }; 16129be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith A f(); 16139be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith A &g(); 16149be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith constexpr auto &x = typeid(f()); 16159be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith constexpr auto &y = typeid(g()); // expected-error{{constant expression}} \ 16160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // expected-note{{typeid applied to expression of polymorphic type 'TypeId::A' is not allowed in a constant expression}} \ 16170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // expected-warning {{expression with side effects will be evaluated despite being used as an operand to 'typeid'}} 16189be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith} 16199568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith 16209568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smithnamespace PR14203 { 16219568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith struct duration { 16229568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith constexpr duration() {} 16239568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith constexpr operator int() const { return 0; } 16249568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith }; 16259568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith template<typename T> void f() { 16269568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith // If we want to evaluate this at the point of the template definition, we 16279568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith // need to trigger the implicit definition of the move constructor at that 16289568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith // point. 16299568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith // FIXME: C++ does not permit us to implicitly define it at the appropriate 16309568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith // times, since it is only allowed to be implicitly defined when it is 16319568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith // odr-used. 16329568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith constexpr duration d = duration(); 16339568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith } 16349568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith // FIXME: It's unclear whether this is valid. On the one hand, we're not 16359568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith // allowed to generate a move constructor. On the other hand, if we did, 1636ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // this would be a constant expression. For now, we generate a move 1637ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // constructor here. 1638ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith int n = sizeof(short{duration(duration())}); 16399568f0c13a84695c5cc064e7c32412f84604cb1eRichard Smith} 164099ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith 164199ad35921aa6c1b200b6432c066961f930fce1e1Richard Smithnamespace ArrayEltInit { 164299ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith struct A { 164399ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith constexpr A() : p(&p) {} 164499ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith void *p; 164599ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith }; 164699ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith constexpr A a[10]; 164799ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith static_assert(a[0].p == &a[0].p, ""); 164899ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith static_assert(a[9].p == &a[9].p, ""); 164999ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith static_assert(a[0].p != &a[9].p, ""); 165099ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith static_assert(a[9].p != &a[0].p, ""); 165199ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith 165299ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith constexpr A b[10] = {}; 165399ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith static_assert(b[0].p == &b[0].p, ""); 165499ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith static_assert(b[9].p == &b[9].p, ""); 165599ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith static_assert(b[0].p != &b[9].p, ""); 165699ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith static_assert(b[9].p != &b[0].p, ""); 165799ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith} 1658a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith 1659a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smithnamespace PR15884 { 1660a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith struct S {}; 1661a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith constexpr S f() { return {}; } 1662a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith constexpr S *p = &f(); 1663a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith // expected-error@-1 {{taking the address of a temporary}} 1664a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith // expected-error@-2 {{constexpr variable 'p' must be initialized by a constant expression}} 1665a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith // expected-note@-3 {{pointer to temporary is not a constant expression}} 1666a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith // expected-note@-4 {{temporary created here}} 1667a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith} 1668f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith 1669f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smithnamespace AfterError { 1670f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith // FIXME: Suppress the 'no return statements' diagnostic if the body is invalid. 1671f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith constexpr int error() { // expected-error {{no return statement}} 1672f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith return foobar; // expected-error {{undeclared identifier}} 1673f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith } 1674f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith constexpr int k = error(); // expected-error {{must be initialized by a constant expression}} 1675f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith} 16767c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 16777c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithnamespace std { 16787c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef decltype(sizeof(int)) size_t; 16797c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 16807c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith template <class _E> 16817c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith class initializer_list 16827c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith { 16837c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith const _E* __begin_; 16847c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith size_t __size_; 16857c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 16867c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr initializer_list(const _E* __b, size_t __s) 16877c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith : __begin_(__b), 16887c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith __size_(__s) 16897c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith {} 16907c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 16917c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith public: 16927c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef _E value_type; 16937c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef const _E& reference; 16947c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef const _E& const_reference; 16957c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef size_t size_type; 16967c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 16977c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef const _E* iterator; 16987c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef const _E* const_iterator; 16997c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 17007c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr initializer_list() : __begin_(nullptr), __size_(0) {} 17017c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 17027c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr size_t size() const {return __size_;} 17037c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr const _E* begin() const {return __begin_;} 17047c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr const _E* end() const {return __begin_ + __size_;} 17057c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith }; 17067c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith} 17077c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 17087c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithnamespace InitializerList { 17097c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr int sum(const int *b, const int *e) { 17107c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return b != e ? *b + sum(b+1, e) : 0; 17117c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 17127c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr int sum(std::initializer_list<int> ints) { 17137c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return sum(ints.begin(), ints.end()); 17147c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 17157c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith static_assert(sum({1, 2, 3, 4, 5}) == 15, ""); 17160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 17170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines static_assert(*std::initializer_list<int>{1, 2, 3}.begin() == 1, ""); 17180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines static_assert(std::initializer_list<int>{1, 2, 3}.begin()[2] == 3, ""); 17197c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith} 172037a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith 172137a84f653c196aa0b73fad96707175a62dcb6a12Richard Smithnamespace StmtExpr { 172237a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith struct A { int k; }; 172337a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith void f() { 172437a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith static_assert(({ const int x = 5; x * 3; }) == 15, ""); // expected-warning {{extension}} 172537a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith constexpr auto a = ({ A(); }); // expected-warning {{extension}} 172637a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith } 172737a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith constexpr int g(int k) { 172837a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith return ({ // expected-warning {{extension}} 172937a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith const int x = k; 173037a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith x * x; 173137a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith }); 173237a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith } 173337a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith static_assert(g(123) == 15129, ""); 173437a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith constexpr int h() { // expected-error {{never produces a constant}} 173537a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith return ({ // expected-warning {{extension}} 173637a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith return 0; // expected-note {{not supported}} 173737a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith 1; 173837a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith }); 173937a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith } 174037a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith} 1741db2fe739e5aac227d85d149efc9036696997a26fRichard Smith 1742db2fe739e5aac227d85d149efc9036696997a26fRichard Smithnamespace VirtualFromBase { 1743db2fe739e5aac227d85d149efc9036696997a26fRichard Smith struct S1 { 1744db2fe739e5aac227d85d149efc9036696997a26fRichard Smith virtual int f() const; 1745db2fe739e5aac227d85d149efc9036696997a26fRichard Smith }; 1746db2fe739e5aac227d85d149efc9036696997a26fRichard Smith struct S2 { 1747db2fe739e5aac227d85d149efc9036696997a26fRichard Smith virtual int f(); 1748db2fe739e5aac227d85d149efc9036696997a26fRichard Smith }; 1749db2fe739e5aac227d85d149efc9036696997a26fRichard Smith template <typename T> struct X : T { 1750db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr X() {} 1751db2fe739e5aac227d85d149efc9036696997a26fRichard Smith double d = 0.0; 1752176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int f() { return sizeof(T); } // expected-warning {{will not be implicitly 'const' in C++14}} 1753db2fe739e5aac227d85d149efc9036696997a26fRichard Smith }; 1754db2fe739e5aac227d85d149efc9036696997a26fRichard Smith 1755db2fe739e5aac227d85d149efc9036696997a26fRichard Smith // Virtual f(), not OK. 1756db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr X<X<S1>> xxs1; 1757db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr X<S1> *p = const_cast<X<X<S1>>*>(&xxs1); 1758db2fe739e5aac227d85d149efc9036696997a26fRichard Smith static_assert(p->f() == sizeof(X<S1>), ""); // expected-error {{constant expression}} expected-note {{virtual function call}} 1759db2fe739e5aac227d85d149efc9036696997a26fRichard Smith 1760db2fe739e5aac227d85d149efc9036696997a26fRichard Smith // Non-virtual f(), OK. 1761db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr X<X<S2>> xxs2; 1762db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr X<S2> *q = const_cast<X<X<S2>>*>(&xxs2); 1763db2fe739e5aac227d85d149efc9036696997a26fRichard Smith static_assert(q->f() == sizeof(S2), ""); 1764db2fe739e5aac227d85d149efc9036696997a26fRichard Smith} 17655fb478be9b91f15624e855e7bd6ac2101021ac48Eli Friedman 17665fb478be9b91f15624e855e7bd6ac2101021ac48Eli Friedmannamespace ConstexprConstructorRecovery { 1767176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines class X { 1768176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines public: 1769176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines enum E : short { 1770176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines headers = 0x1, 1771176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines middlefile = 0x2, 1772176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines choices = 0x4 1773176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 1774176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr X() noexcept {}; 1775176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines protected: 17765fb478be9b91f15624e855e7bd6ac2101021ac48Eli Friedman E val{0}; // expected-error {{cannot initialize a member subobject of type 'ConstexprConstructorRecovery::X::E' with an rvalue of type 'int'}} 1777176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 17785fb478be9b91f15624e855e7bd6ac2101021ac48Eli Friedman constexpr X x{}; 17795fb478be9b91f15624e855e7bd6ac2101021ac48Eli Friedman} 178003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith 178103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smithnamespace Lifetime { 178203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith void f() { 178303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr int &n = n; // expected-error {{constant expression}} expected-note {{use of reference outside its lifetime}} expected-warning {{not yet bound to a value}} 178403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr int m = m; // expected-error {{constant expression}} expected-note {{read of object outside its lifetime}} 178503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith } 178603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith 178703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr int &get(int &&n) { return n; } 178803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith struct S { 178903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int &&r; // expected-note 2{{declared here}} 179003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int &s; 179103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int t; 179203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr S() : r(0), s(get(0)), t(r) {} // expected-warning {{temporary}} 179303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr S(int) : r(0), s(get(0)), t(s) {} // expected-warning {{temporary}} expected-note {{read of object outside its lifetime}} 179403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith }; 179503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr int k1 = S().t; // ok, int is lifetime-extended to end of constructor 179603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr int k2 = S(0).t; // expected-error {{constant expression}} expected-note {{in call}} 179703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith} 17983835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith 17993835a4ef050da466038844274d79f1fc9d77c0f1Richard Smithnamespace Bitfields { 18003835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith struct A { 18013835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith bool b : 1; 18023835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith unsigned u : 5; 18033835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith int n : 5; 18043835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith bool b2 : 3; 18053835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith unsigned u2 : 74; // expected-warning {{exceeds the size of its type}} 18063835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith int n2 : 81; // expected-warning {{exceeds the size of its type}} 18073835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith }; 18083835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith 18093835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith constexpr A a = { false, 33, 31, false, 0xffffffff, 0x7fffffff }; // expected-warning 2{{truncation}} 18103835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith static_assert(a.b == 0 && a.u == 1 && a.n == -1 && a.b2 == 0 && 18113835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith a.u2 + 1 == 0 && a.n2 == 0x7fffffff, 18123835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith "bad truncation of bitfield values"); 18133835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith 18143835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith struct B { 18153835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith int n : 3; 18163835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith constexpr B(int k) : n(k) {} 18173835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith }; 18183835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith static_assert(B(3).n == 3, ""); 18193835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith static_assert(B(4).n == -4, ""); 18203835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith static_assert(B(7).n == -1, ""); 18213835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith static_assert(B(8).n == 0, ""); 18223835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith static_assert(B(-1).n == -1, ""); 18233835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith static_assert(B(-8889).n == -1, ""); 18243835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith 18253835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith namespace PR16755 { 18263835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith struct X { 18273835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith int x : 1; 18283835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith constexpr static int f(int x) { 18293835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith return X{x}.x; 18303835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith } 18313835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith }; 18323835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith static_assert(X::f(3) == -1, "3 should truncate to -1"); 18333835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith } 18343835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith} 1835812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith 1836812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smithnamespace ZeroSizeTypes { 1837812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith constexpr int (*p1)[0] = 0, (*p2)[0] = 0; 1838812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith constexpr int k = p2 - p1; 1839812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith // expected-error@-1 {{constexpr variable 'k' must be initialized by a constant expression}} 1840812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith // expected-note@-2 {{subtraction of pointers to type 'int [0]' of zero size}} 1841812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith 1842812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith int arr[5][0]; 1843812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith constexpr int f() { // expected-error {{never produces a constant expression}} 1844812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith return &arr[3] - &arr[0]; // expected-note {{subtraction of pointers to type 'int [0]' of zero size}} 1845812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith } 1846812d6bcbd13190e6e5c2c915bf1499038d56b44bRichard Smith} 18471fca547913774c6c547a15414d1a7051c1f446b5Richard Smith 18481fca547913774c6c547a15414d1a7051c1f446b5Richard Smithnamespace BadDefaultInit { 18491fca547913774c6c547a15414d1a7051c1f446b5Richard Smith template<int N> struct X { static const int n = N; }; 18501fca547913774c6c547a15414d1a7051c1f446b5Richard Smith 1851176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct A { 1852176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int k = // expected-error {{cannot use defaulted default constructor of 'A' within the class outside of member functions because 'k' has an initializer}} 1853176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines X<A().k>::n; // expected-error {{not a constant expression}} expected-note {{implicit default constructor for 'BadDefaultInit::A' first required here}} 18541fca547913774c6c547a15414d1a7051c1f446b5Richard Smith }; 18551fca547913774c6c547a15414d1a7051c1f446b5Richard Smith 18561fca547913774c6c547a15414d1a7051c1f446b5Richard Smith // FIXME: The "constexpr constructor must initialize all members" diagnostic 18571fca547913774c6c547a15414d1a7051c1f446b5Richard Smith // here is bogus (we discard the k(k) initializer because the parameter 'k' 18581fca547913774c6c547a15414d1a7051c1f446b5Richard Smith // has been marked invalid). 18591fca547913774c6c547a15414d1a7051c1f446b5Richard Smith struct B { // expected-note 2{{candidate}} 18601fca547913774c6c547a15414d1a7051c1f446b5Richard Smith constexpr B( // expected-error {{must initialize all members}} expected-note {{candidate}} 18611fca547913774c6c547a15414d1a7051c1f446b5Richard Smith int k = X<B().k>::n) : // expected-error {{no matching constructor}} 18621fca547913774c6c547a15414d1a7051c1f446b5Richard Smith k(k) {} 18631fca547913774c6c547a15414d1a7051c1f446b5Richard Smith int k; // expected-note {{not initialized}} 18641fca547913774c6c547a15414d1a7051c1f446b5Richard Smith }; 18651fca547913774c6c547a15414d1a7051c1f446b5Richard Smith} 1866f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith 1867f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smithnamespace NeverConstantTwoWays { 1868f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith // If we see something non-constant but foldable followed by something 1869f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith // non-constant and not foldable, we want the first diagnostic, not the 1870f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith // second. 1871f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith constexpr int f(int n) { // expected-error {{never produces a constant expression}} 1872f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith return (int *)(long)&n == &n ? // expected-note {{reinterpret_cast}} 1873f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith 1 / 0 : // expected-warning {{division by zero}} 1874f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith 0; 1875f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith } 1876f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith 1877f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith // FIXME: We should diagnose the cast to long here, not the division by zero. 1878f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith constexpr int n = // expected-error {{must be initialized by a constant expression}} 1879f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith (int *)(long)&n == &n ? 1880f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith 1 / 0 : // expected-warning {{division by zero}} expected-note {{division by zero}} 1881f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith 0; 1882f490f0eaba5fed6236d8f8a965a2fd98fa41e891Richard Smith} 1883baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith 1884baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smithnamespace PR17800 { 1885baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith struct A { 1886baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith constexpr int operator()() const { return 0; } 1887baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith }; 1888baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith template <typename ...T> constexpr int sink(T ...) { 1889baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith return 0; 1890baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith } 1891baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith template <int ...N> constexpr int run() { 1892baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith return sink(A()() + N ...); 1893baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith } 1894baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith constexpr int k = run<1, 2, 3>(); 1895baa9af171fd7ac6ff6a1b5ca09bf77168c1728e7Richard Smith} 1896e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith 1897e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smithnamespace BuiltinStrlen { 1898e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr const char *a = "foo\0quux"; 1899e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr char b[] = "foo\0quux"; 1900e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr int f() { return 'u'; } 1901e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr char c[] = { 'f', 'o', 'o', 0, 'q', f(), 'u', 'x', 0 }; 1902e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith 1903e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith static_assert(__builtin_strlen("foo") == 3, ""); 1904e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith static_assert(__builtin_strlen("foo\0quux") == 3, ""); 1905e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith static_assert(__builtin_strlen("foo\0quux" + 4) == 4, ""); 1906e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith 1907e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr bool check(const char *p) { 1908e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith return __builtin_strlen(p) == 3 && 1909e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith __builtin_strlen(p + 1) == 2 && 1910e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith __builtin_strlen(p + 2) == 1 && 1911e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith __builtin_strlen(p + 3) == 0 && 1912e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith __builtin_strlen(p + 4) == 4 && 1913e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith __builtin_strlen(p + 5) == 3 && 1914e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith __builtin_strlen(p + 6) == 2 && 1915e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith __builtin_strlen(p + 7) == 1 && 1916e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith __builtin_strlen(p + 8) == 0; 1917e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith } 1918e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith 1919e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith static_assert(check(a), ""); 1920e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith static_assert(check(b), ""); 1921e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith static_assert(check(c), ""); 1922e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith 1923e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr int over1 = __builtin_strlen(a + 9); // expected-error {{constant expression}} expected-note {{one-past-the-end}} 1924e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr int over2 = __builtin_strlen(b + 9); // expected-error {{constant expression}} expected-note {{one-past-the-end}} 1925e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr int over3 = __builtin_strlen(c + 9); // expected-error {{constant expression}} expected-note {{one-past-the-end}} 1926e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith 1927e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr int under1 = __builtin_strlen(a - 1); // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} 1928e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr int under2 = __builtin_strlen(b - 1); // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} 1929e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr int under3 = __builtin_strlen(c - 1); // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} 1930e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith 1931e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith // FIXME: The diagnostic here could be better. 1932e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr char d[] = { 'f', 'o', 'o' }; // no nul terminator. 1933e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith constexpr int bad = __builtin_strlen(d); // expected-error {{constant expression}} expected-note {{one-past-the-end}} 1934e21432efa94079aa1a62f7d5ff3b47a92d3c8296Richard Smith} 1935651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1936651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR19010 { 1937651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct Empty {}; 1938651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct Empty2 : Empty {}; 1939651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct Test : Empty2 { 1940651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines constexpr Test() {} 1941651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Empty2 array[2]; 1942651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void test() { constexpr Test t; } 1944651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1945176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1946176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid PR21327(int a, int b) { 1947176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines static_assert(&a + 1 != &b, ""); // expected-error {{constant expression}} 1948176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 1949176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1950176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace EmptyClass { 1951176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct E1 {} e1; 1952176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines union E2 {} e2; // expected-note {{here}} 1953176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct E3 : E1 {} e3; 1954176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1955176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // The defaulted copy constructor for an empty class does not read any 1956176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // members. The defaulted copy constructor for an empty union reads the 1957176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // object representation. 1958176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr E1 e1b(e1); 1959176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr E2 e2b(e2); // expected-error {{constant expression}} expected-note{{read of non-const}} expected-note {{in call}} 1960176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr E3 e3b(e3); 1961176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 19620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19630e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesnamespace PR21786 { 19640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines extern void (*start[])(); 19650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines extern void (*end[])(); 19660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines static_assert(&start != &end, ""); // expected-error {{constant expression}} 19670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines static_assert(&start != nullptr, ""); 19680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines struct Foo; 19700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines struct Bar { 19710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines static const Foo x; 19720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines static const Foo y; 19730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines }; 19740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines static_assert(&Bar::x != nullptr, ""); 19750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines static_assert(&Bar::x != &Bar::y, ""); 19760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 19770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19780e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesnamespace PR21859 { 19790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines constexpr int Fun() { return; } // expected-error {{non-void constexpr function 'Fun' should return a value}} 19800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines constexpr int Var = Fun(); // expected-error {{constexpr variable 'Var' must be initialized by a constant expression}} 19810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 19820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19830e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct InvalidRedef { 19840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines int f; // expected-note{{previous definition is here}} 19850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines constexpr int f(void); // expected-error{{redefinition of 'f'}} expected-warning{{will not be implicitly 'const'}} 19860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}; 19870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19880e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesnamespace PR17938 { 19890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines template <typename T> constexpr T const &f(T const &x) { return x; } 19900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines struct X {}; 19920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines struct Y : X {}; 19930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines struct Z : Y { constexpr Z() {} }; 19940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines static constexpr auto z = f(Z()); 19960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 1997