[clang] [clang][bytecode][NFC] Diagnose no-constexpr memcpy/strlen versions (PR #118429)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 2 21:36:27 PST 2024
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/118429
None
>From 5a16e4d366ca0600a0b8fd98265745223cd8aec1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Tue, 3 Dec 2024 06:34:51 +0100
Subject: [PATCH] [clang][bytecode][NFC] Diagnose no-constexpr memcpy/strlen
versions
---
clang/lib/AST/ByteCode/InterpBuiltin.cpp | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index d7e32c491b03bc..aab380c0925d29 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -222,11 +222,25 @@ static bool interp__builtin_strcmp(InterpState &S, CodePtr OpPC,
return true;
}
+static void diagnoseNonConstexprBuiltin(InterpState &S, CodePtr OpPC,
+ unsigned ID) {
+ auto Loc = S.Current->getSource(OpPC);
+ if (S.getLangOpts().CPlusPlus11)
+ S.CCEDiag(Loc, diag::note_constexpr_invalid_function)
+ << /*isConstexpr=*/0 << /*isConstructor=*/0
+ << ("'" + S.getASTContext().BuiltinInfo.getName(ID) + "'").str();
+ else
+ S.CCEDiag(Loc, diag::note_invalid_subexpr_in_const_expr);
+}
static bool interp__builtin_strlen(InterpState &S, CodePtr OpPC,
const InterpFrame *Frame,
- const CallExpr *Call) {
+ const Function *Func, const CallExpr *Call) {
+ unsigned ID = Func->getBuiltinID();
const Pointer &StrPtr = getParam<Pointer>(Frame, 0);
+ if (ID == Builtin::BIstrlen)
+ diagnoseNonConstexprBuiltin(S, OpPC, ID);
+
if (!CheckArray(S, OpPC, StrPtr))
return false;
@@ -1781,12 +1795,16 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
const InterpFrame *Frame,
const Function *Func, const CallExpr *Call) {
assert(Call->getNumArgs() == 3);
+ unsigned ID = Func->getBuiltinID();
Pointer DestPtr = getParam<Pointer>(Frame, 0);
const Pointer &SrcPtr = getParam<Pointer>(Frame, 1);
const APSInt &Size =
peekToAPSInt(S.Stk, *S.getContext().classify(Call->getArg(2)));
assert(!Size.isSigned() && "memcpy and friends take an unsigned size");
+ if (ID == Builtin::BImemcpy)
+ diagnoseNonConstexprBuiltin(S, OpPC, ID);
+
if (DestPtr.isDummy() || SrcPtr.isDummy())
return false;
@@ -1830,7 +1848,8 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
return false;
break;
case Builtin::BI__builtin_strlen:
- if (!interp__builtin_strlen(S, OpPC, Frame, Call))
+ case Builtin::BIstrlen:
+ if (!interp__builtin_strlen(S, OpPC, Frame, F, Call))
return false;
break;
case Builtin::BI__builtin_nan:
@@ -2271,6 +2290,7 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
break;
case Builtin::BI__builtin_memcpy:
+ case Builtin::BImemcpy:
if (!interp__builtin_memcpy(S, OpPC, Frame, F, Call))
return false;
break;
More information about the cfe-commits
mailing list