1 // Testcase from P0512R0 for C++17 NB comment US 20
2 // { dg-do compile { target c++17 } }
3 
4 template <class,class> struct same;
5 template <class T> struct same<T,T> {};
6 
7 template<class T> struct A {
8   template<class U>
9   A(T&&, U&&, int*); // #1: T&& is not a forwarding reference
10                      //     U&& is a forwarding reference
11   A(T&&, int*);	     // #2
12 };
13 template<class T>
14 A(T&&, int*) -> A<T>; // #3: T&& is a forwarding reference
15 
16 int i;
17 int *ip;
18 A a0{0, 0, ip}; // uses #1 to deduce A<int> and #1 to initialize
19 same<decltype(a0),A<int>> s1;
20 A a2{i, ip};    // uses #3 to deduce A<int&> and #2 to initialize
21 same<decltype(a2),A<int&>> s2;
22 
23 A a{i, 0, ip};  // { dg-error "" } cannot deduce from #1
24