[clang] [Clang] Add __builtin_is_within_lifetime to implement P2641R4's std::is_within_lifetime (PR #91895)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 5 07:31:20 PDT 2024
================
@@ -1832,6 +1832,33 @@ static ExprResult BuiltinLaunder(Sema &S, CallExpr *TheCall) {
return TheCall;
}
+static ExprResult BuiltinIsWithinLifetime(Sema &S, CallExpr *TheCall) {
+ if (checkArgCount(S, TheCall, 1))
+ return ExprError();
+
+ ExprResult Arg = S.DefaultFunctionArrayLvalueConversion(TheCall->getArg(0));
+ if (Arg.isInvalid())
+ return ExprError();
+ QualType ParamTy = Arg.get()->getType();
+ TheCall->setArg(0, Arg.get());
+ TheCall->setType(S.Context.BoolTy);
+
+ // A call to this function is always ill-formed if the type is not a pointer
+ // to an object type. There is no Mandates: to that effect, so we can only
+ // issue an error if it is actually evaluated as part of a constant evaluation
+ // (e.g., `false ? true :
----------------
cor3ntin wrote:
I think this is not quite true.
The function is defined as ` consteval bool is_within_lifetime(const T* p) noexcept;`
The const does _a lot_ of heavy lifting there.
https://compiler-explorer.com/z/hdvfWEbYj
The const reject function pointer types (https://eel.is/c++draft/conv.qual#5)
So I think this should be handled there, rather than in the constexpr evaluator
https://github.com/llvm/llvm-project/pull/91895
More information about the cfe-commits
mailing list