189a1d03eSRichard // RUN: %check_clang_tidy %s bugprone-shared-ptr-array-mismatch %t 289a1d03eSRichard 389a1d03eSRichard namespace std { 489a1d03eSRichard 589a1d03eSRichard template <typename T> 689a1d03eSRichard struct shared_ptr { 789a1d03eSRichard template <class Y> shared_ptrstd::shared_ptr889a1d03eSRichard explicit shared_ptr(Y *) {} 989a1d03eSRichard template <class Y, class Deleter> shared_ptrstd::shared_ptr1089a1d03eSRichard shared_ptr(Y *, Deleter) {} 1189a1d03eSRichard }; 1289a1d03eSRichard 1389a1d03eSRichard } // namespace std 1489a1d03eSRichard 1589a1d03eSRichard struct A {}; 1689a1d03eSRichard f1()1789a1d03eSRichardvoid f1() { 1889a1d03eSRichard std::shared_ptr<int> P1{new int}; 1989a1d03eSRichard std::shared_ptr<int> P2{new int[10]}; 2089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 2189a1d03eSRichard // CHECK-FIXES: std::shared_ptr<int[]> P2{new int[10]}; 2289a1d03eSRichard // clang-format off 2389a1d03eSRichard std::shared_ptr< int > P3{new int[10]}; 2489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 2589a1d03eSRichard // CHECK-FIXES: std::shared_ptr< int[] > P3{new int[10]}; 2689a1d03eSRichard // clang-format on 2789a1d03eSRichard std::shared_ptr<int> P4(new int[10]); 2889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 2989a1d03eSRichard // CHECK-FIXES: std::shared_ptr<int[]> P4(new int[10]); 3089a1d03eSRichard new std::shared_ptr<int>(new int[10]); 3189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 3289a1d03eSRichard std::shared_ptr<int[]> P5(new int[10]); 3389a1d03eSRichard std::shared_ptr<int> P6(new int[10], [](const int *Ptr) {}); 3489a1d03eSRichard } 3589a1d03eSRichard f2()3689a1d03eSRichardvoid f2() { 3789a1d03eSRichard std::shared_ptr<A> P1(new A); 3889a1d03eSRichard std::shared_ptr<A> P2(new A[10]); 3989a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 4089a1d03eSRichard // CHECK-FIXES: std::shared_ptr<A[]> P2(new A[10]); 4189a1d03eSRichard std::shared_ptr<A[]> P3(new A[10]); 4289a1d03eSRichard } 4389a1d03eSRichard f3()4489a1d03eSRichardvoid f3() { 4589a1d03eSRichard std::shared_ptr<int> P1{new int}, P2{new int[10]}, P3{new int[10]}; 4689a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 4789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:57: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 4889a1d03eSRichard } 4989a1d03eSRichard 5089a1d03eSRichard struct S { 5189a1d03eSRichard std::shared_ptr<int> P1; 5289a1d03eSRichard std::shared_ptr<int> P2{new int[10]}; 5389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 5489a1d03eSRichard std::shared_ptr<int> P3{new int}, P4{new int[10]}; 5589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] SS5689a1d03eSRichard S() : P1{new int[10]} {} 5789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 5889a1d03eSRichard }; 5989a1d03eSRichard 6089a1d03eSRichard void f_parm(std::shared_ptr<int>); 6189a1d03eSRichard f4()6289a1d03eSRichardvoid f4() { 6389a1d03eSRichard f_parm(std::shared_ptr<int>{new int[10]}); 6489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 6589a1d03eSRichard } 6689a1d03eSRichard f_ret()6789a1d03eSRichardstd::shared_ptr<int> f_ret() { 6889a1d03eSRichard return std::shared_ptr<int>(new int[10]); 6989a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 7089a1d03eSRichard } 7189a1d03eSRichard 7289a1d03eSRichard template <class T> f_tmpl()7389a1d03eSRichardvoid f_tmpl() { 7489a1d03eSRichard std::shared_ptr<T> P1{new T[10]}; 75*15f3cd6bSMatheus Izvekov // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 76*15f3cd6bSMatheus Izvekov // CHECK-FIXES: std::shared_ptr<T[]> P1{new T[10]}; 7789a1d03eSRichard } 7889a1d03eSRichard f5()7989a1d03eSRichardvoid f5() { 8089a1d03eSRichard f_tmpl<char>(); 8189a1d03eSRichard } 8289a1d03eSRichard 8389a1d03eSRichard #define CHAR_PTR_TYPE std::shared_ptr<char> 8489a1d03eSRichard #define CHAR_PTR_VAR(X) \ 8589a1d03eSRichard X { new char[10] } 8689a1d03eSRichard #define CHAR_PTR_INIT(X, Y) \ 8789a1d03eSRichard std::shared_ptr<char> X { Y } 8889a1d03eSRichard f6()8989a1d03eSRichardvoid f6() { 9089a1d03eSRichard CHAR_PTR_TYPE P1{new char[10]}; 9189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 9289a1d03eSRichard std::shared_ptr<char> CHAR_PTR_VAR(P2); 9389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 9489a1d03eSRichard // CHECK-FIXES: std::shared_ptr<char[]> CHAR_PTR_VAR(P2); 9589a1d03eSRichard CHAR_PTR_INIT(P3, new char[10]); 9689a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] 9789a1d03eSRichard } 98