summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-12-21 22:27:23 +0000
committerDouglas Gregor <dgregor@apple.com>2010-12-21 22:27:23 +0000
commitcff2764a6eb8123557c98891384b975a6bdd4d6c (patch)
treee942561ce992c0bbedad8d067b2767797a20e052
parent2085a965138b353572146109fb8218930397944e (diff)
downloadbcm5719-llvm-cff2764a6eb8123557c98891384b975a6bdd4d6c.tar.gz
bcm5719-llvm-cff2764a6eb8123557c98891384b975a6bdd4d6c.zip
Tweak the checking of class template partial specialization arguments
to cope with parameter packs. This is a band-aid I will be revisiting this section when I implement declaration matching semantics for variadic templates. llvm-svn: 122369
-rw-r--r--clang/lib/Sema/SemaTemplate.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index ca2a43b7295..661d26761df 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -3937,16 +3937,27 @@ bool Sema::CheckClassTemplatePartialSpecializationArgs(
// specialization is identical to the implicit argument list of
// the primary template. The caller may need to diagnostic this as
// an error per C++ [temp.class.spec]p9b3.
+ TemplateArgument MirrorArg = ArgList[I];
+ if (MirrorsPrimaryTemplate &&
+ MirrorArg.getKind() == TemplateArgument::Pack) {
+ if (MirrorArg.pack_size() == 1)
+ MirrorArg = *MirrorArg.pack_begin();
+ else
+ MirrorsPrimaryTemplate = false;
+ }
+
if (MirrorsPrimaryTemplate) {
if (TemplateTypeParmDecl *TTP
- = dyn_cast<TemplateTypeParmDecl>(TemplateParams->getParam(I))) {
- if (Context.getCanonicalType(Context.getTypeDeclType(TTP)) !=
- Context.getCanonicalType(ArgList[I].getAsType()))
+ = dyn_cast<TemplateTypeParmDecl>(TemplateParams->getParam(I))) {
+ if (MirrorsPrimaryTemplate &&
+ !Context.hasSameType(Context.getTypeDeclType(TTP),
+ MirrorArg.getAsType()))
MirrorsPrimaryTemplate = false;
} else if (TemplateTemplateParmDecl *TTP
= dyn_cast<TemplateTemplateParmDecl>(
TemplateParams->getParam(I))) {
- TemplateName Name = ArgList[I].getAsTemplate();
+ // FIXME: Variadic templates pack expansion/parameter pack
+ TemplateName Name = MirrorArg.getAsTemplate();
TemplateTemplateParmDecl *ArgDecl
= dyn_cast_or_null<TemplateTemplateParmDecl>(Name.getAsTemplateDecl());
if (!ArgDecl ||
@@ -3964,6 +3975,7 @@ bool Sema::CheckClassTemplatePartialSpecializationArgs(
Expr *ArgExpr = ArgList[I].getAsExpr();
if (!ArgExpr) {
+ // FIXME: Variadic templates pack expansion/parameter pack
MirrorsPrimaryTemplate = false;
continue;
}
OpenPOWER on IntegriCloud