r330881 - Fix crash on qualified template name instantiation if the template name has no

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 25 15:58:55 PDT 2018


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>(); }
+}




More information about the cfe-commits mailing list