llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: None (yozhu)

<details>
<summary>Changes</summary>

If default argument list has one more element than actual argument list and the 
last default argument is a pack expansion, we can ignore it.  This is to fix a 
failed assertion:

clang: llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:596: 
TemplateDeductionResult DeduceTemplateArguments(Sema &amp;, 
TemplateParameterList *, TemplateName, TemplateName, TemplateDeductionInfo 
&amp;, ArrayRef&lt;TemplateArgument&gt;, 
SmallVectorImpl&lt;DeducedTemplateArgument&gt; &amp;): Assertion 
`DefaultArguments.size() &lt;= As-&gt;size()' failed.

---
Full diff: https://github.com/llvm/llvm-project/pull/94659.diff


1 Files Affected:

- (modified) clang/lib/Sema/SemaTemplateDeduction.cpp (+8-2) 


``````````diff
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<PackExpansionType>(DefaultArguments.back().getAsType()))) {
+          return TemplateDeductionResult::TooFewArguments;
+        }
         SmallVector<NamedDecl *, 4> 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)

``````````

</details>


https://github.com/llvm/llvm-project/pull/94659
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to