xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/bugprone/shared-ptr-array-mismatch.cpp (revision 15f3cd6bfc670ba6106184a903eb04be059e5977)
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()1789a1d03eSRichard void 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()3689a1d03eSRichard void 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()4489a1d03eSRichard void 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()6289a1d03eSRichard void 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()6789a1d03eSRichard std::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()7389a1d03eSRichard void 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()7989a1d03eSRichard void 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()8989a1d03eSRichard void 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