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 <davidriv...@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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits