xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/bugprone/unique-ptr-array-mismatch.cpp (revision b0bab14b8b5305ddcb4e8b4d8a0e64004fc5425e)
1*b0bab14bSBalázs Kéri // RUN: %check_clang_tidy %s bugprone-unique-ptr-array-mismatch %t
2*b0bab14bSBalázs Kéri 
3*b0bab14bSBalázs Kéri namespace std {
4*b0bab14bSBalázs Kéri 
5*b0bab14bSBalázs Kéri template<class T> struct default_delete {};
6*b0bab14bSBalázs Kéri template<class T> struct default_delete<T[]> {};
7*b0bab14bSBalázs Kéri 
8*b0bab14bSBalázs Kéri template<class T, class Deleter = std::default_delete<T>>
9*b0bab14bSBalázs Kéri class unique_ptr {
10*b0bab14bSBalázs Kéri public:
11*b0bab14bSBalázs Kéri   explicit unique_ptr(T* p) noexcept;
12*b0bab14bSBalázs Kéri   unique_ptr(T* p, Deleter d1 ) noexcept;
13*b0bab14bSBalázs Kéri };
14*b0bab14bSBalázs Kéri 
15*b0bab14bSBalázs Kéri template <class T, class Deleter>
16*b0bab14bSBalázs Kéri class unique_ptr<T[], Deleter> {
17*b0bab14bSBalázs Kéri public:
18*b0bab14bSBalázs Kéri   template<class U>
19*b0bab14bSBalázs Kéri   explicit unique_ptr(U p) noexcept;
20*b0bab14bSBalázs Kéri   template<class U>
21*b0bab14bSBalázs Kéri   unique_ptr(U p, Deleter d1) noexcept;
22*b0bab14bSBalázs Kéri };
23*b0bab14bSBalázs Kéri 
24*b0bab14bSBalázs Kéri } // namespace std
25*b0bab14bSBalázs Kéri 
26*b0bab14bSBalázs Kéri struct A {};
27*b0bab14bSBalázs Kéri 
28*b0bab14bSBalázs Kéri using PtrT = std::unique_ptr<A>;
29*b0bab14bSBalázs Kéri using PtrTArr = std::unique_ptr<A[]>;
30*b0bab14bSBalázs Kéri 
f1()31*b0bab14bSBalázs Kéri void f1() {
32*b0bab14bSBalázs Kéri   std::unique_ptr<int> P1{new int};
33*b0bab14bSBalázs Kéri   std::unique_ptr<int> P2{new int[10]};
34*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
35*b0bab14bSBalázs Kéri   // CHECK-FIXES: std::unique_ptr<int[]> P2{new int[10]};
36*b0bab14bSBalázs Kéri   // clang-format off
37*b0bab14bSBalázs Kéri   std::unique_ptr<  int  > P3{new int[10]};
38*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
39*b0bab14bSBalázs Kéri   // CHECK-FIXES: std::unique_ptr<  int[]  > P3{new int[10]};
40*b0bab14bSBalázs Kéri   // clang-format on
41*b0bab14bSBalázs Kéri   std::unique_ptr<int> P4(new int[10]);
42*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
43*b0bab14bSBalázs Kéri   // CHECK-FIXES: std::unique_ptr<int[]> P4(new int[10]);
44*b0bab14bSBalázs Kéri   new std::unique_ptr<int>(new int[10]);
45*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
46*b0bab14bSBalázs Kéri   std::unique_ptr<int[]> P5(new int[10]);
47*b0bab14bSBalázs Kéri 
48*b0bab14bSBalázs Kéri   A deleter;
49*b0bab14bSBalázs Kéri   std::unique_ptr<int, A> P6(new int[10], deleter);
50*b0bab14bSBalázs Kéri   std::unique_ptr<int, A> P7(new int[10]);
51*b0bab14bSBalázs Kéri   std::default_delete<int[]> def_del;
52*b0bab14bSBalázs Kéri   std::unique_ptr<int, std::default_delete<int[]>> P8(new int[10], def_del);
53*b0bab14bSBalázs Kéri 
54*b0bab14bSBalázs Kéri   new PtrT(new A[10]);
55*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
56*b0bab14bSBalázs Kéri   new PtrTArr(new A[10]);
57*b0bab14bSBalázs Kéri }
58*b0bab14bSBalázs Kéri 
f2()59*b0bab14bSBalázs Kéri void f2() {
60*b0bab14bSBalázs Kéri   std::unique_ptr<A> P1(new A);
61*b0bab14bSBalázs Kéri   std::unique_ptr<A> P2(new A[10]);
62*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
63*b0bab14bSBalázs Kéri   // CHECK-FIXES: std::unique_ptr<A[]> P2(new A[10]);
64*b0bab14bSBalázs Kéri   std::unique_ptr<A[]> P3(new A[10]);
65*b0bab14bSBalázs Kéri }
66*b0bab14bSBalázs Kéri 
f3()67*b0bab14bSBalázs Kéri void f3() {
68*b0bab14bSBalázs Kéri   std::unique_ptr<int> P1{new int}, P2{new int[10]}, P3{new int[10]};
69*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
70*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-2]]:57: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
71*b0bab14bSBalázs Kéri }
72*b0bab14bSBalázs Kéri 
73*b0bab14bSBalázs Kéri struct S {
74*b0bab14bSBalázs Kéri   std::unique_ptr<int> P1;
75*b0bab14bSBalázs Kéri   std::unique_ptr<int> P2{new int[10]};
76*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
77*b0bab14bSBalázs Kéri   std::unique_ptr<int> P3{new int}, P4{new int[10]};
78*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
SS79*b0bab14bSBalázs Kéri   S() : P1{new int[10]} {}
80*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
81*b0bab14bSBalázs Kéri };
82*b0bab14bSBalázs Kéri 
83*b0bab14bSBalázs Kéri void f_parm(std::unique_ptr<int>);
84*b0bab14bSBalázs Kéri 
f4()85*b0bab14bSBalázs Kéri void f4() {
86*b0bab14bSBalázs Kéri   f_parm(std::unique_ptr<int>{new int[10]});
87*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
88*b0bab14bSBalázs Kéri }
89*b0bab14bSBalázs Kéri 
f_ret()90*b0bab14bSBalázs Kéri std::unique_ptr<int> f_ret() {
91*b0bab14bSBalázs Kéri   return std::unique_ptr<int>(new int[10]);
92*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
93*b0bab14bSBalázs Kéri }
94*b0bab14bSBalázs Kéri 
95*b0bab14bSBalázs Kéri template <class T>
f_tmpl()96*b0bab14bSBalázs Kéri void f_tmpl() {
97*b0bab14bSBalázs Kéri   std::unique_ptr<T> P1{new T[10]};
98*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
99*b0bab14bSBalázs Kéri   // CHECK-FIXES: std::unique_ptr<T[]> P1{new T[10]};
100*b0bab14bSBalázs Kéri }
101*b0bab14bSBalázs Kéri 
f5()102*b0bab14bSBalázs Kéri void f5() {
103*b0bab14bSBalázs Kéri   f_tmpl<char>();
104*b0bab14bSBalázs Kéri }
105*b0bab14bSBalázs Kéri 
106*b0bab14bSBalázs Kéri template <class T>
f_tmpl_1()107*b0bab14bSBalázs Kéri void f_tmpl_1() {
108*b0bab14bSBalázs Kéri   std::unique_ptr<T> P1{new T[10]};
109*b0bab14bSBalázs Kéri   // FIXME_CHECK-MESSAGES: :[[@LINE-1]]:25: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
110*b0bab14bSBalázs Kéri   // FIXME_CHECK-FIXES: std::unique_ptr<T[]> P1{new T[10]};
111*b0bab14bSBalázs Kéri }
112*b0bab14bSBalázs Kéri 
113*b0bab14bSBalázs Kéri #define CHAR_PTR_TYPE std::unique_ptr<char>
114*b0bab14bSBalázs Kéri #define CHAR_PTR_VAR(X) \
115*b0bab14bSBalázs Kéri   X { new char[10] }
116*b0bab14bSBalázs Kéri #define CHAR_PTR_INIT(X, Y) \
117*b0bab14bSBalázs Kéri   std::unique_ptr<char> X { Y }
118*b0bab14bSBalázs Kéri 
f6()119*b0bab14bSBalázs Kéri void f6() {
120*b0bab14bSBalázs Kéri   CHAR_PTR_TYPE P1{new char[10]};
121*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
122*b0bab14bSBalázs Kéri   std::unique_ptr<char> CHAR_PTR_VAR(P2);
123*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
124*b0bab14bSBalázs Kéri   // CHECK-FIXES: std::unique_ptr<char[]> CHAR_PTR_VAR(P2);
125*b0bab14bSBalázs Kéri   CHAR_PTR_INIT(P3, new char[10]);
126*b0bab14bSBalázs Kéri   // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: unique pointer to non-array is initialized with array [bugprone-unique-ptr-array-mismatch]
127*b0bab14bSBalázs Kéri }
128