163b57db3SJulie Hockett //===--- VirtualInheritanceCheck.cpp - clang-tidy--------------------------===// 263b57db3SJulie Hockett // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 663b57db3SJulie Hockett // 763b57db3SJulie Hockett //===----------------------------------------------------------------------===// 863b57db3SJulie Hockett 963b57db3SJulie Hockett #include "VirtualInheritanceCheck.h" 1063b57db3SJulie Hockett #include "clang/AST/ASTContext.h" 1163b57db3SJulie Hockett #include "clang/ASTMatchers/ASTMatchFinder.h" 1263b57db3SJulie Hockett 1363b57db3SJulie Hockett using namespace clang::ast_matchers; 1463b57db3SJulie Hockett 15*7d2ea6c4SCarlos Galvez namespace clang::tidy::fuchsia { 1663b57db3SJulie Hockett 17f8c99297SBenjamin Kramer namespace { AST_MATCHER(CXXRecordDecl,hasDirectVirtualBaseClass)1863b57db3SJulie HockettAST_MATCHER(CXXRecordDecl, hasDirectVirtualBaseClass) { 1963b57db3SJulie Hockett if (!Node.hasDefinition()) return false; 2063b57db3SJulie Hockett if (!Node.getNumVBases()) return false; 2163b57db3SJulie Hockett for (const CXXBaseSpecifier &Base : Node.bases()) 2263b57db3SJulie Hockett if (Base.isVirtual()) return true; 2363b57db3SJulie Hockett return false; 2463b57db3SJulie Hockett } 25f8c99297SBenjamin Kramer } // namespace 2663b57db3SJulie Hockett registerMatchers(MatchFinder * Finder)2763b57db3SJulie Hockettvoid VirtualInheritanceCheck::registerMatchers(MatchFinder *Finder) { 2863b57db3SJulie Hockett // Defining classes using direct virtual inheritance is disallowed. 2963b57db3SJulie Hockett Finder->addMatcher(cxxRecordDecl(hasDirectVirtualBaseClass()).bind("decl"), 3063b57db3SJulie Hockett this); 3163b57db3SJulie Hockett } 3263b57db3SJulie Hockett check(const MatchFinder::MatchResult & Result)3363b57db3SJulie Hockettvoid VirtualInheritanceCheck::check(const MatchFinder::MatchResult &Result) { 3463b57db3SJulie Hockett if (const auto *D = Result.Nodes.getNodeAs<CXXRecordDecl>("decl")) 3543465bf3SStephen Kelly diag(D->getBeginLoc(), "direct virtual inheritance is disallowed"); 3663b57db3SJulie Hockett } 3763b57db3SJulie Hockett 38*7d2ea6c4SCarlos Galvez } // namespace clang::tidy::fuchsia 39