1 // RUN: %clang_cc1 -std=c++17 -verify %s 2 3 namespace pr41427 { 4 template <typename T> class A { 5 public: 6 A(void (*)(T)) {} 7 }; 8 9 void D(int) {} 10 11 void f() { 12 A a(&D); 13 using T = decltype(a); 14 using T = A<int>; 15 } 16 } 17 18 namespace Access { 19 struct B { 20 protected: 21 struct type {}; 22 }; 23 template<typename T> struct D : B { // expected-note {{not viable}} 24 D(T, typename T::type); // expected-note {{private member}} 25 }; 26 D b = {B(), {}}; 27 28 class X { 29 using type = int; 30 }; 31 D x = {X(), {}}; // expected-error {{no viable constructor or deduction guide}} 32 33 // Once we implement proper support for dependent nested name specifiers in 34 // friends, this should still work. 35 class Y { 36 template <typename T> friend D<T>::D(T, typename T::type); // expected-warning {{dependent nested name specifier}} 37 struct type {}; 38 }; 39 D y = {Y(), {}}; 40 41 class Z { 42 template <typename T> friend class D; 43 struct type {}; 44 }; 45 D z = {Z(), {}}; 46 } 47