mirror of
https://github.com/intel/llvm.git
synced 2026-01-17 23:25:14 +08:00
[clang-tidy] Fix handling of members in readability-redundant-member-init (#93217)
Compare class type instead of just assuming that called constructor belong to same class. Fixes #91605
This commit is contained in:
@@ -41,25 +41,35 @@ void RedundantMemberInitCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
|
||||
|
||||
void RedundantMemberInitCheck::registerMatchers(MatchFinder *Finder) {
|
||||
auto ConstructorMatcher =
|
||||
cxxConstructExpr(argumentCountIs(0),
|
||||
hasDeclaration(cxxConstructorDecl(ofClass(cxxRecordDecl(
|
||||
unless(isTriviallyDefaultConstructible()))))))
|
||||
cxxConstructExpr(
|
||||
argumentCountIs(0),
|
||||
hasDeclaration(cxxConstructorDecl(
|
||||
ofClass(cxxRecordDecl(unless(isTriviallyDefaultConstructible()))
|
||||
.bind("class")))))
|
||||
.bind("construct");
|
||||
|
||||
auto HasUnionAsParent = hasParent(recordDecl(isUnion()));
|
||||
|
||||
auto HasTypeEqualToConstructorClass = hasType(qualType(
|
||||
hasCanonicalType(qualType(hasDeclaration(equalsBoundNode("class"))))));
|
||||
|
||||
Finder->addMatcher(
|
||||
cxxConstructorDecl(
|
||||
unless(isDelegatingConstructor()), ofClass(unless(isUnion())),
|
||||
forEachConstructorInitializer(
|
||||
cxxCtorInitializer(withInitializer(ConstructorMatcher),
|
||||
unless(forField(fieldDecl(
|
||||
anyOf(hasType(isConstQualified()),
|
||||
hasParent(recordDecl(isUnion())))))))
|
||||
cxxCtorInitializer(
|
||||
withInitializer(ConstructorMatcher),
|
||||
anyOf(isBaseInitializer(),
|
||||
forField(fieldDecl(unless(hasType(isConstQualified())),
|
||||
unless(HasUnionAsParent),
|
||||
HasTypeEqualToConstructorClass))))
|
||||
.bind("init")))
|
||||
.bind("constructor"),
|
||||
this);
|
||||
|
||||
Finder->addMatcher(fieldDecl(hasInClassInitializer(ConstructorMatcher),
|
||||
unless(hasParent(recordDecl(isUnion()))))
|
||||
HasTypeEqualToConstructorClass,
|
||||
unless(HasUnionAsParent))
|
||||
.bind("field"),
|
||||
this);
|
||||
}
|
||||
|
||||
@@ -403,6 +403,11 @@ Changes in existing checks
|
||||
<clang-tidy/checks/readability/redundant-inline-specifier>` check to properly
|
||||
emit warnings for static data member with an in-class initializer.
|
||||
|
||||
- Improved :doc:`readability-redundant-member-init
|
||||
<clang-tidy/checks/readability/redundant-member-init>` check to avoid
|
||||
false-positives when type of the member does not match the type of the
|
||||
initializer.
|
||||
|
||||
- Improved :doc:`readability-static-accessed-through-instance
|
||||
<clang-tidy/checks/readability/static-accessed-through-instance>` check to
|
||||
support calls to overloaded operators as base expression and provide fixes to
|
||||
|
||||
@@ -302,3 +302,19 @@ struct D7 {
|
||||
|
||||
D7<int> d7i;
|
||||
D7<S> d7s;
|
||||
|
||||
struct SS {
|
||||
SS() = default;
|
||||
SS(S s) : s(s) {}
|
||||
|
||||
S s;
|
||||
};
|
||||
|
||||
struct D8 {
|
||||
SS ss = S();
|
||||
};
|
||||
|
||||
struct D9 {
|
||||
D9() : ss(S()) {}
|
||||
SS ss;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user