23 const LangOptions &LangOpts) {
24 const Token PrevToken =
26 if (PrevToken.is(tok::unknown))
29 if (PrevToken.isNot(tok::equal))
30 return {PrevToken.getEndLoc(), Range.getEnd()};
33 {PrevToken.getLocation(), Range.getEnd()}, SM, LangOpts);
42 auto ConstructorMatcher =
45 hasDeclaration(cxxConstructorDecl(
46 ofClass(cxxRecordDecl(unless(isTriviallyDefaultConstructible()))
50 auto HasUnionAsParent = hasParent(recordDecl(isUnion()));
52 auto HasTypeEqualToConstructorClass = hasType(qualType(
53 hasCanonicalType(qualType(hasDeclaration(equalsBoundNode(
"class"))))));
57 unless(isDelegatingConstructor()), ofClass(unless(isUnion())),
58 forEachConstructorInitializer(
60 withInitializer(ConstructorMatcher),
61 anyOf(isBaseInitializer(),
62 forField(fieldDecl(unless(hasType(isConstQualified())),
63 unless(HasUnionAsParent),
64 HasTypeEqualToConstructorClass))))
69 Finder->addMatcher(fieldDecl(hasInClassInitializer(ConstructorMatcher),
70 HasTypeEqualToConstructorClass,
71 unless(HasUnionAsParent))
77 const auto *Construct = Result.Nodes.getNodeAs<CXXConstructExpr>(
"construct");
79 if (
const auto *Field = Result.Nodes.getNodeAs<FieldDecl>(
"field")) {
80 const Expr *Init = Field->getInClassInitializer();
81 diag(Construct->getExprLoc(),
"initializer for member %0 is redundant")
84 Init->getSourceRange(), *Result.SourceManager, getLangOpts()));
88 const auto *Init = Result.Nodes.getNodeAs<CXXCtorInitializer>(
"init");
89 const auto *ConstructorDecl =
90 Result.Nodes.getNodeAs<CXXConstructorDecl>(
"constructor");
92 if (IgnoreBaseInCopyConstructors && ConstructorDecl->isCopyConstructor() &&
93 Init->isBaseInitializer())
96 if (Init->isAnyMemberInitializer()) {
97 diag(Init->getSourceLocation(),
"initializer for member %0 is redundant")
98 << Init->getAnyMember()
99 << FixItHint::CreateRemoval(Init->getSourceRange());
101 diag(Init->getSourceLocation(),
102 "initializer for base class %0 is redundant")
103 << Construct->getType()
104 << FixItHint::CreateRemoval(Init->getSourceRange());
Token getPreviousToken(SourceLocation Location, const SourceManager &SM, const LangOptions &LangOpts, bool SkipComments)
Returns previous token or tok::unknown if not found.