https://github.com/RiverDave updated https://github.com/llvm/llvm-project/pull/129370
>From 82951dab6d1b834a5b296faddcf23603f3f05e84 Mon Sep 17 00:00:00 2001 From: David Rivera <davidriv...@gmail.com> Date: Sat, 1 Mar 2025 02:09:02 -0500 Subject: [PATCH] [clang-tidy] detect arithmetic operations within member list initialization in modernize-use-default-member-init --- .../modernize/UseDefaultMemberInitCheck.cpp | 30 +++++++++++++------ clang-tools-extra/docs/ReleaseNotes.rst | 2 +- .../modernize/use-default-member-init.cpp | 23 ++++++++++++++ 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp index bf99c738da1a3..9ad6dcefbc1bb 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp @@ -159,6 +159,13 @@ 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 BinOp1->getOpcode() == BinOp2->getOpcode() && + sameValue(BinOp1->getLHS(), BinOp2->getLHS()) && + sameValue(BinOp1->getRHS(), BinOp2->getRHS()); + } case Stmt::CharacterLiteralClass: return cast<CharacterLiteral>(E1)->getValue() == cast<CharacterLiteral>(E2)->getValue(); @@ -199,17 +206,22 @@ void UseDefaultMemberInitCheck::storeOptions( } void UseDefaultMemberInitCheck::registerMatchers(MatchFinder *Finder) { - auto ConstExpRef = varDecl(anyOf(isConstexpr(), isStaticStorageClass())); + auto NumericLiteral = anyOf(integerLiteral(), floatLiteral()); + auto UnaryNumericLiteral = unaryOperator(hasAnyOperatorName("+", "-"), + hasUnaryOperand(NumericLiteral)); + + auto ConstExprRef = varDecl(anyOf(isConstexpr(), isStaticStorageClass())); + auto ImmutableRef = + declRefExpr(to(decl(anyOf(enumConstantDecl(), ConstExprRef)))); + + auto BinaryNumericExpr = binaryOperator( + hasOperands(anyOf(NumericLiteral, ImmutableRef, binaryOperator()), + anyOf(NumericLiteral, ImmutableRef, binaryOperator()))); auto InitBase = - anyOf(stringLiteral(), characterLiteral(), integerLiteral(), - unaryOperator(hasAnyOperatorName("+", "-"), - hasUnaryOperand(integerLiteral())), - floatLiteral(), - unaryOperator(hasAnyOperatorName("+", "-"), - hasUnaryOperand(floatLiteral())), - cxxBoolLiteral(), cxxNullPtrLiteralExpr(), implicitValueInitExpr(), - declRefExpr(to(anyOf(enumConstantDecl(), ConstExpRef)))); + anyOf(stringLiteral(), characterLiteral(), NumericLiteral, + UnaryNumericLiteral, cxxBoolLiteral(), cxxNullPtrLiteralExpr(), + implicitValueInitExpr(), ImmutableRef, BinaryNumericExpr); auto ExplicitCastExpr = castExpr(hasSourceExpression(InitBase)); auto InitMatcher = anyOf(InitBase, ExplicitCastExpr); diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 6cb8d572d3a78..f0021696f799c 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -165,7 +165,7 @@ Changes in existing checks - Improved :doc:`modernize-use-default-member-init <clang-tidy/checks/modernize/use-default-member-init>` check by matching - ``constexpr`` and ``static``` values on member initialization and by detecting + arithmetic operations, ``constexpr`` and ``static`` values, and detecting explicit casting of built-in types within member list initialization. - Improved :doc:`modernize-use-ranges 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 cac50be9e4368..bb2a7388e75f1 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 @@ -572,4 +572,27 @@ class FunctionalCastInit { // CHECK-FIXES: double c{double('C')}; }; +#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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits