llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-tools-extra Author: David Rivera (RiverDave) <details> <summary>Changes</summary> This aims to address a portion of #<!-- -->122480 by adding matchers on binary operators. **This allows explicit arithmetic operations within initializers.** ### Note I'm aware of the other false-negatives presented in the issue above, specifically not matching explicit castings & constexpr values. These will be addressed separately on a different PR which is in the process and shouldn't take long (let me know if that's the right approach). Feedback is much appreciated. --- Full diff: https://github.com/llvm/llvm-project/pull/129370.diff 3 Files Affected: - (modified) clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp (+12-1) - (modified) clang-tools-extra/docs/ReleaseNotes.rst (+4) - (modified) clang-tools-extra/test/clang-tidy/checkers/modernize/use-default-member-init.cpp (+26) ``````````diff diff --git a/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp index 6c06b0af342f6..a9d9e8b66ea7c 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp @@ -159,6 +159,12 @@ static bool sameValue(const Expr *E1, const Expr *E2) { case Stmt::UnaryOperatorClass: return sameValue(cast<UnaryOperator>(E1)->getSubExpr(), cast<UnaryOperator>(E2)->getSubExpr()); + case Stmt::BinaryOperatorClass: { + const auto *BinOp1 = cast<BinaryOperator>(E1); + const auto *BinOp2 = cast<BinaryOperator>(E2); + return sameValue(BinOp1->getLHS(), BinOp2->getLHS()) && + sameValue(BinOp1->getRHS(), BinOp2->getRHS()); + } case Stmt::CharacterLiteralClass: return cast<CharacterLiteral>(E1)->getValue() == cast<CharacterLiteral>(E2)->getValue(); @@ -202,7 +208,12 @@ void UseDefaultMemberInitCheck::registerMatchers(MatchFinder *Finder) { unaryOperator(hasAnyOperatorName("+", "-"), hasUnaryOperand(floatLiteral())), cxxBoolLiteral(), cxxNullPtrLiteralExpr(), implicitValueInitExpr(), - declRefExpr(to(enumConstantDecl()))); + declRefExpr(to(enumConstantDecl())), + binaryOperator( + hasLHS(anyOf(integerLiteral(), floatLiteral(), + declRefExpr(to(enumConstantDecl())), binaryOperator())), + hasRHS(anyOf(integerLiteral(), floatLiteral(), + declRefExpr(to(enumConstantDecl())), binaryOperator())))); auto Init = anyOf(initListExpr(anyOf(allOf(initCountIs(1), hasInit(0, InitBase)), diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 07a79d6bbe807..6d909f9d7c6bd 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -137,6 +137,10 @@ Changes in existing checks <clang-tidy/checks/performance/move-const-arg>` check by fixing false negatives on ternary operators calling ``std::move``. +- Improved :doc:`modernize-use-default-member-init + <clang-tidy/checks/modernize/use-default-member-init>` check by matching arithmetic + operations within member list initialization. + Removed checks ^^^^^^^^^^^^^^ diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-default-member-init.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-default-member-init.cpp index 81c980e0217e6..ff8c80b682bdb 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-default-member-init.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-default-member-init.cpp @@ -518,3 +518,29 @@ class ArrayBraceInitMultipleValues { }; } // namespace PR63285 + +namespace PR122480 { + +#define ARITHMETIC_MACRO (44 - 2) + +class DefaultMemberInitWithArithmetic { + DefaultMemberInitWithArithmetic() : a{1 + 1}, b{1 + 11 + 123 + 1234}, c{2 + (4 / 2) + 3 + (7 / 11)}, d{ARITHMETIC_MACRO * 2}, e{1.2 + 3.4} {} + // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: member initializer for 'a' is redundant [modernize-use-default-member-init] + // CHECK-FIXES: DefaultMemberInitWithArithmetic() {} + + int a{1 + 1}; + int b; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'b' [modernize-use-default-member-init] + // CHECK-FIXES: int b{1 + 11 + 123 + 1234}; + int c; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'c' [modernize-use-default-member-init] + // CHECK-FIXES: int c{2 + (4 / 2) + 3 + (7 / 11)} + int d; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'd' [modernize-use-default-member-init] + // CHECK-FIXES: int d{ARITHMETIC_MACRO * 2}; + double e; + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'e' [modernize-use-default-member-init] + // CHECK-FIXES: double e{1.2 + 3.4}; + +}; +} // namespace PR122480 `````````` </details> https://github.com/llvm/llvm-project/pull/129370 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits