Author: Timm Baeder Date: 2024-12-03T06:59:56+01:00 New Revision: dac9736d05f51b47633b51d599a07ff8d1d65df3
URL: https://github.com/llvm/llvm-project/commit/dac9736d05f51b47633b51d599a07ff8d1d65df3 DIFF: https://github.com/llvm/llvm-project/commit/dac9736d05f51b47633b51d599a07ff8d1d65df3.diff LOG: [clang][bytecode][NFC] Diagnose no-constexpr memcpy/strlen versions (#118429) Added: Modified: clang/lib/AST/ByteCode/InterpBuiltin.cpp Removed: ################################################################################ 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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits