zinovy.nis created this revision. zinovy.nis added a reviewer: etienneb. Herald added subscribers: cfe-commits, xazax.hun. Herald added a project: clang.
Fix for a crash from https://bugs.llvm.org/show_bug.cgi?id=44256 Bug: https://bugs.llvm.org/show_bug.cgi?id=44256 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D80896 Files: clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp clang-tools-extra/test/clang-tidy/checkers/misc-redundant-expression.cpp Index: clang-tools-extra/test/clang-tidy/checkers/misc-redundant-expression.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/misc-redundant-expression.cpp +++ clang-tools-extra/test/clang-tidy/checkers/misc-redundant-expression.cpp @@ -793,4 +793,10 @@ return foo < GetFoo() && foo < maybe_foo; } }; + +template <class... Values> +struct Bar2 { + static_assert( + (... && (sizeof(Values) > 0)) || (... && (sizeof(Values) < 0))); +}; } Index: clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp +++ clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp @@ -72,7 +72,7 @@ Expr::const_child_iterator LeftIter = Left->child_begin(); Expr::const_child_iterator RightIter = Right->child_begin(); while (LeftIter != Left->child_end() && RightIter != Right->child_end()) { - if (!areEquivalentExpr(dyn_cast<Expr>(*LeftIter), + if (*LeftIter && *RightIter && !areEquivalentExpr(dyn_cast<Expr>(*LeftIter), dyn_cast<Expr>(*RightIter))) return false; ++LeftIter; @@ -117,6 +117,13 @@ case Stmt::MemberExprClass: return cast<MemberExpr>(Left)->getMemberDecl() == cast<MemberExpr>(Right)->getMemberDecl(); + case Stmt::CXXFoldExprClass: { + const auto LeftLHS = cast<CXXFoldExpr>(Left)->getLHS(); + const auto RightLHS = cast<CXXFoldExpr>(Right)->getLHS(); + const auto LeftRHS = cast<CXXFoldExpr>(Left)->getRHS(); + const auto RightRHS = cast<CXXFoldExpr>(Right)->getRHS(); + return areEquivalentExpr(LeftLHS, RightLHS) && areEquivalentExpr(LeftRHS, RightRHS); + } case Stmt::CXXFunctionalCastExprClass: case Stmt::CStyleCastExprClass: return cast<ExplicitCastExpr>(Left)->getTypeAsWritten() ==
Index: clang-tools-extra/test/clang-tidy/checkers/misc-redundant-expression.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/misc-redundant-expression.cpp +++ clang-tools-extra/test/clang-tidy/checkers/misc-redundant-expression.cpp @@ -793,4 +793,10 @@ return foo < GetFoo() && foo < maybe_foo; } }; + +template <class... Values> +struct Bar2 { + static_assert( + (... && (sizeof(Values) > 0)) || (... && (sizeof(Values) < 0))); +}; } Index: clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp +++ clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp @@ -72,7 +72,7 @@ Expr::const_child_iterator LeftIter = Left->child_begin(); Expr::const_child_iterator RightIter = Right->child_begin(); while (LeftIter != Left->child_end() && RightIter != Right->child_end()) { - if (!areEquivalentExpr(dyn_cast<Expr>(*LeftIter), + if (*LeftIter && *RightIter && !areEquivalentExpr(dyn_cast<Expr>(*LeftIter), dyn_cast<Expr>(*RightIter))) return false; ++LeftIter; @@ -117,6 +117,13 @@ case Stmt::MemberExprClass: return cast<MemberExpr>(Left)->getMemberDecl() == cast<MemberExpr>(Right)->getMemberDecl(); + case Stmt::CXXFoldExprClass: { + const auto LeftLHS = cast<CXXFoldExpr>(Left)->getLHS(); + const auto RightLHS = cast<CXXFoldExpr>(Right)->getLHS(); + const auto LeftRHS = cast<CXXFoldExpr>(Left)->getRHS(); + const auto RightRHS = cast<CXXFoldExpr>(Right)->getRHS(); + return areEquivalentExpr(LeftLHS, RightLHS) && areEquivalentExpr(LeftRHS, RightRHS); + } case Stmt::CXXFunctionalCastExprClass: case Stmt::CStyleCastExprClass: return cast<ExplicitCastExpr>(Left)->getTypeAsWritten() ==
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits