我想比较一下,在一个 ImplicCastExpr
在我的ASTvisitor检查中,但它似乎是 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
. 谁能解释一下为什么会这样?
换句话说,ComboundOperator是什么?!=
做哪个BinaryOperator >
不允许?
llvm::APInt表示一个固定宽度的位向量。它不区分有符号值和无符号值,所以你不能简单地使用>、>=、<和<=来比较值,因为它不知道你是想把APInt的值解释为有符号还是无符号数。!= 和 == 工作,因为它们对有符号和无符号的数量具有相同的语义。
正如您所看到的 此处llvm::APInt 使用 sgt 和 ugt 方法提供了单独的有符号和无符号大于比较。这些方法提供了重载,分别取一个int64_t和一个uint64_t。
因此,正确的代码应该是 if( IL->getValue().ugt(65535)
或者 if( IL->getValue().sgt(65535))
.