Mercurial > hg > CbC > CbC_llvm
view clang-tools-extra/clang-tidy/cppcoreguidelines/InterfacesGlobalInitCheck.cpp @ 173:0572611fdcc8 llvm10 llvm12
reorgnization done
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 11:55:54 +0900 |
parents | 1d019706d866 |
children | 2e18cbf3894f |
line wrap: on
line source
//===--- InterfacesGlobalInitCheck.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 "InterfacesGlobalInitCheck.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" using namespace clang::ast_matchers; namespace clang { namespace tidy { namespace cppcoreguidelines { void InterfacesGlobalInitCheck::registerMatchers(MatchFinder *Finder) { const auto GlobalVarDecl = varDecl(hasGlobalStorage(), hasDeclContext(anyOf(translationUnitDecl(), // Global scope. namespaceDecl(), // Namespace scope. recordDecl())), // Class scope. unless(isConstexpr())); const auto ReferencesUndefinedGlobalVar = declRefExpr(hasDeclaration( varDecl(GlobalVarDecl, unless(isDefinition())).bind("referencee"))); Finder->addMatcher(traverse(ast_type_traits::TK_AsIs, varDecl(GlobalVarDecl, isDefinition(), hasInitializer(expr(hasDescendant( ReferencesUndefinedGlobalVar)))) .bind("var")), this); } void InterfacesGlobalInitCheck::check(const MatchFinder::MatchResult &Result) { const auto *const Var = Result.Nodes.getNodeAs<VarDecl>("var"); // For now assume that people who write macros know what they're doing. if (Var->getLocation().isMacroID()) return; const auto *const Referencee = Result.Nodes.getNodeAs<VarDecl>("referencee"); // If the variable has been defined, we're good. const auto *const ReferenceeDef = Referencee->getDefinition(); if (ReferenceeDef != nullptr && Result.SourceManager->isBeforeInTranslationUnit( ReferenceeDef->getLocation(), Var->getLocation())) { return; } diag(Var->getLocation(), "initializing non-local variable with non-const expression depending on " "uninitialized non-local variable %0") << Referencee; } } // namespace cppcoreguidelines } // namespace tidy } // namespace clang