Beispiel #1
0
 void VisitDeclRefExpr(DeclRefExpr *Node) {
   ValueDecl* decl = Node->getDecl();
   if (isa<EnumConstantDecl>(decl)) {
     EnumConstantDecl* ecdecl = cast<EnumConstantDecl>(decl);
     if (ecdecl->getInitVal() < 0) {
       OS << "(- ";
       OS << (-(ecdecl->getInitVal())).toString(10);
       OS << ")";
     } else {
       OS << ecdecl->getInitVal().toString(10);
     }
   } else {
     OS << Node->getNameInfo();
   }
 }
Beispiel #2
0
static bool UseNSOptionsMacro(ASTContext &Ctx,
                              const EnumDecl *EnumDcl) {
  bool PowerOfTwo = true;
  for (EnumDecl::enumerator_iterator EI = EnumDcl->enumerator_begin(),
       EE = EnumDcl->enumerator_end(); EI != EE; ++EI) {
    EnumConstantDecl *Enumerator = (*EI);
    const Expr *InitExpr = Enumerator->getInitExpr();
    if (!InitExpr) {
      PowerOfTwo = false;
      continue;
    }
    InitExpr = InitExpr->IgnoreImpCasts();
    if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(InitExpr))
      if (BO->isShiftOp() || BO->isBitwiseOp())
        return true;
    
    uint64_t EnumVal = Enumerator->getInitVal().getZExtValue();
    if (PowerOfTwo && EnumVal && !llvm::isPowerOf2_64(EnumVal))
      PowerOfTwo = false;
  }
  return PowerOfTwo;
}