比较一个int值与APInt Clang ASTVisitors。

问题描述 投票:0回答:1

我想比较一下,在一个 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::APIntint. 谁能解释一下为什么会这样?

换句话说,ComboundOperator是什么?!= 做哪个BinaryOperator > 不允许?

clang abstract-syntax-tree semantics visitor
1个回答
1
投票

llvm::APInt表示一个固定宽度的位向量。它不区分有符号值和无符号值,所以你不能简单地使用>、>=、<和<=来比较值,因为它不知道你是想把APInt的值解释为有符号还是无符号数。!= 和 == 工作,因为它们对有符号和无符号的数量具有相同的语义。

正如您所看到的 此处llvm::APInt 使用 sgt 和 ugt 方法提供了单独的有符号和无符号大于比较。这些方法提供了重载,分别取一个int64_t和一个uint64_t。

因此,正确的代码应该是 if( IL->getValue().ugt(65535) 或者 if( IL->getValue().sgt(65535)).

© www.soinside.com 2019 - 2024. All rights reserved.