|  | //===--- PreferIsaOrDynCastInConditionalsCheck.h - clang-tidy ---*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_PREFERISAORDYNCASTINCONDITIONALSCHECK_H | 
|  | #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_PREFERISAORDYNCASTINCONDITIONALSCHECK_H | 
|  |  | 
|  | #include "../ClangTidyCheck.h" | 
|  |  | 
|  | namespace clang::tidy::llvm_check { | 
|  |  | 
|  | /// Looks at conditionals and finds and replaces cases of ``cast<>``, which will | 
|  | /// assert rather than return a null pointer, and ``dyn_cast<>`` where | 
|  | /// the return value is not captured.  Additionally, finds and replaces cases that match the | 
|  | /// pattern ``var && isa<X>(var)``, where ``var`` is evaluated twice. | 
|  | /// | 
|  | /// Finds cases like these: | 
|  | /// \code | 
|  | ///  if (auto x = cast<X>(y)) {} | 
|  | ///  // is replaced by: | 
|  | ///  if (auto x = dyn_cast<X>(y)) {} | 
|  | /// | 
|  | ///  if (cast<X>(y)) {} | 
|  | ///  // is replaced by: | 
|  | ///  if (isa<X>(y)) {} | 
|  | /// | 
|  | ///  if (dyn_cast<X>(y)) {} | 
|  | ///  // is replaced by: | 
|  | ///  if (isa<X>(y)) {} | 
|  | /// | 
|  | ///  if (var && isa<T>(var)) {} | 
|  | ///  // is replaced by: | 
|  | ///  if (isa_and_nonnull<T>(var.foo())) {} | 
|  | /// \endcode | 
|  | /// | 
|  | ///  // Other cases are ignored, e.g.: | 
|  | /// \code | 
|  | ///  if (auto f = cast<Z>(y)->foo()) {} | 
|  | ///  if (cast<Z>(y)->foo()) {} | 
|  | ///  if (X.cast(y)) {} | 
|  | /// \endcode | 
|  | /// | 
|  | /// For the user-facing documentation see: | 
|  | /// http://clang.llvm.org/extra/clang-tidy/checks/llvm/prefer-isa-or-dyn-cast-in-conditionals.html | 
|  | class PreferIsaOrDynCastInConditionalsCheck : public ClangTidyCheck { | 
|  | public: | 
|  | PreferIsaOrDynCastInConditionalsCheck(StringRef Name, | 
|  | ClangTidyContext *Context) | 
|  | : ClangTidyCheck(Name, Context) {} | 
|  | bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { | 
|  | return LangOpts.CPlusPlus; | 
|  | } | 
|  | void registerMatchers(ast_matchers::MatchFinder *Finder) override; | 
|  | void check(const ast_matchers::MatchFinder::MatchResult &Result) override; | 
|  | }; | 
|  |  | 
|  | } // namespace clang::tidy::llvm_check | 
|  |  | 
|  | #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_PREFERISAORDYNCASTINCONDITIONALSCHECK_H |