[clang] [clang][sema][NFC] Clean up builtin arg checking functions (PR #158615)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 15 04:50:45 PDT 2025
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/158615
Always take an `unsigned` for the argument index, pull some locals in the closest scope and use `APInt::isPowerOf2()`.
>From 4f82e5a3ed3a966aadbaa71b3cc945d1eb559d51 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Mon, 15 Sep 2025 13:45:54 +0200
Subject: [PATCH] Cleanup
---
clang/include/clang/Sema/Sema.h | 15 ++++++++-------
clang/lib/Sema/SemaChecking.cpp | 29 ++++++++++++++++-------------
2 files changed, 24 insertions(+), 20 deletions(-)
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..a3d68cd6c6894 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -5886,23 +5886,27 @@ 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)))
+ if (!(R = Arg->getIntegerConstantExpr(Context))) {
+ DeclRefExpr *DRE =
+ cast<DeclRefExpr>(TheCall->getCallee()->IgnoreParenCasts());
+ FunctionDecl *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 +5937,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 +5957,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 +5969,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 +5998,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 +6022,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;
More information about the cfe-commits
mailing list