constexpr-instantiate.cpp revision 16581335fc32abcbc6ab14eda7af38cf759664b7
157b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith// RUN: %clang_cc1 -std=c++11 -verify %s 257b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 357b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smithnamespace UseBeforeDefinition { 457b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith struct A { 557b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith template<typename T> static constexpr T get() { return T(); } 657b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith // ok, not a constant expression. 757b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith int n = get<int>(); 857b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith }; 957b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 1057b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith // ok, constant expression. 1157b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith constexpr int j = A::get<int>(); 1257b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 1357b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith template<typename T> constexpr int consume(T); 1457b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith // ok, not a constant expression. 1557b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith const int k = consume(0); // expected-note {{here}} 1657b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 1757b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith template<typename T> constexpr int consume(T) { return 0; } 1857b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith // ok, constant expression. 1957b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith constexpr int l = consume(0); 2057b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 2157b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith constexpr int m = k; // expected-error {{constant expression}} expected-note {{initializer of 'k'}} 2257b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith} 2357b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 2457b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smithnamespace IntegralConst { 2557b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith template<typename T> constexpr T f(T n) { return n; } 2657b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith enum E { 2757b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith v = f(0), w = f(1) // ok 2857b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith }; 2957b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith static_assert(w == 1, ""); 3057b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 3157b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith char arr[f('x')]; // ok 3257b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith static_assert(sizeof(arr) == 'x', ""); 3357b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith} 3457b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 3557b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smithnamespace ConvertedConst { 3657b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith template<typename T> constexpr T f(T n) { return n; } 3757b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith int f() { 3857b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith switch (f()) { 3957b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith case f(4): return 0; 4057b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith } 4157b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith return 1; 4257b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith } 4357b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith} 4457b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 4557b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smithnamespace OverloadResolution { 4657b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith template<typename T> constexpr T f(T t) { return t; } 4757b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 4857b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith template<int n> struct S { }; 4957b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 5057b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith template<typename T> auto g(T t) -> S<f(sizeof(T))> &; 5157b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith char &f(...); 5257b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 5357b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith template<typename T> auto h(T t[f(sizeof(T))]) -> decltype(&*t) { 5457b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith return t; 5557b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith } 5657b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith 5757b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith S<4> &k = g(0); 5857b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith int *p, *q = h(p); 5957b9c4e9d85971e20ab0dac3eadabae672c43c62Richard Smith} 6037ce0104b182c9410cf2a76fe5a63a81dac876acRichard Smith 6137ce0104b182c9410cf2a76fe5a63a81dac876acRichard Smithnamespace DataMember { 6237ce0104b182c9410cf2a76fe5a63a81dac876acRichard Smith template<typename T> struct S { static const int k; }; 6337ce0104b182c9410cf2a76fe5a63a81dac876acRichard Smith const int n = S<int>::k; // expected-note {{here}} 6437ce0104b182c9410cf2a76fe5a63a81dac876acRichard Smith template<typename T> const int S<T>::k = 0; 6537ce0104b182c9410cf2a76fe5a63a81dac876acRichard Smith constexpr int m = S<int>::k; // ok 6637ce0104b182c9410cf2a76fe5a63a81dac876acRichard Smith constexpr int o = n; // expected-error {{constant expression}} expected-note {{initializer of 'n'}} 6737ce0104b182c9410cf2a76fe5a63a81dac876acRichard Smith} 6816581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith 6916581335fc32abcbc6ab14eda7af38cf759664b7Richard Smithnamespace Reference { 7016581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith const int k = 5; 7116581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith template<typename T> struct S { 7216581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith static volatile int &r; 7316581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith }; 7416581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith template<typename T> volatile int &S<T>::r = const_cast<volatile int&>(k); 7516581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith constexpr int n = const_cast<int&>(S<int>::r); 7616581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith static_assert(n == 5, ""); 7716581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith} 78