Author: David Rivera
Date: 2025-03-15T23:15:12+01:00
New Revision: 5e65b40f9c0fd9fc9bc17c36dbd5ee1beec15d4f

URL: 
https://github.com/llvm/llvm-project/commit/5e65b40f9c0fd9fc9bc17c36dbd5ee1beec15d4f
DIFF: 
https://github.com/llvm/llvm-project/commit/5e65b40f9c0fd9fc9bc17c36dbd5ee1beec15d4f.diff

LOG: [clang-tidy] detect explicit casting within 
modernize-use-default-member-init (#129408)

This aims to fix a portion of #122480. Added some matchers to detect
explicit casting which utilize builtin types as its source expression.
these are the various forms of casting supported I thought would useful
for this check:

- C Style explicit casting
- Static explicit casting
- Functional explicit casting

Added: 
    

Modified: 
    clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp
    clang-tools-extra/docs/ReleaseNotes.rst
    
clang-tools-extra/test/clang-tidy/checkers/modernize/use-default-member-init.cpp

Removed: 
    


################################################################################
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 0ad52f83fad85..eaf37e746050e 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -159,7 +159,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:`modernize-use-ranges
   <clang-tidy/checks/modernize/use-ranges>` check by updating suppress 

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

Reply via email to