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