================
@@ -2897,6 +2897,15 @@ DEF_TRAVERSE_STMT(LambdaExpr, {
   if (getDerived().shouldVisitImplicitCode()) {
     // The implicit model is simple: everything else is in the lambda class.
     TRY_TO(TraverseDecl(S->getLambdaClass()));
+
+    // The body is normally reached through the call operator of the closure
+    // class. If that declaration is not a definition (which happens when the
+    // closure type was merged with one from another module), visit the body
+    // through the lambda expression.
+    if (CXXMethodDecl *CallOp = S->getCallOperator();
+        CallOp && !CallOp->isThisDeclarationADefinition() &&
+        getDerived().shouldVisitLambdaBody())
+      TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getBody());
----------------
Maoyao233 wrote:

"everyone" does not get this behavior: the added branch in inside `if 
(getDerived().shouldVisitImplicitCode())`, which is false by default. Clients 
that use the default (explicit) traversal never execute it. Onlyu the 
components that opt into the implicit mode are affected, and those are exactly 
the consumers that asked for a complete traversal. A consumer that 
intentionally does not want lambda bodies can still
opt out via `shouldVisitLambdaBody()`.

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

Reply via email to