diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-12-21 22:27:23 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-12-21 22:27:23 +0000 |
| commit | cff2764a6eb8123557c98891384b975a6bdd4d6c (patch) | |
| tree | e942561ce992c0bbedad8d067b2767797a20e052 | |
| parent | 2085a965138b353572146109fb8218930397944e (diff) | |
| download | bcm5719-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.cpp | 20 |
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; } |

