将 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::APIntint。谁能解释为什么会这样?

换句话说,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))