Author: Timm Baeder
Date: 2025-07-08T17:17:15+02:00
New Revision: 5cefb9a367c80a69a6d80956bf8822ee0e5dd766

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

LOG: [clang][bytecode] Fix __builtin_is_within_lifetime in initializers 
(#147480)

Added: 
    

Modified: 
    clang/lib/AST/ByteCode/InterpBuiltin.cpp
    clang/test/AST/ByteCode/builtin-functions.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp 
b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index db18ad2aa9bcb..1fe6d146b511d 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -2208,7 +2208,7 @@ static bool 
interp__builtin_is_within_lifetime(InterpState &S, CodePtr OpPC,
   if (Ptr.isOnePastEnd())
     return Error(1);
 
-  bool Result = true;
+  bool Result = Ptr.getLifetime() != Lifetime::Ended;
   if (!Ptr.isActive()) {
     Result = false;
   } else {
@@ -2216,7 +2216,19 @@ static bool 
interp__builtin_is_within_lifetime(InterpState &S, CodePtr OpPC,
       return false;
     if (!CheckMutable(S, OpPC, Ptr))
       return false;
+    if (!CheckDummy(S, OpPC, Ptr, AK_Read))
+      return false;
+  }
+
+  // Check if we're currently running an initializer.
+  for (InterpFrame *Frame = S.Current; Frame; Frame = Frame->Caller) {
+    if (const Function *F = Frame->getFunction();
+        F && F->isConstructor() && Frame->getThis().block() == Ptr.block()) {
+      return Error(2);
+    }
   }
+  if (S.EvaluatingDecl && Ptr.getDeclDesc()->asVarDecl() == S.EvaluatingDecl)
+    return Error(2);
 
   pushInteger(S, Result, Call->getType());
   return true;

diff  --git a/clang/test/AST/ByteCode/builtin-functions.cpp 
b/clang/test/AST/ByteCode/builtin-functions.cpp
index 1bb6d22db9823..e554ef41a8d0f 100644
--- a/clang/test/AST/ByteCode/builtin-functions.cpp
+++ b/clang/test/AST/ByteCode/builtin-functions.cpp
@@ -1738,6 +1738,26 @@ namespace WithinLifetime {
                                            // both-note 
{{'__builtin_is_within_lifetime' cannot be called with a one-past-the-end 
pointer}} \
                                            // both-warning {{expression result 
unused}}
   }
+
+
+  constexpr bool self = __builtin_is_within_lifetime(&self); // both-error 
{{must be initialized by a constant expression}} \
+                                                             // both-note 
{{'__builtin_is_within_lifetime' cannot be called with a pointer to an object 
whose lifetime has not yet begun}} \
+                                                             // ref-error 
{{call to consteval function '__builtin_is_within_lifetime' is not a constant 
expression}} \
+                                                             // ref-note 
{{initializer of 'self' is not a constant expression}} \
+                                                             // ref-note 
{{declared here}}
+
+  int nontCE(int p) { // both-note {{declared here}}
+    return __builtin_is_within_lifetime(&p); // both-error {{call to consteval 
function}} \
+                                             // both-note {{function parameter 
'p' with unknown value cannot be used in a constant expression}}
+  }
+
+
+  struct XStd {
+    consteval XStd() {
+      __builtin_is_within_lifetime(this); // both-note {{cannot be called with 
a pointer to an object whose lifetime has not yet begun}}
+    }
+  } xstd; // both-error {{is not a constant expression}} \
+          // both-note {{in call to}}
 }
 
 #ifdef __SIZEOF_INT128__


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to