forked from OSchip/llvm-project
Fix crash on misc-redundant-expression
Differential Revision: https://reviews.llvm.org/D80896
This commit is contained in:
parent
fe82d3a3ae
commit
c063b4a72b
clang-tools-extra
|
@ -72,8 +72,8 @@ static bool areEquivalentExpr(const Expr *Left, const Expr *Right) {
|
||||||
Expr::const_child_iterator LeftIter = Left->child_begin();
|
Expr::const_child_iterator LeftIter = Left->child_begin();
|
||||||
Expr::const_child_iterator RightIter = Right->child_begin();
|
Expr::const_child_iterator RightIter = Right->child_begin();
|
||||||
while (LeftIter != Left->child_end() && RightIter != Right->child_end()) {
|
while (LeftIter != Left->child_end() && RightIter != Right->child_end()) {
|
||||||
if (!areEquivalentExpr(dyn_cast<Expr>(*LeftIter),
|
if (!areEquivalentExpr(dyn_cast_or_null<Expr>(*LeftIter),
|
||||||
dyn_cast<Expr>(*RightIter)))
|
dyn_cast_or_null<Expr>(*RightIter)))
|
||||||
return false;
|
return false;
|
||||||
++LeftIter;
|
++LeftIter;
|
||||||
++RightIter;
|
++RightIter;
|
||||||
|
@ -117,6 +117,9 @@ static bool areEquivalentExpr(const Expr *Left, const Expr *Right) {
|
||||||
case Stmt::MemberExprClass:
|
case Stmt::MemberExprClass:
|
||||||
return cast<MemberExpr>(Left)->getMemberDecl() ==
|
return cast<MemberExpr>(Left)->getMemberDecl() ==
|
||||||
cast<MemberExpr>(Right)->getMemberDecl();
|
cast<MemberExpr>(Right)->getMemberDecl();
|
||||||
|
case Stmt::CXXFoldExprClass:
|
||||||
|
return cast<CXXFoldExpr>(Left)->getOperator() ==
|
||||||
|
cast<CXXFoldExpr>(Right)->getOperator();
|
||||||
case Stmt::CXXFunctionalCastExprClass:
|
case Stmt::CXXFunctionalCastExprClass:
|
||||||
case Stmt::CStyleCastExprClass:
|
case Stmt::CStyleCastExprClass:
|
||||||
return cast<ExplicitCastExpr>(Left)->getTypeAsWritten() ==
|
return cast<ExplicitCastExpr>(Left)->getTypeAsWritten() ==
|
||||||
|
|
|
@ -793,4 +793,10 @@ struct Bar {
|
||||||
return foo < GetFoo() && foo < maybe_foo;
|
return foo < GetFoo() && foo < maybe_foo;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
template <class... Values>
|
||||||
|
struct Bar2 {
|
||||||
|
static_assert((... && (sizeof(Values) > 0)) == (... && (sizeof(Values) > 0)));
|
||||||
|
// CHECK-MESSAGES: :[[@LINE-1]]:47: warning: both sides of operator are equivalent [misc-redundant-expression]
|
||||||
|
};
|
||||||
|
} // namespace no_crash
|
||||||
|
|
Loading…
Reference in New Issue