]> granicus.if.org Git - clang/commitdiff
Fix assert hit when tree-transforming template template parameter packs.
authorManuel Klimek <klimek@google.com>
Mon, 11 Jan 2016 11:39:00 +0000 (11:39 +0000)
committerManuel Klimek <klimek@google.com>
Mon, 11 Jan 2016 11:39:00 +0000 (11:39 +0000)
Covers significantly more code in the template template pack argument
test and fixes the resulting assert problem.

Differential Revision: http://reviews.llvm.org/D15743

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

lib/Sema/TreeTransform.h
test/SemaTemplate/temp_arg_template.cpp

index b8f977c16bb9396695eba4627e5b0fc1d0330cb0..935304fe4076c3d1f2634b514616c848b84bc2e8 100644 (file)
@@ -3583,7 +3583,7 @@ void TreeTransform<Derived>::InventTemplateArgumentLoc(
   case TemplateArgument::Template:
   case TemplateArgument::TemplateExpansion: {
     NestedNameSpecifierLocBuilder Builder;
-    TemplateName Template = Arg.getAsTemplate();
+    TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
index 4a0ed05d8799167dce4338d25b148efcad38739f..6d93f1504a46990497126bd6c6aa6f0822ad84b7 100644 (file)
@@ -75,7 +75,11 @@ template <template <typename> class... Templates>
 // expected-warning@-2 {{variadic templates are a C++11 extension}}
 #endif
 
-struct template_tuple {};
+struct template_tuple {
+#if __cplusplus >= 201103L
+  static constexpr int N = sizeof...(Templates);
+#endif
+};
 template <typename T>
 struct identity {};
 template <template <typename> class... Templates>
@@ -85,6 +89,12 @@ template <template <typename> class... Templates>
 
 template_tuple<Templates...> f7() {}
 
+#if __cplusplus >= 201103L
+struct S : public template_tuple<identity, identity> {
+  static_assert(N == 2, "Number of template arguments incorrect");
+};
+#endif
+
 void foo() {
   f7<identity>();
 }