diff options
| author | Richard Trieu <rtrieu@google.com> | 2019-03-15 04:26:02 +0000 |
|---|---|---|
| committer | Richard Trieu <rtrieu@google.com> | 2019-03-15 04:26:02 +0000 |
| commit | ef1e06df6ff153ba961608220a8467577c8ccd43 (patch) | |
| tree | b1254d56f2d172761769669a8dc5ee680b0d46d4 /clang | |
| parent | 639058d7c9479a61ec8925f9d8facfcbc3e31f35 (diff) | |
| download | bcm5719-llvm-ef1e06df6ff153ba961608220a8467577c8ccd43.tar.gz bcm5719-llvm-ef1e06df6ff153ba961608220a8467577c8ccd43.zip | |
Remove an assert in template pack deduction during nested instantiation.
llvm-svn: 356231
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 36 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/pack-deduction.cpp | 19 |
2 files changed, 37 insertions, 18 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index eb3444e9ee2..c71fa7ac57b 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -3804,25 +3804,25 @@ static bool addInstantiatedParametersToScope(Sema &S, FunctionDecl *Function, Scope.MakeInstantiatedLocalArgPack(PatternParam); Optional<unsigned> NumArgumentsInExpansion = S.getNumArgumentsInExpansion(PatternParam->getType(), TemplateArgs); - assert(NumArgumentsInExpansion && - "should only be called when all template arguments are known"); - QualType PatternType = - PatternParam->getType()->castAs<PackExpansionType>()->getPattern(); - for (unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) { - ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx); - FunctionParam->setDeclName(PatternParam->getDeclName()); - if (!PatternDecl->getType()->isDependentType()) { - Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(S, Arg); - QualType T = S.SubstType(PatternType, TemplateArgs, - FunctionParam->getLocation(), - FunctionParam->getDeclName()); - if (T.isNull()) - return true; - FunctionParam->setType(T); - } + if (NumArgumentsInExpansion) { + QualType PatternType = + PatternParam->getType()->castAs<PackExpansionType>()->getPattern(); + for (unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) { + ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx); + FunctionParam->setDeclName(PatternParam->getDeclName()); + if (!PatternDecl->getType()->isDependentType()) { + Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(S, Arg); + QualType T = S.SubstType(PatternType, TemplateArgs, + FunctionParam->getLocation(), + FunctionParam->getDeclName()); + if (T.isNull()) + return true; + FunctionParam->setType(T); + } - Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam); - ++FParamIdx; + Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam); + ++FParamIdx; + } } } diff --git a/clang/test/SemaTemplate/pack-deduction.cpp b/clang/test/SemaTemplate/pack-deduction.cpp index f9309d52111..478b19731b6 100644 --- a/clang/test/SemaTemplate/pack-deduction.cpp +++ b/clang/test/SemaTemplate/pack-deduction.cpp @@ -166,3 +166,22 @@ namespace substitution_vs_function_deduction { A<int>().g(f); // expected-error {{no match}} } } + +namespace Nested_Explicit_Specialization { +template <typename> +struct Outer { + + template <int> + struct Inner; + + template <> + struct Inner<0> { + template <typename... Args> + void Test(Args...) {} + }; +}; + +void Run() { + Outer<void>::Inner<0>().Test(1,1); +} +} |

