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