// RUN: %clang_cc1 -std=c++17 -verify=expected,cxx17 %s // RUN: %clang_cc1 -std=c++20 -verify=expected,cxx20 %s namespace pr41427 { template class A { public: A(void (*)(T)) {} }; void D(int) {} void f() { A a(&D); using T = decltype(a); using T = A; } } namespace Access { struct B { protected: struct type {}; }; template struct D : B { // expected-note {{not viable}} \ expected-note {{implicit deduction guide declared as 'template D(Access::D) -> Access::D'}} D(T, typename T::type); // expected-note {{private member}} \ // expected-note {{implicit deduction guide declared as 'template D(T, typename T::type) -> Access::D'}} }; D b = {B(), {}}; class X { using type = int; }; D x = {X(), {}}; // expected-error {{no viable constructor or deduction guide}} // Once we implement proper support for dependent nested name specifiers in // friends, this should still work. class Y { template friend D::D(T, typename T::type); // expected-warning {{dependent nested name specifier}} struct type {}; }; D y = {Y(), {}}; class Z { template friend class D; struct type {}; }; D z = {Z(), {}}; } namespace GH69987 { template struct X {}; template struct X; X x; template struct Y { Y(T); }; template struct Y ; Y y(1); } namespace NoCrashOnGettingDefaultArgLoc { template class A { A(int = 1); // expected-note {{candidate template ignored: couldn't infer template argumen}} \ // expected-note {{implicit deduction guide declared as 'template D(int = ) -> NoCrashOnGettingDefaultArgLoc::D'}} }; class C : A { using A::A; }; template class D : C { // expected-note {{candidate function template not viable: requires 1 argument}} \ expected-note {{implicit deduction guide declared as 'template D(NoCrashOnGettingDefaultArgLoc::D) -> NoCrashOnGettingDefaultArgLoc::D'}} using C::C; }; D abc; // expected-error {{no viable constructor or deduction guide}} } namespace AsValueParameter { namespace foo { // cxx17-note@+2 {{template is declared here}} // cxx20-note@+1 {{'A' is not literal because it is not an aggregate and has no constexpr constructors other than copy or move constructors}} template struct A { A(); }; } template struct B {}; // expected-note {{template parameter is declared here}} // cxx17-error@-1 {{use of class template 'foo::A' requires template arguments; argument deduction not allowed in template parameter}} template struct B{}>; // cxx17-error@-1 {{value of type 'foo::A' is not implicitly convertible to 'int'}} // cxx20-error@-2 {{non-type template parameter has non-literal type 'foo::A' (aka 'AsValueParameter::foo::A')}} } // namespace AsValueParameter namespace ConvertDeducedTemplateArgument { namespace A { template struct B {}; } template