Author: rsmith Date: Wed Apr 25 15:58:55 2018 New Revision: 330881 URL: http://llvm.org/viewvc/llvm-project?rev=330881&view=rev Log: Fix crash on qualified template name instantiation if the template name has no template argument list.
Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp cfe/trunk/test/SemaTemplate/dependent-names.cpp Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=330881&r1=330880&r2=330881&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Apr 25 15:58:55 2018 @@ -4022,18 +4022,21 @@ ExprResult Sema::BuildTemplateIdExpr(con 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<VarTemplateDecl>() && !DependentArguments) { + if (R.getAsSingle<VarTemplateDecl>() && !AnyDependentArguments()) { return CheckVarTemplateId(SS, R.getLookupNameInfo(), R.getAsSingle<VarTemplateDecl>(), TemplateKWLoc, TemplateArgs); } - if (R.getAsSingle<ConceptDecl>() && !DependentArguments) { + if (R.getAsSingle<ConceptDecl>() && !AnyDependentArguments()) { return CheckConceptTemplateId(SS, R.getLookupNameInfo(), R.getAsSingle<ConceptDecl>(), TemplateKWLoc, TemplateArgs); Modified: cfe/trunk/test/SemaTemplate/dependent-names.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/dependent-names.cpp?rev=330881&r1=330880&r2=330881&view=diff ============================================================================== --- cfe/trunk/test/SemaTemplate/dependent-names.cpp (original) +++ cfe/trunk/test/SemaTemplate/dependent-names.cpp Wed Apr 25 15:58:55 2018 @@ -419,3 +419,11 @@ template <typename> struct CT2 { template <class U> struct X; }; template <typename T> int CT2<int>::X<>; // expected-error {{template parameter list matching the non-templated nested type 'CT2<int>' should be empty}} + +namespace DependentTemplateIdWithNoArgs { + template<typename T> void f() { T::template f(); } + struct X { + template<int = 0> static void f(); + }; + void g() { f<X>(); } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits