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