blob: a2e7df73ddd86e120be558c95a5a856397b9c8bb [file] [log] [blame]
Aaron Ballmanfd78cc82015-10-09 20:42:44 +00001//===--- ThrowByValueCatchByReferenceCheck.h - clang-tidy--------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_THROW_BY_VALUE_CATCH_BY_REFERENCE_H
11#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_THROW_BY_VALUE_CATCH_BY_REFERENCE_H
12
13#include "../ClangTidy.h"
14
15namespace clang {
16namespace tidy {
Etienne Bergeron456177b2016-05-02 18:00:29 +000017namespace misc {
Aaron Ballmanfd78cc82015-10-09 20:42:44 +000018
19///\brief checks for locations that do not throw by value
20// or catch by reference.
21// The check is C++ only. It checks that all throw locations
22// throw by value and not by pointer. Additionally it
23// contains an option ("CheckThrowTemporaries", default value "true") that
24// checks that thrown objects are anonymous temporaries. It is also
25// acceptable for this check to throw string literals.
26// This test checks that exceptions are caught by reference
27// and not by value or pointer. It will not warn when catching
28// pointer to char, wchar_t, char16_t or char32_t. This is
29// due to not warning on throwing string literals.
30class ThrowByValueCatchByReferenceCheck : public ClangTidyCheck {
31public:
32 ThrowByValueCatchByReferenceCheck(StringRef Name, ClangTidyContext *Context);
33 void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
34 void registerMatchers(ast_matchers::MatchFinder *Finder) override;
35 void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
36
37private:
38 void diagnoseThrowLocations(const CXXThrowExpr *throwExpr);
39 void diagnoseCatchLocations(const CXXCatchStmt *catchStmt,
40 ASTContext &context);
41 bool isFunctionParameter(const DeclRefExpr *declRefExpr);
42 bool isCatchVariable(const DeclRefExpr *declRefExpr);
43 bool isFunctionOrCatchVar(const DeclRefExpr *declRefExpr);
44 const bool CheckAnonymousTemporaries;
45};
46
Etienne Bergeron456177b2016-05-02 18:00:29 +000047} // namespace misc
Aaron Ballmanfd78cc82015-10-09 20:42:44 +000048} // namespace tidy
49} // namespace clang
50
51#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_THROW_BY_VALUE_CATCH_BY_REFERENCE_H