xref: /llvm-project/clang-tools-extra/clang-tidy/fuchsia/VirtualInheritanceCheck.cpp (revision 7d2ea6c422d3f5712b7253407005e1a465a76946)
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 Hockett AST_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 Hockett void 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 Hockett void 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