Skip to content

Commit 5e65b40

Browse files
authored
[clang-tidy] detect explicit casting within modernize-use-default-member-init (llvm#129408)
This aims to fix a portion of llvm#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
1 parent d6fbffa commit 5e65b40

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ static bool sameValue(const Expr *E1, const Expr *E2) {
176176
cast<StringLiteral>(E2)->getString();
177177
case Stmt::DeclRefExprClass:
178178
return cast<DeclRefExpr>(E1)->getDecl() == cast<DeclRefExpr>(E2)->getDecl();
179+
case Stmt::CStyleCastExprClass:
180+
case Stmt::CXXStaticCastExprClass:
181+
case Stmt::CXXFunctionalCastExprClass:
182+
return sameValue(cast<ExplicitCastExpr>(E1)->getSubExpr(),
183+
cast<ExplicitCastExpr>(E2)->getSubExpr());
179184
default:
180185
return false;
181186
}
@@ -206,10 +211,13 @@ void UseDefaultMemberInitCheck::registerMatchers(MatchFinder *Finder) {
206211
cxxBoolLiteral(), cxxNullPtrLiteralExpr(), implicitValueInitExpr(),
207212
declRefExpr(to(anyOf(enumConstantDecl(), ConstExpRef))));
208213

214+
auto ExplicitCastExpr = castExpr(hasSourceExpression(InitBase));
215+
auto InitMatcher = anyOf(InitBase, ExplicitCastExpr);
216+
209217
auto Init =
210-
anyOf(initListExpr(anyOf(allOf(initCountIs(1), hasInit(0, InitBase)),
218+
anyOf(initListExpr(anyOf(allOf(initCountIs(1), hasInit(0, InitMatcher)),
211219
initCountIs(0), hasType(arrayType()))),
212-
InitBase);
220+
InitBase, ExplicitCastExpr);
213221

214222
Finder->addMatcher(
215223
cxxConstructorDecl(forEachConstructorInitializer(

clang-tools-extra/docs/ReleaseNotes.rst

+2-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ Changes in existing checks
159159

160160
- Improved :doc:`modernize-use-default-member-init
161161
<clang-tidy/checks/modernize/use-default-member-init>` check by matching
162-
``constexpr`` and ``static`` values on member initialization.
162+
``constexpr`` and ``static``` values on member initialization and by detecting
163+
explicit casting of built-in types within member list initialization.
163164

164165
- Improved :doc:`modernize-use-ranges
165166
<clang-tidy/checks/modernize/use-ranges>` check by updating suppress

clang-tools-extra/test/clang-tidy/checkers/modernize/use-default-member-init.cpp

+36
Original file line numberDiff line numberDiff line change
@@ -536,4 +536,40 @@ namespace PR122480 {
536536
// CHECK-FIXES: int b{STATIC_VAL};
537537
};
538538

539+
class CStyleCastInit {
540+
CStyleCastInit() : a{(int)1.23}, b{(float)42}, c{(double)'C'} {}
541+
// CHECK-MESSAGES: :[[@LINE-1]]:50: warning: member initializer for 'c' is redundant [modernize-use-default-member-init]
542+
// CHECK-FIXES: CStyleCastInit() {}
543+
544+
int a;
545+
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'a' [modernize-use-default-member-init]
546+
// CHECK-FIXES: int a{(int)1.23};
547+
float b;
548+
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use default member initializer for 'b' [modernize-use-default-member-init]
549+
// CHECK-FIXES: float b{(float)42};
550+
double c{(double)'C'};
551+
};
552+
553+
class StaticCastInit {
554+
StaticCastInit() : m(static_cast<int>(9.99)), n(static_cast<char>(65)) {}
555+
// CHECK-MESSAGES: :[[@LINE-1]]:49: warning: member initializer for 'n' is redundant [modernize-use-default-member-init]
556+
// CHECK-FIXES: StaticCastInit() {}
557+
int m;
558+
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'm' [modernize-use-default-member-init]
559+
// CHECK-FIXES: int m{static_cast<int>(9.99)};
560+
char n{static_cast<char>(65)};
561+
};
562+
563+
class FunctionalCastInit {
564+
FunctionalCastInit() : a(int(5.67)), b(float(2)), c(double('C')) {}
565+
// CHECK-MESSAGES: :[[@LINE-1]]:40: warning: member initializer for 'b' is redundant [modernize-use-default-member-init]
566+
int a;
567+
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'a' [modernize-use-default-member-init]
568+
// CHECK-FIXES: int a{int(5.67)};
569+
float b{float(2)};
570+
double c;
571+
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'c' [modernize-use-default-member-init]
572+
// CHECK-FIXES: double c{double('C')};
573+
};
574+
539575
} //namespace PR122480

0 commit comments

Comments
 (0)