Index: clang/lib/Sema/SemaTemplate.cpp =================================================================== --- clang/lib/Sema/SemaTemplate.cpp +++ clang/lib/Sema/SemaTemplate.cpp @@ -1531,11 +1531,11 @@ CheckValidDeclSpecifiers(); - if (TInfo->getType()->isUndeducedType()) { - Diag(D.getIdentifierLoc(), - diag::warn_cxx14_compat_template_nontype_parm_auto_type) - << QualType(TInfo->getType()->getContainedAutoType(), 0); - } + if (const auto *T = TInfo->getType()->getContainedDeducedType()) + if (isa(T)) + Diag(D.getIdentifierLoc(), + diag::warn_cxx14_compat_template_nontype_parm_auto_type) + << QualType(TInfo->getType()->getContainedAutoType(), 0); assert(S->isTemplateParamScope() && "Non-type template parameter not in template parameter scope!"); Index: clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp =================================================================== --- clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp +++ clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp @@ -306,3 +306,11 @@ f(A()); // OK } } + +namespace GH57362 { +template +class TemplateClass {}; + +template // ok, no diagnostic expected +void func() {} +} Index: clang/test/SemaTemplate/temp_arg_nontype_diagnostic_cxx1z.cpp =================================================================== --- /dev/null +++ clang/test/SemaTemplate/temp_arg_nontype_diagnostic_cxx1z.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 -Wpre-c++17-compat %s + +namespace GH57362 { +template // expected-warning {{non-type template parameters declared with 'auto' are incompatible with C++ standards before C++17}} +struct A{}; + +template // expected-warning {{non-type template parameters declared with 'decltype(auto)' are incompatible with C++ standards before C++17}} +struct B{}; +}