Author: Timm Baeder Date: 2025-09-16T04:55:20+02:00 New Revision: 6dde34969e108090d58a64ce0b25c78b42df6367
URL: https://github.com/llvm/llvm-project/commit/6dde34969e108090d58a64ce0b25c78b42df6367 DIFF: https://github.com/llvm/llvm-project/commit/6dde34969e108090d58a64ce0b25c78b42df6367.diff LOG: [clang][sema][NFC] Clean up builtin arg checking functions (#158615) Always take an `unsigned` for the argument index, pull some locals in the closest scope and use `APInt::isPowerOf2()`. Added: Modified: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaChecking.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 7e00085685b21..41229e8cb644d 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -2819,26 +2819,27 @@ class Sema final : public SemaBase { /// BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr /// TheCall is a constant expression. - bool BuiltinConstantArg(CallExpr *TheCall, int ArgNum, llvm::APSInt &Result); + bool BuiltinConstantArg(CallExpr *TheCall, unsigned ArgNum, + llvm::APSInt &Result); /// BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr /// TheCall is a constant expression in the range [Low, High]. - bool BuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, int Low, int High, - bool RangeIsError = true); + bool BuiltinConstantArgRange(CallExpr *TheCall, unsigned ArgNum, int Low, + int High, bool RangeIsError = true); /// BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr /// TheCall is a constant expression is a multiple of Num.. - bool BuiltinConstantArgMultiple(CallExpr *TheCall, int ArgNum, + bool BuiltinConstantArgMultiple(CallExpr *TheCall, unsigned ArgNum, unsigned Multiple); /// BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a /// constant expression representing a power of 2. - bool BuiltinConstantArgPower2(CallExpr *TheCall, int ArgNum); + bool BuiltinConstantArgPower2(CallExpr *TheCall, unsigned ArgNum); /// BuiltinConstantArgShiftedByte - Check if argument ArgNum of TheCall is /// a constant expression representing an arbitrary byte value shifted left by /// a multiple of 8 bits. - bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, int ArgNum, + bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, unsigned ArgNum, unsigned ArgBits); /// BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of @@ -2846,7 +2847,7 @@ class Sema final : public SemaBase { /// or a value of the form 0x??FF (i.e. a member of the arithmetic progression /// 0x00FF, 0x01FF, ..., 0xFFFF). This strange range check is needed for some /// Arm MVE intrinsics. - bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, int ArgNum, + bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, unsigned ArgNum, unsigned ArgBits); /// Checks that a call expression's argument count is at least the desired diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 077f4311ed729..cb8ecb77b73ff 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -5618,8 +5618,8 @@ ExprResult Sema::BuiltinShuffleVector(CallExpr *TheCall) { if (Arg->isTypeDependent() || Arg->isValueDependent()) continue; - std::optional<llvm::APSInt> Result; - if (!(Result = Arg->getIntegerConstantExpr(Context))) + std::optional<llvm::APSInt> Result = Arg->getIntegerConstantExpr(Context); + if (!Result) return ExprError(Diag(TheCall->getBeginLoc(), diag::err_shufflevector_nonconstant_argument) << Arg->getSourceRange()); @@ -5886,23 +5886,26 @@ bool Sema::BuiltinOSLogFormat(CallExpr *TheCall) { return false; } -bool Sema::BuiltinConstantArg(CallExpr *TheCall, int ArgNum, +bool Sema::BuiltinConstantArg(CallExpr *TheCall, unsigned ArgNum, llvm::APSInt &Result) { Expr *Arg = TheCall->getArg(ArgNum); - DeclRefExpr *DRE =cast<DeclRefExpr>(TheCall->getCallee()->IgnoreParenCasts()); - FunctionDecl *FDecl = cast<FunctionDecl>(DRE->getDecl()); - if (Arg->isTypeDependent() || Arg->isValueDependent()) return false; + if (Arg->isTypeDependent() || Arg->isValueDependent()) + return false; - std::optional<llvm::APSInt> R; - if (!(R = Arg->getIntegerConstantExpr(Context))) + std::optional<llvm::APSInt> R = Arg->getIntegerConstantExpr(Context); + if (!R) { + auto *DRE = cast<DeclRefExpr>(TheCall->getCallee()->IgnoreParenCasts()); + auto *FDecl = cast<FunctionDecl>(DRE->getDecl()); return Diag(TheCall->getBeginLoc(), diag::err_constant_integer_arg_type) << FDecl->getDeclName() << Arg->getSourceRange(); + } Result = *R; + return false; } -bool Sema::BuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, int Low, +bool Sema::BuiltinConstantArgRange(CallExpr *TheCall, unsigned ArgNum, int Low, int High, bool RangeIsError) { if (isConstantEvaluatedContext()) return false; @@ -5933,7 +5936,7 @@ bool Sema::BuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, int Low, return false; } -bool Sema::BuiltinConstantArgMultiple(CallExpr *TheCall, int ArgNum, +bool Sema::BuiltinConstantArgMultiple(CallExpr *TheCall, unsigned ArgNum, unsigned Num) { llvm::APSInt Result; @@ -5953,7 +5956,7 @@ bool Sema::BuiltinConstantArgMultiple(CallExpr *TheCall, int ArgNum, return false; } -bool Sema::BuiltinConstantArgPower2(CallExpr *TheCall, int ArgNum) { +bool Sema::BuiltinConstantArgPower2(CallExpr *TheCall, unsigned ArgNum) { llvm::APSInt Result; // We can't check the value of a dependent argument. @@ -5965,9 +5968,7 @@ bool Sema::BuiltinConstantArgPower2(CallExpr *TheCall, int ArgNum) { if (BuiltinConstantArg(TheCall, ArgNum, Result)) return true; - // Bit-twiddling to test for a power of 2: for x > 0, x & (x-1) is zero if - // and only if x is a power of 2. - if (Result.isStrictlyPositive() && (Result & (Result - 1)) == 0) + if (Result.isPowerOf2()) return false; return Diag(TheCall->getBeginLoc(), diag::err_argument_not_power_of_2) @@ -5996,7 +5997,7 @@ static bool IsShiftedByte(llvm::APSInt Value) { } } -bool Sema::BuiltinConstantArgShiftedByte(CallExpr *TheCall, int ArgNum, +bool Sema::BuiltinConstantArgShiftedByte(CallExpr *TheCall, unsigned ArgNum, unsigned ArgBits) { llvm::APSInt Result; @@ -6020,7 +6021,8 @@ bool Sema::BuiltinConstantArgShiftedByte(CallExpr *TheCall, int ArgNum, << Arg->getSourceRange(); } -bool Sema::BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, int ArgNum, +bool Sema::BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, + unsigned ArgNum, unsigned ArgBits) { llvm::APSInt Result; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits