// Testcase from P0512R0 for C++17 NB comment US 20
// { dg-options -std=c++1z }

template <class,class> struct same;
template <class T> struct same<T,T> {};

template<class T> struct A {
  template<class U>
  A(T&&, U&&, int*); // #1: T&& is not a forwarding reference
                     //     U&& is a forwarding reference
  A(T&&, int*);	     // #2
};
template<class T>
A(T&&, int*) -> A<T>; // #3: T&& is a forwarding reference

int i;
int *ip;
A a0{0, 0, ip}; // uses #1 to deduce A<int> and #1 to initialize
same<decltype(a0),A<int>> s1;
A a2{i, ip};    // uses #3 to deduce A<int&> and #2 to initialize
same<decltype(a2),A<int&>> s2;

A a{i, 0, ip};  // { dg-error "" } cannot deduce from #1
