1 | // RUN: %clang_cc1 -std=c++1z -verify %s |
2 | |
3 | namespace std_example { |
4 | template <class T> struct A { |
5 | explicit A(const T &, ...) noexcept; // expected-note {{explicit}} expected-note 2{{candidate}} |
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 | |
31 | namespace 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 | |