94 MatchFinder *Finder) {
95 auto EnumWithoutZeroValue = enumType(
96 hasDeclaration(enumDecl(isCompleteAndHasNoZeroValue()).bind(
"enum")));
97 auto EnumOrArrayOfEnum = qualType(hasUnqualifiedDesugaredType(
98 anyOf(EnumWithoutZeroValue,
99 arrayType(hasElementType(qualType(
100 hasUnqualifiedDesugaredType(EnumWithoutZeroValue)))))));
102 expr(isEmptyInit(), hasType(EnumOrArrayOfEnum)).bind(
"expr"),
this);
110 Finder->addMatcher(initListExpr(hasArrayFiller()).bind(
"array_filler_expr"),
115 const MatchFinder::MatchResult &Result) {
116 const auto *InitExpr = Result.Nodes.getNodeAs<Expr>(
"expr");
117 const auto *Enum = Result.Nodes.getNodeAs<EnumDecl>(
"enum");
119 const auto *InitList =
120 Result.Nodes.getNodeAs<InitListExpr>(
"array_filler_expr");
124 FindEnumMember Finder;
125 if (!Finder.Visit(InitList->getArrayFiller()->getType().getTypePtr()))
128 Enum = Finder.FoundEnum->getOriginalDecl();
131 if (!InitExpr || !Enum)
134 ASTContext &ACtx = Enum->getASTContext();
135 SourceLocation Loc = InitExpr->getExprLoc();
136 if (Loc.isInvalid()) {
137 if (isa<ImplicitValueInitExpr, InitListExpr>(InitExpr)) {
138 DynTypedNodeList Parents = ACtx.getParents(*InitExpr);
142 if (
const auto *Ctor = Parents[0].get<CXXConstructorDecl>()) {
145 CXXCtorInitializer *
const *CtorInit = std::find_if(
146 Ctor->init_begin(), Ctor->init_end(),
147 [InitExpr](
const CXXCtorInitializer *Init) {
148 return Init->isMemberInitializer() && Init->getInit() == InitExpr;
152 Loc = (*CtorInit)->getLParenLoc();
153 }
else if (
const auto *InitList = Parents[0].get<InitListExpr>()) {
156 while (InitList->getExprLoc().isInvalid()) {
157 DynTypedNodeList Parents = ACtx.getParents(*InitList);
160 InitList = Parents[0].get<InitListExpr>();
164 Loc = InitList->getExprLoc();
173 diag(Loc,
"enum value of type %0 initialized with invalid value of 0, "
174 "enum doesn't have a zero-value enumerator")
176 diag(Enum->getLocation(),
"enum is defined here", DiagnosticIDs::Note);
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.