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 | f97ecf3566cd006875c8f76e426126b4b5a551f7 (patch) | |
tree | 1815b2a64e9e29f275569d78fcb45dc5d9098c8e /lib/Sema/SemaTemplate.cpp | |
parent | 03491de7b48e05f07731770c3fb51f02bc058079 (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122369 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index ca2a43b729..661d26761d 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/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; } |