]> granicus.if.org Git - clang/commitdiff
AST: Don't treat a TemplateExpansion as a Template
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 28 Aug 2013 00:00:27 +0000 (00:00 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 28 Aug 2013 00:00:27 +0000 (00:00 +0000)
Summary:
Instead of calling getAsTemplate(), call
getAsTemplateOrTemplatePattern() because it handles the
TemplateExpansion case too.

This fixes PR16997.

Reviewers: doug.gregor, rsmith

Reviewed By: rsmith

CC: cfe-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D1512

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189422 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/TypeLoc.cpp
test/SemaTemplate/temp_arg_template.cpp

index 080316dc3ef535630445151af7422cad7f70ef74..22a51bc345ac9b552d4ed8a73b62d455df683f74 100644 (file)
@@ -378,18 +378,16 @@ void TemplateSpecializationTypeLoc::initializeArgLocs(ASTContext &Context,
     case TemplateArgument::Template:
     case TemplateArgument::TemplateExpansion: {
       NestedNameSpecifierLocBuilder Builder;
-      TemplateName Template = Args[i].getAsTemplate();
+      TemplateName Template = Args[i].getAsTemplateOrTemplatePattern();
       if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
         Builder.MakeTrivial(Context, DTN->getQualifier(), Loc);
       else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
         Builder.MakeTrivial(Context, QTN->getQualifier(), Loc);
-      
+
       ArgInfos[i] = TemplateArgumentLocInfo(
-                                           Builder.getWithLocInContext(Context),
-                                            Loc, 
-                                Args[i].getKind() == TemplateArgument::Template
-                                            ? SourceLocation()
-                                            : Loc);
+          Builder.getWithLocInContext(Context), Loc,
+          Args[i].getKind() == TemplateArgument::Template ? SourceLocation()
+                                                          : Loc);
       break;
     }
 
index c9ce1b694363818e38d23956b9ad67b6d714dff3..f14ff26eb4af6daca3fe3f1f506084a657c46f29 100644 (file)
@@ -60,3 +60,14 @@ template <typename Primitive, template <Primitive...> class F> // expected-warni
 struct unbox_args {
   typedef typename Primitive::template call<F> x;
 };
+
+template <template <typename> class... Templates>
+struct template_tuple {};
+template <typename T>
+struct identity {};
+template <template <typename> class... Templates>
+template_tuple<Templates...> f7() {}
+
+void foo() {
+  f7<identity>();
+}