annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- InterfacesGlobalInitCheck.cpp - clang-tidy------------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "InterfacesGlobalInitCheck.h"
anatofuz
parents:
diff changeset
10 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
11 #include "clang/ASTMatchers/ASTMatchFinder.h"
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 using namespace clang::ast_matchers;
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 namespace clang {
anatofuz
parents:
diff changeset
16 namespace tidy {
anatofuz
parents:
diff changeset
17 namespace cppcoreguidelines {
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 void InterfacesGlobalInitCheck::registerMatchers(MatchFinder *Finder) {
anatofuz
parents:
diff changeset
20 const auto GlobalVarDecl =
anatofuz
parents:
diff changeset
21 varDecl(hasGlobalStorage(),
anatofuz
parents:
diff changeset
22 hasDeclContext(anyOf(translationUnitDecl(), // Global scope.
anatofuz
parents:
diff changeset
23 namespaceDecl(), // Namespace scope.
anatofuz
parents:
diff changeset
24 recordDecl())), // Class scope.
anatofuz
parents:
diff changeset
25 unless(isConstexpr()));
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 const auto ReferencesUndefinedGlobalVar = declRefExpr(hasDeclaration(
anatofuz
parents:
diff changeset
28 varDecl(GlobalVarDecl, unless(isDefinition())).bind("referencee")));
anatofuz
parents:
diff changeset
29
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
30 Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
31 varDecl(GlobalVarDecl, isDefinition(),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
32 hasInitializer(expr(hasDescendant(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
33 ReferencesUndefinedGlobalVar))))
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
34 .bind("var")),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
35 this);
150
anatofuz
parents:
diff changeset
36 }
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 void InterfacesGlobalInitCheck::check(const MatchFinder::MatchResult &Result) {
anatofuz
parents:
diff changeset
39 const auto *const Var = Result.Nodes.getNodeAs<VarDecl>("var");
anatofuz
parents:
diff changeset
40 // For now assume that people who write macros know what they're doing.
anatofuz
parents:
diff changeset
41 if (Var->getLocation().isMacroID())
anatofuz
parents:
diff changeset
42 return;
anatofuz
parents:
diff changeset
43 const auto *const Referencee = Result.Nodes.getNodeAs<VarDecl>("referencee");
anatofuz
parents:
diff changeset
44 // If the variable has been defined, we're good.
anatofuz
parents:
diff changeset
45 const auto *const ReferenceeDef = Referencee->getDefinition();
anatofuz
parents:
diff changeset
46 if (ReferenceeDef != nullptr &&
anatofuz
parents:
diff changeset
47 Result.SourceManager->isBeforeInTranslationUnit(
anatofuz
parents:
diff changeset
48 ReferenceeDef->getLocation(), Var->getLocation())) {
anatofuz
parents:
diff changeset
49 return;
anatofuz
parents:
diff changeset
50 }
anatofuz
parents:
diff changeset
51 diag(Var->getLocation(),
anatofuz
parents:
diff changeset
52 "initializing non-local variable with non-const expression depending on "
anatofuz
parents:
diff changeset
53 "uninitialized non-local variable %0")
anatofuz
parents:
diff changeset
54 << Referencee;
anatofuz
parents:
diff changeset
55 }
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 } // namespace cppcoreguidelines
anatofuz
parents:
diff changeset
58 } // namespace tidy
anatofuz
parents:
diff changeset
59 } // namespace clang