summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Klimek <klimek@google.com>2016-01-11 11:39:00 +0000
committerManuel Klimek <klimek@google.com>2016-01-11 11:39:00 +0000
commit4c67fa747b157a846a884e97a93cdab5a0b37da3 (patch)
tree0ac3728a968c3c3a32f92e86695f890b94b1a5e1
parent06ca0fc69d9dc91e8ce0cfaf68871f2995c13b8c (diff)
downloadbcm5719-llvm-4c67fa747b157a846a884e97a93cdab5a0b37da3.tar.gz
bcm5719-llvm-4c67fa747b157a846a884e97a93cdab5a0b37da3.zip
Fix assert hit when tree-transforming template template parameter packs.
Covers significantly more code in the template template pack argument test and fixes the resulting assert problem. Differential Revision: http://reviews.llvm.org/D15743 llvm-svn: 257326
-rw-r--r--clang/lib/Sema/TreeTransform.h2
-rw-r--r--clang/test/SemaTemplate/temp_arg_template.cpp12
2 files changed, 12 insertions, 2 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index b8f977c16bb..935304fe407 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -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())
diff --git a/clang/test/SemaTemplate/temp_arg_template.cpp b/clang/test/SemaTemplate/temp_arg_template.cpp
index 4a0ed05d879..6d93f1504a4 100644
--- a/clang/test/SemaTemplate/temp_arg_template.cpp
+++ b/clang/test/SemaTemplate/temp_arg_template.cpp
@@ -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>();
}
OpenPOWER on IntegriCloud