diff options
author | Piotr Padlewski <piotr.padlewski@gmail.com> | 2016-05-02 16:56:39 +0000 |
---|---|---|
committer | Piotr Padlewski <piotr.padlewski@gmail.com> | 2016-05-02 16:56:39 +0000 |
commit | ce18ade406a58aac9cfdea74479a6412f30d920f (patch) | |
tree | 8ebc5fe184c2fee2c287e9a356b3b9d2437d21b6 /clang-tools-extra/test/clang-tidy/modernize-make-shared.cpp | |
parent | 45c7b3ecb574c84a559b6d00983dd19ec5041bc3 (diff) | |
download | bcm5719-llvm-ce18ade406a58aac9cfdea74479a6412f30d920f.tar.gz bcm5719-llvm-ce18ade406a58aac9cfdea74479a6412f30d920f.zip |
[clang-tidy] Add modernize-make-shared check
Because modernize-make-shared do almost the same job as
modernize-make-unique, I refactored common code to MakeSmartPtrCheck.
http://reviews.llvm.org/D19183
llvm-svn: 268253
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/modernize-make-shared.cpp')
-rw-r--r-- | clang-tools-extra/test/clang-tidy/modernize-make-shared.cpp | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/modernize-make-shared.cpp b/clang-tools-extra/test/clang-tidy/modernize-make-shared.cpp new file mode 100644 index 00000000000..ee4c68695fa --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/modernize-make-shared.cpp @@ -0,0 +1,200 @@ +// RUN: %check_clang_tidy %s modernize-make-shared %t + +namespace std { + +template <typename type> +class shared_ptr { +public: + shared_ptr(type *ptr); + shared_ptr(const shared_ptr<type> &t) {} + shared_ptr(shared_ptr<type> &&t) {} + ~shared_ptr(); + type &operator*() { return *ptr; } + type *operator->() { return ptr; } + type *release(); + void reset(); + void reset(type *pt); + +private: + type *ptr; +}; +} + +struct Base { + Base(); + Base(int, int); +}; + +struct Derived : public Base { + Derived(); + Derived(int, int); +}; + +struct APair { + int a, b; +}; + +struct DPair { + DPair() : a(0), b(0) {} + DPair(int x, int y) : a(y), b(x) {} + int a, b; +}; + +struct Empty {}; + +template <class T> +using shared_ptr_ = std::shared_ptr<T>; + +void *operator new(__SIZE_TYPE__ Count, void *Ptr); + +int g(std::shared_ptr<int> P); + +std::shared_ptr<Base> getPointer() { + return std::shared_ptr<Base>(new Base); + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use std::make_shared instead + // CHECK-FIXES: return std::make_shared<Base>(); +} + +void basic() { + std::shared_ptr<int> P1 = std::shared_ptr<int>(new int()); + // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use std::make_shared instead [modernize-make-shared] + // CHECK-FIXES: std::shared_ptr<int> P1 = std::make_shared<int>(); + + // Without parenthesis. + std::shared_ptr<int> P2 = std::shared_ptr<int>(new int); + // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use std::make_shared instead [modernize-make-shared] + // CHECK-FIXES: std::shared_ptr<int> P2 = std::make_shared<int>(); + + // With auto. + auto P3 = std::shared_ptr<int>(new int()); + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::make_shared instead + // CHECK-FIXES: auto P3 = std::make_shared<int>(); + + { + // No std. + using namespace std; + shared_ptr<int> Q = shared_ptr<int>(new int()); + // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use std::make_shared instead + // CHECK-FIXES: shared_ptr<int> Q = std::make_shared<int>(); + } + + std::shared_ptr<int> R(new int()); + + // Create the shared_ptr as a parameter to a function. + int T = g(std::shared_ptr<int>(new int())); + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::make_shared instead + // CHECK-FIXES: int T = g(std::make_shared<int>()); + + // Only replace if the type in the template is the same than the type returned + // by the new operator. + auto Pderived = std::shared_ptr<Base>(new Derived()); + + // The pointer is returned by the function, nothing to do. + std::shared_ptr<Base> RetPtr = getPointer(); + + // This emulates std::move. + std::shared_ptr<int> Move = static_cast<std::shared_ptr<int> &&>(P1); + + // Placemenet arguments should not be removed. + int *PInt = new int; + std::shared_ptr<int> Placement = std::shared_ptr<int>(new (PInt) int{3}); +} + +void initialization(int T, Base b) { + // Test different kinds of initialization of the pointee. + + // Direct initialization with parenthesis. + std::shared_ptr<DPair> PDir1 = std::shared_ptr<DPair>(new DPair(1, T)); + // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_shared instead + // CHECK-FIXES: std::shared_ptr<DPair> PDir1 = std::make_shared<DPair>(1, T); + + // Direct initialization with braces. + std::shared_ptr<DPair> PDir2 = std::shared_ptr<DPair>(new DPair{2, T}); + // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_shared instead + // CHECK-FIXES: std::shared_ptr<DPair> PDir2 = std::make_shared<DPair>(2, T); + + // Aggregate initialization. + std::shared_ptr<APair> PAggr = std::shared_ptr<APair>(new APair{T, 1}); + // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_shared instead + // CHECK-FIXES: std::shared_ptr<APair> PAggr = std::make_shared<APair>(APair{T, 1}); + + // Test different kinds of initialization of the pointee, when the shared_ptr + // is initialized with braces. + + // Direct initialization with parenthesis. + std::shared_ptr<DPair> PDir3 = std::shared_ptr<DPair>{new DPair(3, T)}; + // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_shared instead + // CHECK-FIXES: std::shared_ptr<DPair> PDir3 = std::make_shared<DPair>(3, T); + + // Direct initialization with braces. + std::shared_ptr<DPair> PDir4 = std::shared_ptr<DPair>{new DPair{4, T}}; + // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_shared instead + // CHECK-FIXES: std::shared_ptr<DPair> PDir4 = std::make_shared<DPair>(4, T); + + // Aggregate initialization. + std::shared_ptr<APair> PAggr2 = std::shared_ptr<APair>{new APair{T, 2}}; + // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: use std::make_shared instead + // CHECK-FIXES: std::shared_ptr<APair> PAggr2 = std::make_shared<APair>(APair{T, 2}); + + // Direct initialization with parenthesis, without arguments. + std::shared_ptr<DPair> PDir5 = std::shared_ptr<DPair>(new DPair()); + // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_shared instead + // CHECK-FIXES: std::shared_ptr<DPair> PDir5 = std::make_shared<DPair>(); + + // Direct initialization with braces, without arguments. + std::shared_ptr<DPair> PDir6 = std::shared_ptr<DPair>(new DPair{}); + // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_shared instead + // CHECK-FIXES: std::shared_ptr<DPair> PDir6 = std::make_shared<DPair>(); + + // Aggregate initialization without arguments. + std::shared_ptr<Empty> PEmpty = std::shared_ptr<Empty>(new Empty{}); + // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: use std::make_shared instead + // CHECK-FIXES: std::shared_ptr<Empty> PEmpty = std::make_shared<Empty>(Empty{}); +} + +void aliases() { + typedef std::shared_ptr<int> IntPtr; + IntPtr Typedef = IntPtr(new int); + // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use std::make_shared instead + // CHECK-FIXES: IntPtr Typedef = std::make_shared<int>(); + + // We use 'bool' instead of '_Bool'. + typedef std::shared_ptr<bool> BoolPtr; + BoolPtr BoolType = BoolPtr(new bool); + // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: use std::make_shared instead + // CHECK-FIXES: BoolPtr BoolType = std::make_shared<bool>(); + + // We use 'Base' instead of 'struct Base'. + typedef std::shared_ptr<Base> BasePtr; + BasePtr StructType = BasePtr(new Base); +// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: use std::make_shared instead +// CHECK-FIXES: BasePtr StructType = std::make_shared<Base>(); + +#define PTR shared_ptr<int> + std::shared_ptr<int> Macro = std::PTR(new int); +// CHECK-MESSAGES: :[[@LINE-1]]:32: warning: use std::make_shared instead +// CHECK-FIXES: std::shared_ptr<int> Macro = std::make_shared<int>(); +#undef PTR + + std::shared_ptr<int> Using = shared_ptr_<int>(new int); + // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: use std::make_shared instead + // CHECK-FIXES: std::shared_ptr<int> Using = std::make_shared<int>(); +} + +void whitespaces() { + // clang-format off + auto Space = std::shared_ptr <int>(new int()); + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: use std::make_shared instead + // CHECK-FIXES: auto Space = std::make_shared<int>(); + + auto Spaces = std :: shared_ptr <int>(new int()); + // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use std::make_shared instead + // CHECK-FIXES: auto Spaces = std::make_shared<int>(); + // clang-format on +} + +void nesting() { + auto Nest = std::shared_ptr<std::shared_ptr<int>>(new std::shared_ptr<int>(new int)); + // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: use std::make_shared instead + // CHECK-FIXES: auto Nest = std::make_shared<std::shared_ptr<int>>(new int); +} |