brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 9e540e0 Raw
52 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "StaticallyConstructedObjectsCheck.h"10 11using namespace clang::ast_matchers;12 13namespace clang::tidy::fuchsia {14 15namespace {16AST_MATCHER(Expr, isConstantInitializer) {17  return Node.isConstantInitializer(Finder->getASTContext(), false);18}19 20AST_MATCHER(VarDecl, isGlobalStatic) {21  return Node.getStorageDuration() == SD_Static && !Node.isLocalVarDecl();22}23} // namespace24 25void StaticallyConstructedObjectsCheck::registerMatchers(MatchFinder *Finder) {26  // Constructing global, non-trivial objects with static storage is27  // disallowed, unless the object is statically initialized with a constexpr28  // constructor or has no explicit constructor.29  Finder->addMatcher(30      traverse(TK_AsIs,31               varDecl(32                   // Match global, statically stored objects...33                   isGlobalStatic(),34                   // ... that have C++ constructors...35                   hasDescendant(cxxConstructExpr(unless(allOf(36                       // ... unless it is constexpr ...37                       hasDeclaration(cxxConstructorDecl(isConstexpr())),38                       // ... and is statically initialized.39                       isConstantInitializer())))))40                   .bind("decl")),41      this);42}43 44void StaticallyConstructedObjectsCheck::check(45    const MatchFinder::MatchResult &Result) {46  if (const auto *D = Result.Nodes.getNodeAs<VarDecl>("decl"))47    diag(D->getBeginLoc(), "static objects are disallowed; if possible, use a "48                           "constexpr constructor instead");49}50 51} // namespace clang::tidy::fuchsia52