This revision was automatically updated to reflect the committed changes. Closed by commit rL363133: Fixed a crash in misc-redundant-expression ClangTidy checker (authored by gribozavr, committed by ). Herald added a project: LLVM. Herald added a subscriber: llvm-commits.
Changed prior to commit: https://reviews.llvm.org/D63188?vs=204233&id=204234#toc Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63188/new/ https://reviews.llvm.org/D63188 Files: clang-tools-extra/trunk/clang-tidy/misc/RedundantExpressionCheck.cpp clang-tools-extra/trunk/test/clang-tidy/misc-redundant-expression.cpp Index: clang-tools-extra/trunk/clang-tidy/misc/RedundantExpressionCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/RedundantExpressionCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/misc/RedundantExpressionCheck.cpp @@ -555,10 +555,14 @@ if (!LhsBinOp || !RhsBinOp) return false; - if ((LhsBinOp->getLHS()->isIntegerConstantExpr(*AstCtx) || - LhsBinOp->getRHS()->isIntegerConstantExpr(*AstCtx)) && - (RhsBinOp->getLHS()->isIntegerConstantExpr(*AstCtx) || - RhsBinOp->getRHS()->isIntegerConstantExpr(*AstCtx))) + auto IsIntegerConstantExpr = [AstCtx](const Expr *E) { + return !E->isValueDependent() && E->isIntegerConstantExpr(*AstCtx); + }; + + if ((IsIntegerConstantExpr(LhsBinOp->getLHS()) || + IsIntegerConstantExpr(LhsBinOp->getRHS())) && + (IsIntegerConstantExpr(RhsBinOp->getLHS()) || + IsIntegerConstantExpr(RhsBinOp->getRHS()))) return true; return false; } @@ -580,12 +584,14 @@ const auto *BinOpLhs = cast<BinaryOperator>(BinOp->getLHS()); const auto *BinOpRhs = cast<BinaryOperator>(BinOp->getRHS()); - LhsConst = BinOpLhs->getLHS()->isIntegerConstantExpr(*AstCtx) - ? BinOpLhs->getLHS() - : BinOpLhs->getRHS(); - RhsConst = BinOpRhs->getLHS()->isIntegerConstantExpr(*AstCtx) - ? BinOpRhs->getLHS() - : BinOpRhs->getRHS(); + auto IsIntegerConstantExpr = [AstCtx](const Expr *E) { + return !E->isValueDependent() && E->isIntegerConstantExpr(*AstCtx); + }; + + LhsConst = IsIntegerConstantExpr(BinOpLhs->getLHS()) ? BinOpLhs->getLHS() + : BinOpLhs->getRHS(); + RhsConst = IsIntegerConstantExpr(BinOpRhs->getLHS()) ? BinOpRhs->getLHS() + : BinOpRhs->getRHS(); if (!LhsConst || !RhsConst) return false; Index: clang-tools-extra/trunk/test/clang-tidy/misc-redundant-expression.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/misc-redundant-expression.cpp +++ clang-tools-extra/trunk/test/clang-tidy/misc-redundant-expression.cpp @@ -84,6 +84,14 @@ return 0; } +template <int DX> +int TestSimpleEquivalentDependent() { + if (DX > 0 && DX > 0) return 1; + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: both sides of operator are equivalent + + return 0; +} + int Valid(int X, int Y) { if (X != Y) return 1; if (X == Y + 0) return 1; @@ -670,7 +678,7 @@ #define FLAG3 4 #define FLAGS (FLAG1 | FLAG2 | FLAG3) #define NOTFLAGS !(FLAG1 | FLAG2 | FLAG3) -int operatorConfusion(int X, int Y, long Z) +int TestOperatorConfusion(int X, int Y, long Z) { // Ineffective & expressions. Y = (Y << 8) & 0xff; @@ -722,6 +730,12 @@ // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: ineffective logical negation operator // CHECK-FIXES: {{^}} return ~(1 | 2 | 4);{{$}} } + +template <int Shift, int Mask> +int TestOperatorConfusionDependent(int Y) { + int r1 = (Y << Shift) & 0xff; + int r2 = (Y << 8) & Mask; +} #undef FLAG1 #undef FLAG2 #undef FLAG3
Index: clang-tools-extra/trunk/clang-tidy/misc/RedundantExpressionCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/RedundantExpressionCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/misc/RedundantExpressionCheck.cpp @@ -555,10 +555,14 @@ if (!LhsBinOp || !RhsBinOp) return false; - if ((LhsBinOp->getLHS()->isIntegerConstantExpr(*AstCtx) || - LhsBinOp->getRHS()->isIntegerConstantExpr(*AstCtx)) && - (RhsBinOp->getLHS()->isIntegerConstantExpr(*AstCtx) || - RhsBinOp->getRHS()->isIntegerConstantExpr(*AstCtx))) + auto IsIntegerConstantExpr = [AstCtx](const Expr *E) { + return !E->isValueDependent() && E->isIntegerConstantExpr(*AstCtx); + }; + + if ((IsIntegerConstantExpr(LhsBinOp->getLHS()) || + IsIntegerConstantExpr(LhsBinOp->getRHS())) && + (IsIntegerConstantExpr(RhsBinOp->getLHS()) || + IsIntegerConstantExpr(RhsBinOp->getRHS()))) return true; return false; } @@ -580,12 +584,14 @@ const auto *BinOpLhs = cast<BinaryOperator>(BinOp->getLHS()); const auto *BinOpRhs = cast<BinaryOperator>(BinOp->getRHS()); - LhsConst = BinOpLhs->getLHS()->isIntegerConstantExpr(*AstCtx) - ? BinOpLhs->getLHS() - : BinOpLhs->getRHS(); - RhsConst = BinOpRhs->getLHS()->isIntegerConstantExpr(*AstCtx) - ? BinOpRhs->getLHS() - : BinOpRhs->getRHS(); + auto IsIntegerConstantExpr = [AstCtx](const Expr *E) { + return !E->isValueDependent() && E->isIntegerConstantExpr(*AstCtx); + }; + + LhsConst = IsIntegerConstantExpr(BinOpLhs->getLHS()) ? BinOpLhs->getLHS() + : BinOpLhs->getRHS(); + RhsConst = IsIntegerConstantExpr(BinOpRhs->getLHS()) ? BinOpRhs->getLHS() + : BinOpRhs->getRHS(); if (!LhsConst || !RhsConst) return false; Index: clang-tools-extra/trunk/test/clang-tidy/misc-redundant-expression.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/misc-redundant-expression.cpp +++ clang-tools-extra/trunk/test/clang-tidy/misc-redundant-expression.cpp @@ -84,6 +84,14 @@ return 0; } +template <int DX> +int TestSimpleEquivalentDependent() { + if (DX > 0 && DX > 0) return 1; + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: both sides of operator are equivalent + + return 0; +} + int Valid(int X, int Y) { if (X != Y) return 1; if (X == Y + 0) return 1; @@ -670,7 +678,7 @@ #define FLAG3 4 #define FLAGS (FLAG1 | FLAG2 | FLAG3) #define NOTFLAGS !(FLAG1 | FLAG2 | FLAG3) -int operatorConfusion(int X, int Y, long Z) +int TestOperatorConfusion(int X, int Y, long Z) { // Ineffective & expressions. Y = (Y << 8) & 0xff; @@ -722,6 +730,12 @@ // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: ineffective logical negation operator // CHECK-FIXES: {{^}} return ~(1 | 2 | 4);{{$}} } + +template <int Shift, int Mask> +int TestOperatorConfusionDependent(int Y) { + int r1 = (Y << Shift) & 0xff; + int r2 = (Y << 8) & Mask; +} #undef FLAG1 #undef FLAG2 #undef FLAG3
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits