brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 9781f0a Raw
51 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 "ThrowKeywordMissingCheck.h"10#include "clang/AST/ASTContext.h"11#include "clang/ASTMatchers/ASTMatchFinder.h"12 13using namespace clang::ast_matchers;14 15namespace clang::tidy::bugprone {16 17void ThrowKeywordMissingCheck::registerMatchers(MatchFinder *Finder) {18  Finder->addMatcher(19      cxxConstructExpr(20          hasType(cxxRecordDecl(anyOf(21              matchesName("[Ee]xception|EXCEPTION"),22              hasAnyBase(hasType(hasCanonicalType(recordType(hasDeclaration(23                  cxxRecordDecl(matchesName("[Ee]xception|EXCEPTION"))24                      .bind("base"))))))))),25          unless(anyOf(26              hasAncestor(27                  stmt(anyOf(cxxThrowExpr(), callExpr(), returnStmt()))),28              hasAncestor(decl(anyOf(varDecl(), fieldDecl()))),29              hasAncestor(expr(cxxNewExpr(hasAnyPlacementArg(anything())))),30              allOf(hasAncestor(cxxConstructorDecl()),31                    unless(hasAncestor(cxxCatchStmt()))))))32          .bind("temporary-exception-not-thrown"),33      this);34}35 36void ThrowKeywordMissingCheck::check(const MatchFinder::MatchResult &Result) {37  const auto *TemporaryExpr =38      Result.Nodes.getNodeAs<Expr>("temporary-exception-not-thrown");39 40  diag(TemporaryExpr->getBeginLoc(), "suspicious exception object created but "41                                     "not thrown; did you mean 'throw %0'?")42      << TemporaryExpr->getType().getBaseTypeIdentifier()->getName();43 44  if (const auto *BaseDecl = Result.Nodes.getNodeAs<Decl>("base"))45    diag(BaseDecl->getLocation(),46         "object type inherits from base class declared here",47         DiagnosticIDs::Note);48}49 50} // namespace clang::tidy::bugprone51