forked from OSchip/llvm-project
Fixed a crash in misc-redundant-expression ClangTidy checker
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
This commit is contained in:
parent
a947156396
commit
cf7d768351
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue