23 const LangOptions &LangOpts) {
24 const std::optional<Token> PrevToken =
29 if (PrevToken->isNot(tok::equal))
30 return {PrevToken->getEndLoc(), Range.getEnd()};
33 {PrevToken->getLocation(), Range.getEnd()}, SM, LangOpts);
63 auto ConstructorMatcher =
66 hasDeclaration(cxxConstructorDecl(
67 ofClass(cxxRecordDecl(unless(isTriviallyDefaultConstructible()))
70 ? unless(initListContainsMacro())
71 :
static_cast<ast_matchers::internal::Matcher<CXXConstructExpr>
>(
75 auto HasUnionAsParent = hasParent(recordDecl(isUnion()));
77 auto HasTypeEqualToConstructorClass = hasType(qualType(
78 hasCanonicalType(qualType(hasDeclaration(equalsBoundNode(
"class"))))));
82 unless(isDelegatingConstructor()), ofClass(unless(isUnion())),
83 forEachConstructorInitializer(
85 withInitializer(ConstructorMatcher),
86 anyOf(isBaseInitializer(),
87 forField(fieldDecl(unless(hasType(isConstQualified())),
88 unless(HasUnionAsParent),
89 HasTypeEqualToConstructorClass))))
94 Finder->addMatcher(fieldDecl(hasInClassInitializer(ConstructorMatcher),
95 HasTypeEqualToConstructorClass,
96 unless(HasUnionAsParent))
102 const auto *Construct = Result.Nodes.getNodeAs<CXXConstructExpr>(
"construct");
104 if (
const auto *Field = Result.Nodes.getNodeAs<FieldDecl>(
"field")) {
105 const Expr *Init = Field->getInClassInitializer();
107 diag(Construct->getExprLoc(),
"initializer for member %0 is redundant")
109 if (!Init->getBeginLoc().isMacroID() && !Init->getEndLoc().isMacroID())
111 Init->getSourceRange(), *Result.SourceManager, getLangOpts()));
115 const auto *Init = Result.Nodes.getNodeAs<CXXCtorInitializer>(
"init");
116 const auto *ConstructorDecl =
117 Result.Nodes.getNodeAs<CXXConstructorDecl>(
"constructor");
119 if (IgnoreBaseInCopyConstructors && ConstructorDecl->isCopyConstructor() &&
120 Init->isBaseInitializer())
123 if (Init->isAnyMemberInitializer()) {
124 diag(Init->getSourceLocation(),
"initializer for member %0 is redundant")
125 << Init->getAnyMember()
126 << FixItHint::CreateRemoval(Init->getSourceRange());
128 diag(Init->getSourceLocation(),
129 "initializer for base class %0 is redundant")
130 << Construct->getType()
131 << FixItHint::CreateRemoval(Init->getSourceRange());
std::optional< Token > getPreviousToken(SourceLocation Location, const SourceManager &SM, const LangOptions &LangOpts, bool SkipComments)
Returns previous token or std::nullopt if not found.