42 lines · cpp
1// RUN: %clang_cc1 -std=c++1z -verify %s2 3namespace std_example {4 template <class T> struct A {5 explicit A(const T &, ...) noexcept; // expected-note {{explicit}}6 A(T &&, ...); // expected-note 2{{candidate}}7 };8 9 int i;10 A a1 = {i, i}; // expected-error {{class template argument deduction for 'A' selected an explicit constructor for copy-list-initialization}}11 A a2{i, i};12 A a3{0, i};13 A a4 = {0, i};14 15 template <class T> A(const T &, const T &) -> A<T &>; // expected-note 2{{candidate}}16 template <class T> explicit A(T &&, T &&) -> A<T>; // expected-note {{explicit deduction guide declared here}}17 18 // FIXME: The standard gives an incorrect explanation for why a5, a7, and a8 are ill-formed.19 A a5 = {0, 1}; // expected-error {{class template argument deduction for 'A' selected an explicit deduction guide}}20 A a6{0, 1};21 A a7 = {0, i}; // expected-error {{ambiguous deduction}}22 A a8{0, i}; // expected-error {{ambiguous deduction}}23 24 template <class T> struct B {25 template <class U> using TA = T;26 template <class U> B(U, TA<U>);27 };28 B b{(int *)0, (char *)0};29}30 31namespace check {32 using namespace std_example;33 template<typename T, typename U> constexpr bool same = false;34 template<typename T> constexpr bool same<T, T> = true;35 36 static_assert(same<decltype(a2), A<int>>);37 static_assert(same<decltype(a3), A<int>>);38 static_assert(same<decltype(a4), A<int>>);39 static_assert(same<decltype(a6), A<int>>);40 static_assert(same<decltype(b), B<char*>>);41}42