https://github.com/Ferdi265 created 
https://github.com/llvm/llvm-project/pull/232458

This PR fixes #183415.

As per [expr.const]/p14.1, only the innermost enclosing function parameter 
scope matters for determining whether a function or lambda is in an immediate 
function context. It does not matter whether the parent is an immediate 
function or not.

This fixes assertions on valid programs and miscompilations related to 
immediate functions being callable from non-immediate contexts due to missed 
escalation of lambdas to immediate functions.

With this fix all examples from the linked issue produce identical behaviour as 
GCC. I am currently rebuilding Clang/LLVM to then run the full clang test suite 
to verify I did not break anything.

This is my first LLVM contribution, so please tell me if I have missed anything.

>From 4e240a7dcace90651924a73ca194234a7bd45015 Mon Sep 17 00:00:00 2001
From: Ferdinand Bachmann <[email protected]>
Date: Thu, 15 Oct 2026 20:39:08 +0200
Subject: [PATCH] [Clang][Sema] Fix lambdas mistakenly inheriting
 InImmediateFunctionContext

As per [expr.const]/p14.1, only the innermost enclosing function
parameter scope matters for determining whether a function or lambda is
in an immediate function context. It does not matter whether the parent
is an immediate function or not.

This fixes assertions on valid programs and miscompilations related to
immediate functions being callable from non-immediate contexts due to
missed escalation of lambdas to immediate functions.

Fixes #183415.

Signed-off-by: Ferdinand Bachmann <[email protected]>
---
 clang/lib/Sema/SemaExpr.cpp | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index e29caaab8e3f3..ba12685b96f0f 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -18527,8 +18527,6 @@ void Sema::PushExpressionEvaluationContextForFunction(
       FD && FD->isConsteval()
           ? ExpressionEvaluationContext::ImmediateFunctionContext
           : NewContext);
-  const Sema::ExpressionEvaluationContextRecord &Parent =
-      parentEvaluationContext();
   Sema::ExpressionEvaluationContextRecord &Current = 
currentEvaluationContext();
 
   Current.InDiscardedStatement = false;
@@ -18546,13 +18544,7 @@ void Sema::PushExpressionEvaluationContextForFunction(
     Current.InImmediateEscalatingFunctionContext =
         getLangOpts().CPlusPlus20 && FD->isImmediateEscalating();
 
-    if (isLambdaMethod(FD))
-      Current.InImmediateFunctionContext =
-          FD->isConsteval() ||
-          (isLambdaMethod(FD) && (Parent.isConstantEvaluated() ||
-                                  Parent.isImmediateFunctionContext()));
-    else
-      Current.InImmediateFunctionContext = FD->isConsteval();
+    Current.InImmediateFunctionContext = FD->isConsteval();
   }
 }
 

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

Reply via email to