=?utf-8?q?Balázs_Kéri?= <balazs.k...@ericsson.com>, =?utf-8?q?Balázs_Kéri?= <balazs.k...@ericsson.com>, =?utf-8?q?Balázs_Kéri?= <balazs.k...@ericsson.com>, =?utf-8?q?Balázs_Kéri?= <balazs.k...@ericsson.com>, =?utf-8?q?Balázs_Kéri?= <balazs.k...@ericsson.com>, =?utf-8?q?Balázs_Kéri?= <balazs.k...@ericsson.com>, =?utf-8?q?Balázs_Kéri?= <balazs.k...@ericsson.com>, =?utf-8?q?Balázs_Kéri?= <balazs.k...@ericsson.com> Message-ID: In-Reply-To: <llvm.org/llvm/llvm-project/pull/140...@github.com>
================ @@ -0,0 +1,147 @@ +//===--- VisibilityChangeToVirtualFunctionCheck.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 "VisibilityChangeToVirtualFunctionCheck.h" +#include "../utils/Matchers.h" +#include "../utils/OptionsUtils.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; +using namespace clang; + +namespace { +AST_MATCHER(NamedDecl, isOperatorDecl) { + DeclarationName::NameKind NK = Node.getDeclName().getNameKind(); + return NK != DeclarationName::Identifier && + NK != DeclarationName::CXXConstructorName && + NK != DeclarationName::CXXDestructorName; +} +} // namespace + +namespace clang::tidy { + +template <> +struct OptionEnumMapping< + misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind> { + static llvm::ArrayRef<std::pair< + misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind, StringRef>> + getEnumMapping() { + static constexpr std::pair< + misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind, StringRef> + Mapping[] = { + {misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind::Any, + "any"}, + {misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind::Widening, + "widening"}, + {misc::VisibilityChangeToVirtualFunctionCheck::ChangeKind:: + Narrowing, + "narrowing"}, + }; + return {Mapping}; + } +}; + +namespace misc { + +VisibilityChangeToVirtualFunctionCheck::VisibilityChangeToVirtualFunctionCheck( + StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + DetectVisibilityChange( + Options.get("DisallowedVisibilityChange", ChangeKind::Any)), + CheckDestructors(Options.get("CheckDestructors", false)), + CheckOperators(Options.get("CheckOperators", false)), + IgnoredFunctions(utils::options::parseStringList( + Options.get("IgnoredFunctions", ""))) {} + +void VisibilityChangeToVirtualFunctionCheck::storeOptions( + ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "DisallowedVisibilityChange", DetectVisibilityChange); + Options.store(Opts, "CheckDestructors", CheckDestructors); + Options.store(Opts, "CheckOperators", CheckOperators); + Options.store(Opts, "IgnoredFunctions", + utils::options::serializeStringList(IgnoredFunctions)); +} + +void VisibilityChangeToVirtualFunctionCheck::registerMatchers( + MatchFinder *Finder) { + auto IgnoredDecl = + namedDecl(matchers::matchesAnyListedName(IgnoredFunctions)); + auto FilterDestructors = + CheckDestructors ? decl() : decl(unless(cxxDestructorDecl())); + auto FilterOperators = + CheckOperators ? namedDecl() : namedDecl(unless(isOperatorDecl())); + Finder->addMatcher( + cxxMethodDecl( + isVirtual(), FilterDestructors, FilterOperators, + ofClass( + cxxRecordDecl(unless(isExpansionInSystemHeader())).bind("class")), + forEachOverridden(cxxMethodDecl(ofClass(cxxRecordDecl().bind("base")), + unless(IgnoredDecl)) + .bind("base_func"))) + .bind("func"), + this); +} + +void VisibilityChangeToVirtualFunctionCheck::check( + const MatchFinder::MatchResult &Result) { + const auto *MatchedFunction = Result.Nodes.getNodeAs<FunctionDecl>("func"); + if (!MatchedFunction->isCanonicalDecl()) + return; + + const auto *ParentClass = Result.Nodes.getNodeAs<CXXRecordDecl>("class"); + const auto *OverriddenFunction = + Result.Nodes.getNodeAs<FunctionDecl>("base_func"); + const auto *BaseClass = Result.Nodes.getNodeAs<CXXRecordDecl>("base"); + + AccessSpecifier ActualAccess = MatchedFunction->getAccess(); + AccessSpecifier OverriddenAccess = OverriddenFunction->getAccess(); ---------------- PiotrZSL wrote: move to line 107, same with line 97 https://github.com/llvm/llvm-project/pull/140086 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits