blob: 8288c7e47d35e686de42b00d9fe149210a397766 [file] [log] [blame]
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001//===--- ReplaceAutoPtrCheck.h - clang-tidy----------------------*- C++ -*-===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_AUTO_PTR_H
10#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_AUTO_PTR_H
11
12#include "../ClangTidyCheck.h"
13#include "../utils/IncludeInserter.h"
14
15namespace clang {
16namespace tidy {
17namespace modernize {
18
19/// Transforms the deprecated `std::auto_ptr` into the C++11 `std::unique_ptr`.
20///
21/// Note that both the `std::auto_ptr` type and the transfer of ownership are
22/// transformed. `std::auto_ptr` provides two ways to transfer the ownership,
23/// the copy-constructor and the assignment operator. Unlike most classes these
24/// operations do not 'copy' the resource but they 'steal' it.
25/// `std::unique_ptr` uses move semantics instead, which makes the intent of
26/// transferring the resource explicit. This difference between the two smart
27/// pointers requeres to wrap the copy-ctor and assign-operator with
28/// `std::move()`.
29///
30/// For example, given:
31///
32/// \code
33/// std::auto_ptr<int> i, j;
34/// i = j;
35/// \endcode
36///
37/// This code is transformed to:
38///
39/// \code
40/// std::unique_ptr<in> i, j;
41/// i = std::move(j);
42/// \endcode
43class ReplaceAutoPtrCheck : public ClangTidyCheck {
44public:
45 ReplaceAutoPtrCheck(StringRef Name, ClangTidyContext *Context);
46 bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
47 return LangOpts.CPlusPlus;
48 }
49 void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
50 void registerMatchers(ast_matchers::MatchFinder *Finder) override;
51 void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
52 Preprocessor *ModuleExpanderPP) override;
53 void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
54
55private:
56 utils::IncludeInserter Inserter;
57};
58
59} // namespace modernize
60} // namespace tidy
61} // namespace clang
62
63#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_AUTO_PTR_H