================ @@ -0,0 +1,114 @@ +//===--- InvalidEnumDefaultInitializationCheck.cpp - clang-tidy -----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "InvalidEnumDefaultInitializationCheck.h" +// #include "../utils/Matchers.h" +// #include "../utils/OptionsUtils.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include <algorithm> + +using namespace clang::ast_matchers; + +namespace clang::tidy::bugprone { + +namespace { + +AST_MATCHER(EnumDecl, isCompleteAndHasNoZeroValue) { + const EnumDecl *Definition = Node.getDefinition(); + return Definition && Node.isComplete() && + std::none_of(Definition->enumerator_begin(), + Definition->enumerator_end(), + [](const EnumConstantDecl *Value) { + return Value->getInitVal().isZero(); + }); +} + +AST_MATCHER(Expr, isEmptyInit) { + if (isa<CXXScalarValueInitExpr>(&Node)) + return true; + if (isa<ImplicitValueInitExpr>(&Node)) + return true; + if (const auto *Init = dyn_cast<InitListExpr>(&Node)) + return Init->getNumInits() == 0; + return false; +} + +} // namespace + +InvalidEnumDefaultInitializationCheck::InvalidEnumDefaultInitializationCheck( + StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + +bool InvalidEnumDefaultInitializationCheck::isLanguageVersionSupported( + const LangOptions &LangOpts) const { + return LangOpts.CPlusPlus; +} + +void InvalidEnumDefaultInitializationCheck::registerMatchers( + MatchFinder *Finder) { + Finder->addMatcher( + expr(isEmptyInit(), + hasType(hasUnqualifiedDesugaredType(enumType(hasDeclaration( + enumDecl(isCompleteAndHasNoZeroValue()).bind("enum")))))) + .bind("expr"), + this); +} + +void InvalidEnumDefaultInitializationCheck::check( + const MatchFinder::MatchResult &Result) { + const auto *InitExpr = Result.Nodes.getNodeAs<Expr>("expr"); + const auto *Enum = Result.Nodes.getNodeAs<EnumDecl>("enum"); + if (!InitExpr || !Enum) + return; + + ASTContext &ACtx = Enum->getASTContext(); ---------------- balazske wrote:
`getParents` requires it to be non-const. https://github.com/llvm/llvm-project/pull/136823 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits