annotate clang-tools-extra/clang-tidy/modernize/UseUncaughtExceptionsCheck.cpp @ 252:1f2b6ac9f198 llvm-original

LLVM16-1
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Aug 2023 09:04:13 +0900
parents 79ff65ed7e25
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- UseUncaughtExceptionsCheck.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 "UseUncaughtExceptionsCheck.h"
anatofuz
parents:
diff changeset
10 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
11 #include "clang/ASTMatchers/ASTMatchFinder.h"
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
12 #include "clang/Lex/Lexer.h"
150
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 using namespace clang::ast_matchers;
anatofuz
parents:
diff changeset
15
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
16 namespace clang::tidy::modernize {
150
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 void UseUncaughtExceptionsCheck::registerMatchers(MatchFinder *Finder) {
anatofuz
parents:
diff changeset
19 std::string MatchText = "::std::uncaught_exception";
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 // Using declaration: warning and fix-it.
anatofuz
parents:
diff changeset
22 Finder->addMatcher(
anatofuz
parents:
diff changeset
23 usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(hasName(MatchText))))
anatofuz
parents:
diff changeset
24 .bind("using_decl"),
anatofuz
parents:
diff changeset
25 this);
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 // DeclRefExpr: warning, no fix-it.
anatofuz
parents:
diff changeset
28 Finder->addMatcher(
anatofuz
parents:
diff changeset
29 declRefExpr(to(functionDecl(hasName(MatchText))), unless(callExpr()))
anatofuz
parents:
diff changeset
30 .bind("decl_ref_expr"),
anatofuz
parents:
diff changeset
31 this);
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 auto DirectCallToUncaughtException = callee(expr(ignoringImpCasts(
anatofuz
parents:
diff changeset
34 declRefExpr(hasDeclaration(functionDecl(hasName(MatchText)))))));
anatofuz
parents:
diff changeset
35
anatofuz
parents:
diff changeset
36 // CallExpr: warning, fix-it.
anatofuz
parents:
diff changeset
37 Finder->addMatcher(callExpr(DirectCallToUncaughtException,
anatofuz
parents:
diff changeset
38 unless(hasAncestor(initListExpr())))
anatofuz
parents:
diff changeset
39 .bind("call_expr"),
anatofuz
parents:
diff changeset
40 this);
anatofuz
parents:
diff changeset
41 // CallExpr in initialisation list: warning, fix-it with avoiding narrowing
anatofuz
parents:
diff changeset
42 // conversions.
anatofuz
parents:
diff changeset
43 Finder->addMatcher(callExpr(DirectCallToUncaughtException,
anatofuz
parents:
diff changeset
44 hasAncestor(initListExpr()))
anatofuz
parents:
diff changeset
45 .bind("init_call_expr"),
anatofuz
parents:
diff changeset
46 this);
anatofuz
parents:
diff changeset
47 }
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 void UseUncaughtExceptionsCheck::check(const MatchFinder::MatchResult &Result) {
anatofuz
parents:
diff changeset
50 SourceLocation BeginLoc;
anatofuz
parents:
diff changeset
51 SourceLocation EndLoc;
anatofuz
parents:
diff changeset
52 const CallExpr *C = Result.Nodes.getNodeAs<CallExpr>("init_call_expr");
anatofuz
parents:
diff changeset
53 bool WarnOnly = false;
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 if (C) {
anatofuz
parents:
diff changeset
56 BeginLoc = C->getBeginLoc();
anatofuz
parents:
diff changeset
57 EndLoc = C->getEndLoc();
anatofuz
parents:
diff changeset
58 } else if (const auto *E = Result.Nodes.getNodeAs<CallExpr>("call_expr")) {
anatofuz
parents:
diff changeset
59 BeginLoc = E->getBeginLoc();
anatofuz
parents:
diff changeset
60 EndLoc = E->getEndLoc();
anatofuz
parents:
diff changeset
61 } else if (const auto *D =
anatofuz
parents:
diff changeset
62 Result.Nodes.getNodeAs<DeclRefExpr>("decl_ref_expr")) {
anatofuz
parents:
diff changeset
63 BeginLoc = D->getBeginLoc();
anatofuz
parents:
diff changeset
64 EndLoc = D->getEndLoc();
anatofuz
parents:
diff changeset
65 WarnOnly = true;
anatofuz
parents:
diff changeset
66 } else {
anatofuz
parents:
diff changeset
67 const auto *U = Result.Nodes.getNodeAs<UsingDecl>("using_decl");
anatofuz
parents:
diff changeset
68 assert(U && "Null pointer, no node provided");
anatofuz
parents:
diff changeset
69 BeginLoc = U->getNameInfo().getBeginLoc();
anatofuz
parents:
diff changeset
70 EndLoc = U->getNameInfo().getEndLoc();
anatofuz
parents:
diff changeset
71 }
anatofuz
parents:
diff changeset
72
anatofuz
parents:
diff changeset
73 auto Diag = diag(BeginLoc, "'std::uncaught_exception' is deprecated, use "
anatofuz
parents:
diff changeset
74 "'std::uncaught_exceptions' instead");
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 if (!BeginLoc.isMacroID()) {
anatofuz
parents:
diff changeset
77 StringRef Text =
anatofuz
parents:
diff changeset
78 Lexer::getSourceText(CharSourceRange::getTokenRange(BeginLoc, EndLoc),
anatofuz
parents:
diff changeset
79 *Result.SourceManager, getLangOpts());
anatofuz
parents:
diff changeset
80
anatofuz
parents:
diff changeset
81 Text.consume_back("()");
anatofuz
parents:
diff changeset
82 int TextLength = Text.size();
anatofuz
parents:
diff changeset
83
anatofuz
parents:
diff changeset
84 if (WarnOnly) {
anatofuz
parents:
diff changeset
85 return;
anatofuz
parents:
diff changeset
86 }
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 if (!C) {
anatofuz
parents:
diff changeset
89 Diag << FixItHint::CreateInsertion(BeginLoc.getLocWithOffset(TextLength),
anatofuz
parents:
diff changeset
90 "s");
anatofuz
parents:
diff changeset
91 } else {
anatofuz
parents:
diff changeset
92 Diag << FixItHint::CreateReplacement(C->getSourceRange(),
anatofuz
parents:
diff changeset
93 "std::uncaught_exceptions() > 0");
anatofuz
parents:
diff changeset
94 }
anatofuz
parents:
diff changeset
95 }
anatofuz
parents:
diff changeset
96 }
anatofuz
parents:
diff changeset
97
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
98 } // namespace clang::tidy::modernize