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} 78ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 79ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smithnamespace Unevaluated { 80ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // We follow g++ in treating any reference to a constexpr function template 81ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // specialization as requiring an instantiation, even if it occurs in an 82ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // unevaluated context. 83ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // 84ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // We go slightly further than g++, and also trigger the implicit definition 85ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // of a defaulted special member in the same circumstances. This seems scary, 86ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // since a lot of classes have constexpr special members in C++11, but the 87ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // only observable impact should be the implicit instantiation of constexpr 88ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // special member templates (defaulted special members should only be 89ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // generated if they are well-formed, and non-constexpr special members in a 90ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // base or member cause the class's special member to not be constexpr). 91ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // 92ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // FIXME: None of this is required by the C++ standard. The rules in this 93ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // area are poorly specified, so this is subject to change. 94ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith namespace NotConstexpr { 95ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename T> struct S { 96ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith S() : n(0) {} 97ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith S(const S&) : n(T::error) {} 98ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith int n; 99ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith }; 100ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith struct U : S<int> {}; 101ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith decltype(U(U())) u; // ok, don't instantiate S<int>::S() because it wasn't declared constexpr 102ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 103ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith namespace Constexpr { 104ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename T> struct S { 105ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith constexpr S() : n(0) {} 106ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith constexpr S(const S&) : n(T::error) {} // expected-error {{has no members}} 107ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith int n; 108ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith }; 109ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith struct U : S<int> {}; // expected-note {{instantiation}} 110ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith decltype(U(U())) u; // expected-note {{here}} 111ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 112ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 113ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith namespace PR11851_Comment0 { 114ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<int x> constexpr int f() { return x; } 115ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<int i> void ovf(int (&x)[f<i>()]); 116ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith void f() { int x[10]; ovf<10>(x); } 117ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 118ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 119ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith namespace PR11851_Comment1 { 120ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename T> 121ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith constexpr bool Integral() { 122ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith return true; 123ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 124ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename T, bool Int = Integral<T>()> 125ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith struct safe_make_unsigned { 126ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith typedef T type; 127ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith }; 128ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename T> 129ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith using Make_unsigned = typename safe_make_unsigned<T>::type; 130ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template <typename T> 131ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith struct get_distance_type { 132ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith using type = int; 133ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith }; 134ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename R> 135ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith auto size(R) -> Make_unsigned<typename get_distance_type<R>::type>; 136ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith auto check() -> decltype(size(0)); 137ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 138ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 139ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith namespace PR11851_Comment6 { 140ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<int> struct foo {}; 141ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<class> constexpr int bar() { return 0; } 142ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<class T> foo<bar<T>()> foobar(); 143ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith auto foobar_ = foobar<int>(); 144ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 145ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 146ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith namespace PR11851_Comment9 { 147ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith struct S1 { 148ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith constexpr S1() {} 149ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith constexpr operator int() const { return 0; } 150ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith }; 151ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith int k1 = sizeof(short{S1(S1())}); 152ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 153ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith struct S2 { 154ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith constexpr S2() {} 155ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith constexpr operator int() const { return 123456; } 156ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith }; 1576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int k2 = sizeof(short{S2(S2())}); // expected-error {{cannot be narrowed}} expected-note {{insert an explicit cast to silence this issue}} 158ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 159ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 160ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith namespace PR12288 { 161ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template <typename> constexpr bool foo() { return true; } 162ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template <bool> struct bar {}; 163ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template <typename T> bar<foo<T>()> baz() { return bar<foo<T>()>(); } 164ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith int main() { baz<int>(); } 165ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 166ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 167ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith namespace PR13423 { 168ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<bool, typename> struct enable_if {}; 169ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename T> struct enable_if<true, T> { using type = T; }; 170ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 171ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename T> struct F { 172ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename U> 173ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith static constexpr bool f() { return sizeof(T) < U::size; } 174ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 175ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename U> 176ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith static typename enable_if<f<U>(), void>::type g() {} // expected-note {{disabled by 'enable_if'}} 177ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith }; 178ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 179ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith struct U { static constexpr int size = 2; }; 180ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 181ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith void h() { F<char>::g<U>(); } 182ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith void i() { F<int>::g<U>(); } // expected-error {{no matching function}} 183ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 184ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 185ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith namespace PR14203 { 186ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith struct duration { constexpr duration() {} }; 187ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 188ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template <typename> 189ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith void sleep_for() { 190ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith constexpr duration max = duration(); 191ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 192ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith } 193ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith} 194ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 195ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smithnamespace NoInstantiationWhenSelectingOverload { 196ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // Check that we don't instantiate conversion functions when we're checking 197ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // for the existence of an implicit conversion sequence, only when a function 198ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith // is actually chosen by overload resolution. 199ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith struct S { 200ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith template<typename T> constexpr S(T) : n(T::error) {} // expected-error {{no members}} 201ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith int n; 202ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith }; 203ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 204c99b90edb85ea0a5be6ce567a8c0147b76534e15Eli Friedman int f(S); 205c99b90edb85ea0a5be6ce567a8c0147b76534e15Eli Friedman int f(int); 206ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith 207ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith void g() { f(0); } 208ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith void h() { (void)sizeof(f(0)); } 209ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith void i() { (void)sizeof(f("oops")); } // expected-note {{instantiation of}} 210ce2661f9ccb85de1aacaa7c3ea414a757f5986f6Richard Smith} 211