================
@@ -1876,11 +1901,25 @@ namespace {
TemplateParameterList *OrigTPL) {
if (!OrigTPL || !OrigTPL->size()) return OrigTPL;
+ std::optional<MultiLevelTemplateArgumentList> OldMLTAL;
+ // We need to preserve the lambda depth in parameter mapping.
+ // Otherwise the template argument deduction would fail, if we reduced
the
+ // depth too early.
+ if (SemaRef.inParameterMappingSubstitution() &&
+ getDepthAndIndex(OrigTPL->getParam(0)).first >=
+ TemplateArgs.getNumSubstitutedLevels())
+ OldMLTAL = ForgetSubstitution();
----------------
mizvekov wrote:
Okay, I think I understand now what you are trying to do. I initially
misunderstood the problem as you trying to avoid getting the lambda's depth to
go below zero.
I am not sure I understand why changing the depth is a problem for deduction,
because deduction accepts the template depth as a parameter and this should be
easy to figure out for the lambda since it has template parameters.
Anyway, you can use the `getDepth` method on the template parameter list
directly:
```suggestion
std::optional<MultiLevelTemplateArgumentList> OldMLTAL;
// We need to preserve the lambda depth in parameter mapping.
// Otherwise the template argument deduction would fail, if we reduced the
// depth too early.
if (SemaRef.inParameterMappingSubstitution() &&
OrigTPL->getDepth() >= TemplateArgs.getNumSubstitutedLevels())
OldMLTAL = ForgetSubstitution();
```
https://github.com/llvm/llvm-project/pull/195995
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits