50 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 "NoexceptFunctionBaseCheck.h"10#include "../utils/LexerUtils.h"11#include "clang/AST/ASTContext.h"12#include "clang/AST/Decl.h"13#include "clang/ASTMatchers/ASTMatchFinder.h"14 15using namespace clang::ast_matchers;16 17namespace clang::tidy::performance {18 19void NoexceptFunctionBaseCheck::check(const MatchFinder::MatchResult &Result) {20 const auto *FuncDecl = Result.Nodes.getNodeAs<FunctionDecl>(BindFuncDeclName);21 assert(FuncDecl);22 23 if (SpecAnalyzer.analyze(FuncDecl) !=24 utils::ExceptionSpecAnalyzer::State::Throwing)25 return;26 27 // Don't complain about nothrow(false), but complain on nothrow(expr)28 // where expr evaluates to false.29 const auto *ProtoType = FuncDecl->getType()->castAs<FunctionProtoType>();30 const Expr *NoexceptExpr = ProtoType->getNoexceptExpr();31 if (NoexceptExpr) {32 NoexceptExpr = NoexceptExpr->IgnoreImplicit();33 if (!isa<CXXBoolLiteralExpr>(NoexceptExpr))34 reportNoexceptEvaluatedToFalse(FuncDecl, NoexceptExpr);35 return;36 }37 38 auto Diag = reportMissingNoexcept(FuncDecl);39 40 // Add FixIt hints.41 const SourceManager &SM = *Result.SourceManager;42 43 const SourceLocation NoexceptLoc =44 utils::lexer::getLocationForNoexceptSpecifier(FuncDecl, SM);45 if (NoexceptLoc.isValid())46 Diag << FixItHint::CreateInsertion(NoexceptLoc, " noexcept ");47}48 49} // namespace clang::tidy::performance50