[clang-tools-extra] [clang-tidy] detect arithmetic operations within member list initialization in modernize-use-default-member-init check (PR #129370)
David Rivera via cfe-commits
cfe-commits at lists.llvm.org
Sat Mar 22 10:59:32 PDT 2025
https://github.com/RiverDave updated https://github.com/llvm/llvm-project/pull/129370
>From 4e5e44c721e1867b9263d0a0ea4669d0bd3bdd4a Mon Sep 17 00:00:00 2001
From: David Rivera <davidriverg at 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 ed7da975f3de7..7d9a6039ea5cb 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -168,7 +168,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
More information about the cfe-commits
mailing list