diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index fbc65835d99b..f3cb04ac6a98 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -4022,18 +4022,21 @@ ExprResult Sema::BuildTemplateIdExpr(const CXXScopeSpec &SS, assert(!R.empty() && "empty lookup results when building templateid"); assert(!R.isAmbiguous() && "ambiguous lookup when building templateid"); + auto AnyDependentArguments = [&]() -> bool { + bool InstantiationDependent; + return TemplateArgs && + TemplateSpecializationType::anyDependentTemplateArguments( + *TemplateArgs, InstantiationDependent); + }; + // In C++1y, check variable template ids. - bool InstantiationDependent; - const bool DependentArguments = - TemplateSpecializationType::anyDependentTemplateArguments( - *TemplateArgs, InstantiationDependent); - if (R.getAsSingle() && !DependentArguments) { + if (R.getAsSingle() && !AnyDependentArguments()) { return CheckVarTemplateId(SS, R.getLookupNameInfo(), R.getAsSingle(), TemplateKWLoc, TemplateArgs); } - if (R.getAsSingle() && !DependentArguments) { + if (R.getAsSingle() && !AnyDependentArguments()) { return CheckConceptTemplateId(SS, R.getLookupNameInfo(), R.getAsSingle(), TemplateKWLoc, TemplateArgs); diff --git a/clang/test/SemaTemplate/dependent-names.cpp b/clang/test/SemaTemplate/dependent-names.cpp index d5c9d66c4526..070c7e410f16 100644 --- a/clang/test/SemaTemplate/dependent-names.cpp +++ b/clang/test/SemaTemplate/dependent-names.cpp @@ -419,3 +419,11 @@ template struct CT2 { template struct X; }; template int CT2::X<>; // expected-error {{template parameter list matching the non-templated nested type 'CT2' should be empty}} + +namespace DependentTemplateIdWithNoArgs { + template void f() { T::template f(); } + struct X { + template static void f(); + }; + void g() { f(); } +}