================ @@ -847,11 +869,104 @@ static bool areExprsMacroAndNonMacro(const Expr *&LhsExpr, if (!LhsExpr || !RhsExpr) return false; - SourceLocation LhsLoc = LhsExpr->getExprLoc(); - SourceLocation RhsLoc = RhsExpr->getExprLoc(); + const SourceLocation LhsLoc = LhsExpr->getExprLoc(); + const SourceLocation RhsLoc = RhsExpr->getExprLoc(); return LhsLoc.isMacroID() != RhsLoc.isMacroID(); } + +static bool areStringsSameIgnoreSpaces(const llvm::StringRef *Left, + const llvm::StringRef *Right) { + if (Left == Right) + return true; + if (Left->compare(*Right) == 0) { + return true; + } + // Do running index comparison + size_t LIdx = 0; + size_t RIdx = 0; + const char *LData = Left->data(); + const char *RData = Right->data(); + while (LIdx < Left->size() && RIdx < Right->size()) { + + // Skip spaces and tabs from both strings + while (LIdx < Left->size() && (LData[LIdx] == ' ' || LData[LIdx] == '\t')) { + LIdx += 1; + } + while (RIdx < Right->size() && + (RData[RIdx] == ' ' || RData[RIdx] == '\t')) { + RIdx += 1; + } + + // If all not tabs and spaces are the same then return true + if (LIdx >= Left->size() && RIdx >= Right->size()) + return true; + + // If any characters differs then return false + else if (LData[LIdx] != RData[RIdx]) + return false; + + // If current char is the same ==> continue search + else { + LIdx += 1; + RIdx += 1; + } + } + // Shortest string is processed: issue a verdict + return LIdx >= Left->size() && RIdx >= Right->size(); +} + +static bool areExprsSameMacroOrLiteral(const BinaryOperator *BinOp, + const ASTContext *Context) { + + if (!BinOp) + return false; + + const Expr *Lhs = BinOp->getLHS(); + const Expr *Rhs = BinOp->getRHS(); + const SourceManager &SM = Context->getSourceManager(); + + const SourceRange Lsr = Lhs->getSourceRange(); + const SourceRange Rsr = Rhs->getSourceRange(); + if (Lsr.getBegin().isMacroID()) { ---------------- PiotrZSL wrote:
problem with this is that you do not know if every part of LHS or RHS is an macro, because you checking only source of first token. If I would write: +VALUE, where #define VALUE 10, then it would fail. I think that there is some function in /utils/ that may help here https://github.com/llvm/llvm-project/pull/122841 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits