将 int 值与 APInt Clang ASTVisitors 进行比较
Comparing an int value with APInt Clang ASTVisitors
我想在我的 ASTvisitor 检查中比较 ImplicCastExpr
的界限,但似乎 Clang
不允许我这样做:
static bool vectorLoopConditionVisitor(Sema &S, Expr *E){
if(!E){
S.Diag(E->getBeginLoc(), diag::err_...);
} else{
const BinaryOperator *BO = dyn_cast<BinaryOperator>(E);
if(!BO) {
if(const IntegerLiteral *IL = dyn_cast_or_null<IntegerLiteral>(BO->getRHS()->IgnoreParenImpCasts())) {
if( IL->getValue() > 65535){
S.Diag(BO->getOperatorLoc(), diag::err_...);
}
return false;
}
这将引发以下错误,因为我正在尝试将 int
值与 llvm::APInt
进行比较:
invalid operands to binary expression ('llvm::APInt' and 'int')
但是,我在我的其他函数中进行了类似的比较,没有任何问题:
static bool vectorLoopInitializationsVisitor(Sema &S, Stmt *St) {
DeclStmt *Dst = dyn_cast<DeclStmt>(St);
if (!Dst->isSingleDecl()) {
¦ S.Diag(St->getBeginLoc(), diag::err_...);
}
VarDecl const *VD = dyn_cast<VarDecl>(Dst->getSingleDecl());
if(const IntegerLiteral *IL = dyn_cast<IntegerLiteral>(VD->getInit()->IgnoreImpCasts())){
if (IL->getValue() != 0) {
¦ if (IL->getValue() !=
¦ ¦ ¦ 12345) {
¦ ¦ S.Diag(St->getBeginLoc(), diag::err_...);
¦ }
}
return false;
}
检查两种类型,有llvm::APInt
和int
。谁能解释为什么会这样?
换句话说,CompoundOperator !=
做什么而 BinaryOperator >
不做什么?
llvm::APInt表示一个固定宽度的位向量。它不区分有符号和无符号值,因此您不能简单地使用 >、>=、< 和 <= 来比较值,因为它不知道您是否要将 APInt 的值解释为有符号或无符号数。 != 和 == 之所以有效,是因为它们对有符号和无符号数量具有相同的语义。
如您所见here,llvm::APInt 使用 sgt 和 ugt 方法提供单独的有符号和无符号大于比较。这些方法提供分别采用 a int64_t 和 uint64_t 的重载。
因此,正确的代码应该是:if( IL->getValue().ugt(65535)
或 if( IL->getValue().sgt(65535))
。
我想在我的 ASTvisitor 检查中比较 ImplicCastExpr
的界限,但似乎 Clang
不允许我这样做:
static bool vectorLoopConditionVisitor(Sema &S, Expr *E){
if(!E){
S.Diag(E->getBeginLoc(), diag::err_...);
} else{
const BinaryOperator *BO = dyn_cast<BinaryOperator>(E);
if(!BO) {
if(const IntegerLiteral *IL = dyn_cast_or_null<IntegerLiteral>(BO->getRHS()->IgnoreParenImpCasts())) {
if( IL->getValue() > 65535){
S.Diag(BO->getOperatorLoc(), diag::err_...);
}
return false;
}
这将引发以下错误,因为我正在尝试将 int
值与 llvm::APInt
进行比较:
invalid operands to binary expression ('llvm::APInt' and 'int')
但是,我在我的其他函数中进行了类似的比较,没有任何问题:
static bool vectorLoopInitializationsVisitor(Sema &S, Stmt *St) {
DeclStmt *Dst = dyn_cast<DeclStmt>(St);
if (!Dst->isSingleDecl()) {
¦ S.Diag(St->getBeginLoc(), diag::err_...);
}
VarDecl const *VD = dyn_cast<VarDecl>(Dst->getSingleDecl());
if(const IntegerLiteral *IL = dyn_cast<IntegerLiteral>(VD->getInit()->IgnoreImpCasts())){
if (IL->getValue() != 0) {
¦ if (IL->getValue() !=
¦ ¦ ¦ 12345) {
¦ ¦ S.Diag(St->getBeginLoc(), diag::err_...);
¦ }
}
return false;
}
检查两种类型,有llvm::APInt
和int
。谁能解释为什么会这样?
换句话说,CompoundOperator !=
做什么而 BinaryOperator >
不做什么?
llvm::APInt表示一个固定宽度的位向量。它不区分有符号和无符号值,因此您不能简单地使用 >、>=、< 和 <= 来比较值,因为它不知道您是否要将 APInt 的值解释为有符号或无符号数。 != 和 == 之所以有效,是因为它们对有符号和无符号数量具有相同的语义。
如您所见here,llvm::APInt 使用 sgt 和 ugt 方法提供单独的有符号和无符号大于比较。这些方法提供分别采用 a int64_t 和 uint64_t 的重载。
因此,正确的代码应该是:if( IL->getValue().ugt(65535)
或 if( IL->getValue().sgt(65535))
。