aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/AST/ByteCode/InterpBuiltin.cpp
diff options
context:
space:
mode:
authorTimm Baeder <tbaeder@redhat.com>2025-04-29 10:57:30 +0200
committerGitHub <noreply@github.com>2025-04-29 10:57:30 +0200
commit4bf356bbd25ef5950de92b9e66cc8a2d3af583d9 (patch)
tree229e492b64d5bdfadb833164f4a62b5c41c10a32 /clang/lib/AST/ByteCode/InterpBuiltin.cpp
parent13b443f2efcfe57768a1077c63bb675eb6380e35 (diff)
downloadllvm-4bf356bbd25ef5950de92b9e66cc8a2d3af583d9.zip
llvm-4bf356bbd25ef5950de92b9e66cc8a2d3af583d9.tar.gz
llvm-4bf356bbd25ef5950de92b9e66cc8a2d3af583d9.tar.bz2
[clang][bytecode] Start implementing builtin_is_within_lifetime (#137765)
Diffstat (limited to 'clang/lib/AST/ByteCode/InterpBuiltin.cpp')
-rw-r--r--clang/lib/AST/ByteCode/InterpBuiltin.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index b6e5b5f..8edc624 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -2198,6 +2198,50 @@ static bool interp__builtin_object_size(InterpState &S, CodePtr OpPC,
return true;
}
+static bool interp__builtin_is_within_lifetime(InterpState &S, CodePtr OpPC,
+ const CallExpr *Call) {
+
+ if (!S.inConstantContext())
+ return false;
+
+ const Pointer &Ptr = S.Stk.peek<Pointer>();
+
+ auto Error = [&](int Diag) {
+ bool CalledFromStd = false;
+ const auto *Callee = S.Current->getCallee();
+ if (Callee && Callee->isInStdNamespace()) {
+ const IdentifierInfo *Identifier = Callee->getIdentifier();
+ CalledFromStd = Identifier && Identifier->isStr("is_within_lifetime");
+ }
+ S.CCEDiag(CalledFromStd
+ ? S.Current->Caller->getSource(S.Current->getRetPC())
+ : S.Current->getSource(OpPC),
+ diag::err_invalid_is_within_lifetime)
+ << (CalledFromStd ? "std::is_within_lifetime"
+ : "__builtin_is_within_lifetime")
+ << Diag;
+ return false;
+ };
+
+ if (Ptr.isZero())
+ return Error(0);
+ if (Ptr.isOnePastEnd())
+ return Error(1);
+
+ bool Result = true;
+ if (!Ptr.isActive()) {
+ Result = false;
+ } else {
+ if (!CheckLive(S, OpPC, Ptr, AK_Read))
+ return false;
+ if (!CheckMutable(S, OpPC, Ptr))
+ return false;
+ }
+
+ pushInteger(S, Result, Call->getType());
+ return true;
+}
+
bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
uint32_t BuiltinID) {
if (!S.getASTContext().BuiltinInfo.isConstantEvaluated(BuiltinID))
@@ -2707,6 +2751,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
return false;
break;
+ case Builtin::BI__builtin_is_within_lifetime:
+ if (!interp__builtin_is_within_lifetime(S, OpPC, Call))
+ return false;
+ break;
+
default:
S.FFDiag(S.Current->getLocation(OpPC),
diag::note_invalid_subexpr_in_const_expr)