[clang] [clang-tools-extra] [clang-tidy] Address false positives in misc-redundant-expression checker (PR #122841)
Piotr Zegar via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 20 07:31:50 PST 2025
================
@@ -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
More information about the cfe-commits
mailing list