erichkeane wrote:

> ## Summary
> 
> Fixes #180319
> 
> Recursive lambdas in templates could cause Clang to crash with a stack 
> overflow before hitting the template instantiation depth limit. This happened 
> because `LambdaExpressionSubstitution` doesn't count toward the depth limit 
> (by design for SFINAE per [temp.deduct]p9).
> 
> This PR wraps the `TransformLambdaBody` call in `runWithSufficientStackSpace` 
> to handle deeply nested recursive lambdas gracefully:
> 
>     * If threads are enabled, it runs on a new 8MB stack when stack is nearly 
> exhausted
> 
>     * If threads are disabled, it emits a warning and continues
> 
> 
> ## Test plan
> 
>     * Added TEST=4 to `clang/test/SemaTemplate/stack-exhaustion.cpp` with the 
> reproduction case from the issue
> 
>     * The test uses `complexify<200>` which would previously crash but now 
> handles gracefully

What does the first bit have to do at all with the rest?  This commit message 
is pretty nonsensical, please write it yourself.  

As far as the patch: It makes no sense if you look at the bug's stack trace.  I 
don't see 'TransformLambaBody' ANYWHERE there.  Everything in the stack trace 
is about constant evaluation.  It SEEMS to me that the lambda transformation 
solving this is just lucky/happens by resetting it and letting the expression 
evaluation 'work'.

The real solution to this bug is likely to figure out a way to get the constant 
expression evaluator to do a better job at managing stack/tailcalling/something 
else.

https://github.com/llvm/llvm-project/pull/180325
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to