[clang] [Clang] Rebind the closure temporary when rebuilding default member initializers (PR #196597)

Yuxuan Chen via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 24 08:12:54 PDT 2026


================
@@ -5724,9 +5710,17 @@ struct EnsureImmediateInvocationInDefaultArgs
 
   // Lambda can only have immediate invocations in the default
   // args of their parameters, which is transformed upon calling the closure.
-  // The body is not a subexpression, so we have nothing to do.
+  // The body is not a subexpression, so we do not transform the lambda
+  // itself. However, the closure object is returned without rebuilding it,
+  // so we must redo the effects building a lambda has on the enclosing
+  // context: any CXXBindTemporaryExpr around it has been dropped by
+  // TransformCXXBindTemporaryExpr, and the enclosing context must be
+  // marked as requiring cleanups for the closure's destructor to be run
+  // at the end of the full-expression.
   // FIXME: Immediate calls in capture initializers should be transformed.
-  ExprResult TransformLambdaExpr(LambdaExpr *E) { return E; }
+  ExprResult TransformLambdaExpr(LambdaExpr *E) {
+    return SemaRef.MaybeBindToTemporary(E);
----------------
yuxuanchen1997 wrote:

I think init-captures probably do need to be transformed for the FIXME case, since their initializers are evaluated in the enclosing context. Let me see what I can do. 

As for other TransformLambdaExpr, I’m a little hesitant to "fix" them without a reproducer.

https://github.com/llvm/llvm-project/pull/196597


More information about the cfe-commits mailing list