Author: Timm Baeder
Date: 2026-08-09T17:54:52+02:00
New Revision: c4a3c977f1f9138fb69bf936e532c94f0bb8a3cd

URL: 
https://github.com/llvm/llvm-project/commit/c4a3c977f1f9138fb69bf936e532c94f0bb8a3cd
DIFF: 
https://github.com/llvm/llvm-project/commit/c4a3c977f1f9138fb69bf936e532c94f0bb8a3cd.diff

LOG: [clang][bytecode] Handle invalid lambda static invokers better (#215091)

Instead of marking it as valid, mark it as constexpr, which means it
won't be valid unless it actually has valid code attached.

Added: 
    

Modified: 
    clang/lib/AST/ByteCode/Function.cpp
    clang/lib/AST/ByteCode/Function.h
    clang/lib/AST/ByteCode/Interp.cpp
    clang/test/AST/ByteCode/invalid.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ByteCode/Function.cpp 
b/clang/lib/AST/ByteCode/Function.cpp
index cd0f7eb125230..22d26e498c5b6 100644
--- a/clang/lib/AST/ByteCode/Function.cpp
+++ b/clang/lib/AST/ByteCode/Function.cpp
@@ -39,9 +39,10 @@ Function::Function(Program &P, FunctionDeclTy Source, 
unsigned ArgSize,
     } else if (const auto *MD = dyn_cast<CXXMethodDecl>(F)) {
       ExplicitThisPointer = MD->isExplicitObjectMemberFunction();
       Virtual = MD->isVirtual();
-      if (IsLambdaStaticInvoker)
+      if (IsLambdaStaticInvoker) {
         Kind = FunctionKind::LambdaStaticInvoker;
-      else if (clang::isLambdaCallOperator(F))
+        Constexpr = true;
+      } else if (clang::isLambdaCallOperator(F))
         Kind = FunctionKind::LambdaCallOperator;
       else if (MD->isCopyAssignmentOperator() || 
MD->isMoveAssignmentOperator())
         Kind = FunctionKind::CopyOrMoveOperator;

diff  --git a/clang/lib/AST/ByteCode/Function.h 
b/clang/lib/AST/ByteCode/Function.h
index 27edfc6d08916..9742a16b50f2c 100644
--- a/clang/lib/AST/ByteCode/Function.h
+++ b/clang/lib/AST/ByteCode/Function.h
@@ -178,7 +178,7 @@ class Function final {
   SourceInfo getSource(CodePtr PC) const;
 
   /// Checks if the function is valid to call.
-  bool isValid() const { return IsValid || isLambdaStaticInvoker(); }
+  bool isValid() const { return IsValid; }
 
   /// Checks if the function is virtual.
   bool isVirtual() const { return Virtual; };

diff  --git a/clang/lib/AST/ByteCode/Interp.cpp 
b/clang/lib/AST/ByteCode/Interp.cpp
index 4bc02967939e3..ece2e71408731 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -1153,10 +1153,6 @@ static bool CheckCallable(InterpState &S, CodePtr OpPC, 
const Function *F) {
     return false;
   }
 
-  // Implicitly constexpr.
-  if (F->isLambdaStaticInvoker())
-    return true;
-
   return diagnoseCallableDecl(S, OpPC, DiagDecl);
 }
 

diff  --git a/clang/test/AST/ByteCode/invalid.cpp 
b/clang/test/AST/ByteCode/invalid.cpp
index 0e6d2d4b508b8..247c8ad732708 100644
--- a/clang/test/AST/ByteCode/invalid.cpp
+++ b/clang/test/AST/ByteCode/invalid.cpp
@@ -241,3 +241,9 @@ namespace InheritedCtor {
 
   SS ss{42};
 }
+
+namespace InvalidStaticInvoker {
+  auto foo = [](bar) { int j; return j; }; // both-error {{unknown type name 
'bar'}}
+  constexpr int (*baz)(int) = foo;
+  int i = baz(42);
+}


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

Reply via email to