1964f935eSRichard Smith // RUN: %clang_cc1 -std=c++17 -verify %s
2964f935eSRichard Smith 
3964f935eSRichard Smith namespace pr41427 {
4964f935eSRichard Smith   template <typename T> class A {
5964f935eSRichard Smith   public:
A(void (*)(T))6964f935eSRichard Smith     A(void (*)(T)) {}
7964f935eSRichard Smith   };
8964f935eSRichard Smith 
D(int)9964f935eSRichard Smith   void D(int) {}
10964f935eSRichard Smith 
f()11964f935eSRichard Smith   void f() {
12964f935eSRichard Smith     A a(&D);
13964f935eSRichard Smith     using T = decltype(a);
14964f935eSRichard Smith     using T = A<int>;
15964f935eSRichard Smith   }
16964f935eSRichard Smith }
17*d38057f3SRichard Smith 
18*d38057f3SRichard Smith namespace Access {
19*d38057f3SRichard Smith   struct B {
20*d38057f3SRichard Smith   protected:
21*d38057f3SRichard Smith     struct type {};
22*d38057f3SRichard Smith   };
23*d38057f3SRichard Smith   template<typename T> struct D : B { // expected-note {{not viable}}
24*d38057f3SRichard Smith     D(T, typename T::type); // expected-note {{private member}}
25*d38057f3SRichard Smith   };
26*d38057f3SRichard Smith   D b = {B(), {}};
27*d38057f3SRichard Smith 
28*d38057f3SRichard Smith   class X {
29*d38057f3SRichard Smith     using type = int;
30*d38057f3SRichard Smith   };
31*d38057f3SRichard Smith   D x = {X(), {}}; // expected-error {{no viable constructor or deduction guide}}
32*d38057f3SRichard Smith 
33*d38057f3SRichard Smith   // Once we implement proper support for dependent nested name specifiers in
34*d38057f3SRichard Smith   // friends, this should still work.
35*d38057f3SRichard Smith   class Y {
36*d38057f3SRichard Smith     template <typename T> friend D<T>::D(T, typename T::type); // expected-warning {{dependent nested name specifier}}
37*d38057f3SRichard Smith     struct type {};
38*d38057f3SRichard Smith   };
39*d38057f3SRichard Smith   D y = {Y(), {}};
40*d38057f3SRichard Smith 
41*d38057f3SRichard Smith   class Z {
42*d38057f3SRichard Smith     template <typename T> friend class D;
43*d38057f3SRichard Smith     struct type {};
44*d38057f3SRichard Smith   };
45*d38057f3SRichard Smith   D z = {Z(), {}};
46*d38057f3SRichard Smith }
47