Skip to content

Commit 65cd10b

Browse files
committed
[clang-tidy] detect explicit casting within modernize-use-default-member-init
1 parent 83d2c68 commit 65cd10b

File tree

3 files changed

+64
-9
lines changed

3 files changed

+64
-9
lines changed

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

Lines changed: 20 additions & 9 deletions
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
}
@@ -194,15 +199,21 @@ void UseDefaultMemberInitCheck::storeOptions(
194199
}
195200

196201
void UseDefaultMemberInitCheck::registerMatchers(MatchFinder *Finder) {
197-
auto InitBase =
198-
anyOf(stringLiteral(), characterLiteral(), integerLiteral(),
199-
unaryOperator(hasAnyOperatorName("+", "-"),
200-
hasUnaryOperand(integerLiteral())),
201-
floatLiteral(),
202-
unaryOperator(hasAnyOperatorName("+", "-"),
203-
hasUnaryOperand(floatLiteral())),
204-
cxxBoolLiteral(), cxxNullPtrLiteralExpr(), implicitValueInitExpr(),
205-
declRefExpr(to(enumConstantDecl())));
202+
203+
auto ExplicitCastExpr = castExpr(hasSourceExpression(anyOf(
204+
unaryOperator(hasAnyOperatorName("+", "-"),
205+
hasUnaryOperand(anyOf(integerLiteral(), floatLiteral()))),
206+
integerLiteral(), floatLiteral(), characterLiteral())));
207+
208+
auto InitBase = anyOf(
209+
stringLiteral(), characterLiteral(), integerLiteral(), ExplicitCastExpr,
210+
unaryOperator(hasAnyOperatorName("+", "-"),
211+
hasUnaryOperand(integerLiteral())),
212+
floatLiteral(),
213+
unaryOperator(hasAnyOperatorName("+", "-"),
214+
hasUnaryOperand(floatLiteral())),
215+
cxxBoolLiteral(), cxxNullPtrLiteralExpr(), implicitValueInitExpr(),
216+
declRefExpr(to(enumConstantDecl())));
206217

207218
auto Init =
208219
anyOf(initListExpr(anyOf(allOf(initCountIs(1), hasInit(0, InitBase)),

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ Changes in existing checks
128128
<clang-tidy/checks/misc/redundant-expression>` check by providing additional
129129
examples and fixing some macro related false positives.
130130

131+
- Improved :doc:`modernize-use-default-member-init
132+
<clang-tidy/checks/modernize/use-default-member-init>` check by detecting
133+
explicit casting of built-in types within member list initialization.
134+
131135
- Improved :doc:`performance/unnecessary-value-param
132136
<clang-tidy/checks/performance/unnecessary-value-param>` check performance by
133137
tolerating fix-it breaking compilation when functions is used as pointers

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,3 +518,43 @@ class ArrayBraceInitMultipleValues {
518518
};
519519

520520
} // namespace PR63285
521+
522+
namespace PR63285 {
523+
524+
class CStyleCastInit {
525+
CStyleCastInit() : a{(int)1.23}, b{(float)42}, c{(double)'C'} {}
526+
// CHECK-MESSAGES: :[[@LINE-1]]:50: warning: member initializer for 'c' is redundant [modernize-use-default-member-init]
527+
// CHECK-FIXES: CStyleCastInit() {}
528+
529+
int a;
530+
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'a' [modernize-use-default-member-init]
531+
// CHECK-FIXES: int a{(int)1.23};
532+
float b;
533+
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use default member initializer for 'b' [modernize-use-default-member-init]
534+
// CHECK-FIXES: float b{(float)42};
535+
double c{(double)'C'};
536+
};
537+
538+
class StaticCastInit {
539+
StaticCastInit() : m(static_cast<int>(9.99)), n(static_cast<char>(65)) {}
540+
// CHECK-MESSAGES: :[[@LINE-1]]:49: warning: member initializer for 'n' is redundant [modernize-use-default-member-init]
541+
// CHECK-FIXES: StaticCastInit() {}
542+
int m;
543+
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'm' [modernize-use-default-member-init]
544+
// CHECK-FIXES: int m{static_cast<int>(9.99)};
545+
char n{static_cast<char>(65)};
546+
};
547+
548+
class FunctionalCastInit {
549+
FunctionalCastInit() : a(int(5.67)), b(float(2)), c(double('C')) {}
550+
// CHECK-MESSAGES: :[[@LINE-1]]:40: warning: member initializer for 'b' is redundant [modernize-use-default-member-init]
551+
int a;
552+
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'a' [modernize-use-default-member-init]
553+
// CHECK-FIXES: int a{int(5.67)};
554+
float b{float(2)};
555+
double c;
556+
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'c' [modernize-use-default-member-init]
557+
// CHECK-FIXES: double c{double('C')};
558+
};
559+
560+
} //namespace PR63285

0 commit comments

Comments
 (0)