Skip to content

Commit

Permalink
Fixed a crash in misc-redundant-expression ClangTidy checker
Browse files Browse the repository at this point in the history
Summary: It was trying to pass a dependent expression into constant evaluator.

Reviewers: ilya-biryukov

Subscribers: cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D63188

llvm-svn: 363133
gribozavr committed Jun 12, 2019
1 parent a947156 commit cf7d768
Showing 2 changed files with 31 additions and 11 deletions.
26 changes: 16 additions & 10 deletions clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp
Original file line number Diff line number Diff line change
@@ -555,10 +555,14 @@ static bool areSidesBinaryConstExpressions(const BinaryOperator *&BinOp, const A
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 @@ static bool retrieveConstExprFromBothSides(const BinaryOperator *&BinOp,
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;
16 changes: 15 additions & 1 deletion clang-tools-extra/test/clang-tidy/misc-redundant-expression.cpp
Original file line number Diff line number Diff line change
@@ -84,6 +84,14 @@ int TestSimpleEquivalent(int X, int Y) {
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 @@ int TestWithMinMaxInt(int X) {
#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 @@ int operatorConfusion(int X, int Y, long Z)
// 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

0 comments on commit cf7d768

Please sign in to comment.