[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 05:45:17 PDT 2025
https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/158615
>From e6be0335f0cc2370ccb1a93c5994843e23db96a7 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 | 36 +++++++++++++++++----------------
2 files changed, 27 insertions(+), 24 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..55a7157116cbe 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,10 +5968,8 @@ 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)
- return false;
+ if (!Result.isPowerOf2())
+ return true;
return Diag(TheCall->getBeginLoc(), diag::err_argument_not_power_of_2)
<< Arg->getSourceRange();
@@ -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;
More information about the cfe-commits
mailing list