[clang-tools-extra] [clang-tidy] detect explicit casting within modernize-use-default-member-init (PR #129408)
David Rivera via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 12 16:05:57 PDT 2025
https://github.com/RiverDave updated https://github.com/llvm/llvm-project/pull/129408
>From a06de0100d34d3f18b8eca690161b3720620f4af Mon Sep 17 00:00:00 2001
From: David Rivera <davidriverg at gmail.com>
Date: Sat, 1 Mar 2025 19:22:25 -0500
Subject: [PATCH] [clang-tidy] detect explicit casting within
modernize-use-default-member-init
---
.../modernize/UseDefaultMemberInitCheck.cpp | 12 +++++--
clang-tools-extra/docs/ReleaseNotes.rst | 3 +-
.../modernize/use-default-member-init.cpp | 36 +++++++++++++++++++
3 files changed, 48 insertions(+), 3 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp
index 5b0b9b59d4e3b..bf99c738da1a3 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp
@@ -176,6 +176,11 @@ static bool sameValue(const Expr *E1, const Expr *E2) {
cast<StringLiteral>(E2)->getString();
case Stmt::DeclRefExprClass:
return cast<DeclRefExpr>(E1)->getDecl() == cast<DeclRefExpr>(E2)->getDecl();
+ case Stmt::CStyleCastExprClass:
+ case Stmt::CXXStaticCastExprClass:
+ case Stmt::CXXFunctionalCastExprClass:
+ return sameValue(cast<ExplicitCastExpr>(E1)->getSubExpr(),
+ cast<ExplicitCastExpr>(E2)->getSubExpr());
default:
return false;
}
@@ -206,10 +211,13 @@ void UseDefaultMemberInitCheck::registerMatchers(MatchFinder *Finder) {
cxxBoolLiteral(), cxxNullPtrLiteralExpr(), implicitValueInitExpr(),
declRefExpr(to(anyOf(enumConstantDecl(), ConstExpRef))));
+ auto ExplicitCastExpr = castExpr(hasSourceExpression(InitBase));
+ auto InitMatcher = anyOf(InitBase, ExplicitCastExpr);
+
auto Init =
- anyOf(initListExpr(anyOf(allOf(initCountIs(1), hasInit(0, InitBase)),
+ anyOf(initListExpr(anyOf(allOf(initCountIs(1), hasInit(0, InitMatcher)),
initCountIs(0), hasType(arrayType()))),
- InitBase);
+ InitBase, ExplicitCastExpr);
Finder->addMatcher(
cxxConstructorDecl(forEachConstructorInitializer(
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 110f949741c3f..58d43ab43dbcc 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -156,7 +156,8 @@ 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.
+ ``constexpr`` and ``static``` values on member initialization and by detecting
+ explicit casting of built-in types within member list initialization.
- Improved :doc:`performance/unnecessary-value-param
<clang-tidy/checks/performance/unnecessary-value-param>` check performance by
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 8b9bfaf0df34f..cac50be9e4368 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
@@ -536,4 +536,40 @@ namespace PR122480 {
// CHECK-FIXES: int b{STATIC_VAL};
};
+class CStyleCastInit {
+ CStyleCastInit() : a{(int)1.23}, b{(float)42}, c{(double)'C'} {}
+ // CHECK-MESSAGES: :[[@LINE-1]]:50: warning: member initializer for 'c' is redundant [modernize-use-default-member-init]
+ // CHECK-FIXES: CStyleCastInit() {}
+
+ int a;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'a' [modernize-use-default-member-init]
+ // CHECK-FIXES: int a{(int)1.23};
+ float b;
+ // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use default member initializer for 'b' [modernize-use-default-member-init]
+ // CHECK-FIXES: float b{(float)42};
+ double c{(double)'C'};
+};
+
+class StaticCastInit {
+ StaticCastInit() : m(static_cast<int>(9.99)), n(static_cast<char>(65)) {}
+ // CHECK-MESSAGES: :[[@LINE-1]]:49: warning: member initializer for 'n' is redundant [modernize-use-default-member-init]
+ // CHECK-FIXES: StaticCastInit() {}
+ int m;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'm' [modernize-use-default-member-init]
+ // CHECK-FIXES: int m{static_cast<int>(9.99)};
+ char n{static_cast<char>(65)};
+};
+
+class FunctionalCastInit {
+ FunctionalCastInit() : a(int(5.67)), b(float(2)), c(double('C')) {}
+ // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: member initializer for 'b' is redundant [modernize-use-default-member-init]
+ int a;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'a' [modernize-use-default-member-init]
+ // CHECK-FIXES: int a{int(5.67)};
+ float b{float(2)};
+ double c;
+ // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'c' [modernize-use-default-member-init]
+ // CHECK-FIXES: double c{double('C')};
+};
+
} //namespace PR122480
More information about the cfe-commits
mailing list