summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-03-07 01:09:33 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-03-07 01:09:33 +0000
commit205a429891aeaceb6ad36b35f0ccc881031d0988 (patch)
tree2b5ec8ec3fc63c65e7aad981f472a934773e4f89 /clang
parenteadd8ee49c9dc520986ce7094b65ff67765d65ed (diff)
downloadbcm5719-llvm-205a429891aeaceb6ad36b35f0ccc881031d0988.tar.gz
bcm5719-llvm-205a429891aeaceb6ad36b35f0ccc881031d0988.zip
Make sure we consistently canonicalize types when canonicalizing TemplateTemplateParmDecls. PR12179.
llvm-svn: 152189
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/AST/ASTContext.cpp8
-rw-r--r--clang/test/SemaTemplate/temp_arg_template.cpp6
2 files changed, 11 insertions, 3 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e122df9d235..0d6f6e612c9 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -74,12 +74,14 @@ ASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID,
if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
ID.AddInteger(1);
ID.AddBoolean(NTTP->isParameterPack());
- ID.AddPointer(NTTP->getType().getAsOpaquePtr());
+ ID.AddPointer(NTTP->getType().getCanonicalType().getAsOpaquePtr());
if (NTTP->isExpandedParameterPack()) {
ID.AddBoolean(true);
ID.AddInteger(NTTP->getNumExpansionTypes());
- for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I)
- ID.AddPointer(NTTP->getExpansionType(I).getAsOpaquePtr());
+ for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
+ QualType T = NTTP->getExpansionType(I);
+ ID.AddPointer(T.getCanonicalType().getAsOpaquePtr());
+ }
} else
ID.AddBoolean(false);
continue;
diff --git a/clang/test/SemaTemplate/temp_arg_template.cpp b/clang/test/SemaTemplate/temp_arg_template.cpp
index 9c34089e61f..106111e4299 100644
--- a/clang/test/SemaTemplate/temp_arg_template.cpp
+++ b/clang/test/SemaTemplate/temp_arg_template.cpp
@@ -54,3 +54,9 @@ namespace N {
void f0( Y<int,1> y){ 1 << y; } // expected-note{{in instantiation of function template specialization 'N::operator<<<Y, int, 1>' requested here}}
}
+
+// PR12179
+template <typename Primitive, template <Primitive...> class F>
+struct unbox_args {
+ typedef typename Primitive::template call<F> x;
+};
OpenPOWER on IntegriCloud