// RUN: %check_clang_tidy %s bugprone-shared-ptr-array-mismatch %t namespace std { template struct shared_ptr { template explicit shared_ptr(Y *) {} template shared_ptr(Y *, Deleter) {} }; } // namespace std struct A {}; void f1() { std::shared_ptr P1{new int}; std::shared_ptr P2{new int[10]}; // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] // CHECK-FIXES: std::shared_ptr P2{new int[10]}; // clang-format off std::shared_ptr< int > P3{new int[10]}; // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] // CHECK-FIXES: std::shared_ptr< int[] > P3{new int[10]}; // clang-format on std::shared_ptr P4(new int[10]); // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] // CHECK-FIXES: std::shared_ptr P4(new int[10]); new std::shared_ptr(new int[10]); // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] std::shared_ptr P5(new int[10]); std::shared_ptr P6(new int[10], [](const int *Ptr) {}); } void f2() { std::shared_ptr P1(new A); std::shared_ptr P2(new A[10]); // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] // CHECK-FIXES: std::shared_ptr P2(new A[10]); std::shared_ptr P3(new A[10]); } void f3() { std::shared_ptr P1{new int}, P2{new int[10]}, P3{new int[10]}; // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] // CHECK-MESSAGES: :[[@LINE-2]]:57: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] } struct S { std::shared_ptr P1; std::shared_ptr P2{new int[10]}; // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] std::shared_ptr P3{new int}, P4{new int[10]}; // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] S() : P1{new int[10]} {} // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] }; void f_parm(std::shared_ptr); void f4() { f_parm(std::shared_ptr{new int[10]}); // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] } std::shared_ptr f_ret() { return std::shared_ptr(new int[10]); // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] } template void f_tmpl() { std::shared_ptr P1{new T[10]}; // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] // CHECK-FIXES: std::shared_ptr P1{new T[10]}; } void f5() { f_tmpl(); } #define CHAR_PTR_TYPE std::shared_ptr #define CHAR_PTR_VAR(X) \ X { new char[10] } #define CHAR_PTR_INIT(X, Y) \ std::shared_ptr X { Y } void f6() { CHAR_PTR_TYPE P1{new char[10]}; // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] std::shared_ptr CHAR_PTR_VAR(P2); // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] // CHECK-FIXES: std::shared_ptr CHAR_PTR_VAR(P2); CHAR_PTR_INIT(P3, new char[10]); // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: shared pointer to non-array is initialized with array [bugprone-shared-ptr-array-mismatch] }