From 3dc8d5a0149a3fd0e3ca70d06f2ecc786bdc18fa Mon Sep 17 00:00:00 2001 From: YongKang Zhu Date: Thu, 6 Jun 2024 11:51:51 -0700 Subject: [PATCH] [Clang][Sema][TemplateDeduction] Skip pack expansion type at the end of default argument list if actual argument list's length is one less --- clang/lib/Sema/SemaTemplateDeduction.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 1011db2d2830d..e66f35c38dfda 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -593,9 +593,15 @@ DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams, TemplateParameterList *As = TempArg->getTemplateParameters(); if (DefaultArguments.size() != 0) { - assert(DefaultArguments.size() <= As->size()); + if ((DefaultArguments.size() > As->size()) && + (DefaultArguments.size() != As->size() + 1 || + DefaultArguments.back().getKind() != TemplateArgument::Type || + !isa(DefaultArguments.back().getAsType()))) { + return TemplateDeductionResult::TooFewArguments; + } SmallVector Params(As->size()); - for (unsigned I = 0; I < DefaultArguments.size(); ++I) + for (unsigned I = 0; + I < std::min((size_t)As->size(), DefaultArguments.size()); ++I) Params[I] = getTemplateParameterWithDefault(S, As->getParam(I), DefaultArguments[I]); for (unsigned I = DefaultArguments.size(); I < As->size(); ++I)