diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-02-21 08:42:39 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-02-21 08:42:39 +0000 |
| commit | 0cd9c0491e90ed23f9f5069ae86837d77bfa26c9 (patch) | |
| tree | 76aae2993b214795cef212fbbe502e3a2db0a601 /clang/lib/Sema | |
| parent | fe78d95a4956840baa350432fa2dac0e242693ab (diff) | |
| download | bcm5719-llvm-0cd9c0491e90ed23f9f5069ae86837d77bfa26c9.tar.gz bcm5719-llvm-0cd9c0491e90ed23f9f5069ae86837d77bfa26c9.zip | |
Fix lookup through injected-class-names in implicit deduction guides in the
case where the class template has a parameter pack.
Checking of the template arguments expects an "as-written" template argument
list, which in particular does not have any parameter packs. So flatten the
packs into separate arguments before passing them in.
llvm-svn: 295710
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index b285d4f3814..7ccbb8571c5 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4957,11 +4957,17 @@ NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, auto *Guide = dyn_cast<CXXDeductionGuideDecl>(FD); if (Guide && Guide->isImplicit()) { TemplateDecl *TD = Guide->getDeducedTemplate(); + // Convert the arguments to an "as-written" list. TemplateArgumentListInfo Args(Loc, Loc); - for (auto Arg : TemplateArgs.getInnermost().take_front( - TD->getTemplateParameters()->size())) - Args.addArgument( - getTrivialTemplateArgumentLoc(Arg, QualType(), Loc)); + for (TemplateArgument Arg : TemplateArgs.getInnermost().take_front( + TD->getTemplateParameters()->size())) { + ArrayRef<TemplateArgument> Unpacked(Arg); + if (Arg.getKind() == TemplateArgument::Pack) + Unpacked = Arg.pack_elements(); + for (TemplateArgument UnpackedArg : Unpacked) + Args.addArgument( + getTrivialTemplateArgumentLoc(UnpackedArg, QualType(), Loc)); + } QualType T = CheckTemplateIdType(TemplateName(TD), Loc, Args); if (T.isNull()) return nullptr; |

