| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++2a %s |
| |
| template <typename T1, typename T2> struct is_same { |
| static constexpr bool value = false; |
| }; |
| |
| template <typename T> struct is_same<T, T> { |
| static constexpr bool value = true; |
| }; |
| |
| template <class T, class U> |
| concept SameHelper = is_same<T, U>::value; |
| template <class T, class U> |
| concept same_as = SameHelper<T, U> && SameHelper<U, T>; |
| |
| namespace deferred_instantiation { |
| template <class X> constexpr X do_not_instantiate() { return nullptr; } |
| |
| struct T { |
| template <same_as<float> X> explicit(do_not_instantiate<X>()) T(X) {} |
| |
| T(int) {} |
| }; |
| |
| T t(5); |
| // expected-error@17{{cannot initialize}} |
| // expected-note@20{{in instantiation of function template specialization}} |
| // expected-note@30{{while substituting deduced template arguments}} |
| // expected-note@30{{in instantiation of function template specialization}} |
| T t2(5.0f); |
| } // namespace deferred_instantiation |