10 #include "../utils/Matchers.h" 11 #include "clang/AST/ASTContext.h" 12 #include "clang/ASTMatchers/ASTMatchFinder.h" 13 #include "clang/Lex/Lexer.h" 21 namespace readability {
24 Options.store(Opts,
"IgnoreBaseInCopyConstructors",
25 IgnoreBaseInCopyConstructors);
28 void RedundantMemberInitCheck::registerMatchers(MatchFinder *Finder) {
29 if (!getLangOpts().CPlusPlus)
34 hasDeclaration(cxxConstructorDecl(hasParent(
40 unless(isDelegatingConstructor()),
42 anyOf(isUnion(), ast_matchers::isTemplateInstantiation()))),
43 forEachConstructorInitializer(
45 isWritten(), withInitializer(ignoringImplicit(Construct)),
46 unless(forField(hasType(isConstQualified()))),
47 unless(forField(hasParent(recordDecl(isUnion())))))
53 void RedundantMemberInitCheck::check(
const MatchFinder::MatchResult &Result) {
54 const auto *Init = Result.Nodes.getNodeAs<CXXCtorInitializer>(
"init");
55 const auto *Construct = Result.Nodes.getNodeAs<CXXConstructExpr>(
"construct");
56 const auto *ConstructorDecl =
57 Result.Nodes.getNodeAs<CXXConstructorDecl>(
"constructor");
59 if (IgnoreBaseInCopyConstructors && ConstructorDecl->isCopyConstructor() &&
60 Init->isBaseInitializer())
63 if (Construct->getNumArgs() == 0 ||
64 Construct->getArg(0)->isDefaultArgument()) {
65 if (Init->isAnyMemberInitializer()) {
66 diag(Init->getSourceLocation(),
"initializer for member %0 is redundant")
67 << Init->getAnyMember()
68 << FixItHint::CreateRemoval(Init->getSourceRange());
70 diag(Init->getSourceLocation(),
71 "initializer for base class %0 is redundant")
72 << Construct->getType()
73 << FixItHint::CreateRemoval(Init->getSourceRange());
bool isTriviallyDefaultConstructible(QualType Type, const ASTContext &Context)
Returns true if Type is trivially default constructible.
std::map< std::string, std::string > OptionMap
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//