1 | // RUN: %check_clang_tidy -std=c++14-or-later %s modernize-make-unique %t -- -- -I %S/Inputs/smart-ptr |
2 | |
3 | #include "unique_ptr.h" |
4 | #include "initializer_list.h" |
5 | // CHECK-FIXES: #include <memory> |
6 | |
7 | struct Base { |
8 | Base(); |
9 | Base(int, int); |
10 | }; |
11 | |
12 | struct Derived : public Base { |
13 | Derived(); |
14 | Derived(int, int); |
15 | }; |
16 | |
17 | struct APair { |
18 | int a, b; |
19 | }; |
20 | |
21 | struct DPair { |
22 | DPair() : a(0), b(0) {} |
23 | DPair(int x, int y) : a(y), b(x) {} |
24 | int a, b; |
25 | }; |
26 | |
27 | template<typename T> |
28 | struct MyVector { |
29 | MyVector(std::initializer_list<T>); |
30 | }; |
31 | |
32 | struct Empty {}; |
33 | |
34 | |
35 | struct E { |
36 | E(std::initializer_list<int>); |
37 | E(); |
38 | }; |
39 | |
40 | struct F { |
41 | F(std::initializer_list<int>); |
42 | F(); |
43 | int a; |
44 | }; |
45 | |
46 | struct G { |
47 | G(std::initializer_list<int>); |
48 | G(int); |
49 | }; |
50 | |
51 | struct H { |
52 | H(std::vector<int>); |
53 | H(std::vector<int> &, double); |
54 | H(MyVector<int>, int); |
55 | }; |
56 | |
57 | struct I { |
58 | I(G); |
59 | }; |
60 | |
61 | struct J { |
62 | J(E e, int); |
63 | }; |
64 | |
65 | namespace { |
66 | class Foo {}; |
67 | } // namespace |
68 | |
69 | namespace bar { |
70 | class Bar {}; |
71 | } // namespace bar |
72 | |
73 | template <class T> |
74 | using unique_ptr_ = std::unique_ptr<T>; |
75 | |
76 | void *operator new(__SIZE_TYPE__ Count, void *Ptr); |
77 | |
78 | int g(std::unique_ptr<int> P); |
79 | |
80 | std::unique_ptr<Base> getPointer() { |
81 | return std::unique_ptr<Base>(new Base); |
82 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use std::make_unique instead |
83 | // CHECK-FIXES: return std::make_unique<Base>(); |
84 | } |
85 | |
86 | std::unique_ptr<Base> getPointerValue() { |
87 | return std::unique_ptr<Base>(new Base()); |
88 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use std::make_unique instead |
89 | // CHECK-FIXES: return std::make_unique<Base>(); |
90 | } |
91 | |
92 | void basic() { |
93 | std::unique_ptr<int> P1 = std::unique_ptr<int>(new int()); |
94 | // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use std::make_unique instead [modernize-make-unique] |
95 | // CHECK-FIXES: std::unique_ptr<int> P1 = std::make_unique<int>(); |
96 | std::unique_ptr<int> P2 = std::unique_ptr<int>(new int); |
97 | |
98 | P1.reset(new int()); |
99 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use std::make_unique instead [modernize-make-unique] |
100 | // CHECK-FIXES: P1 = std::make_unique<int>(); |
101 | P2.reset(new int); |
102 | |
103 | P1 = std::unique_ptr<int>(new int()); |
104 | // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use std::make_unique instead [modernize-make-unique] |
105 | // CHECK-FIXES: P1 = std::make_unique<int>(); |
106 | P1 = std::unique_ptr<int>(new int); |
107 | |
108 | // Without parenthesis, default initialization. |
109 | std::unique_ptr<int> P3 = std::unique_ptr<int>(new int); |
110 | |
111 | P2.reset(new int); |
112 | |
113 | P2 = std::unique_ptr<int>(new int); |
114 | |
115 | // With auto. |
116 | auto P4 = std::unique_ptr<int>(new int()); |
117 | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::make_unique instead |
118 | // CHECK-FIXES: auto P4 = std::make_unique<int>(); |
119 | auto P5 = std::unique_ptr<int>(new int); |
120 | |
121 | std::unique_ptr<int> P6 = std::unique_ptr<int>((new int())); |
122 | // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use std::make_unique instead [modernize-make-unique] |
123 | // CHECK-FIXES: std::unique_ptr<int> P6 = std::make_unique<int>(); |
124 | std::unique_ptr<int> P7 = std::unique_ptr<int>((new int)); |
125 | |
126 | P4.reset((new int())); |
127 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use std::make_unique instead [modernize-make-unique] |
128 | // CHECK-FIXES: P4 = std::make_unique<int>(); |
129 | P5.reset((new int)); |
130 | |
131 | std::unique_ptr<int> P8 = std::unique_ptr<int>((((new int())))); |
132 | // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use std::make_unique instead [modernize-make-unique] |
133 | // CHECK-FIXES: std::unique_ptr<int> P8 = std::make_unique<int>(); |
134 | std::unique_ptr<int> P9 = std::unique_ptr<int>((((new int)))); |
135 | |
136 | P5.reset(((((new int()))))); |
137 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use std::make_unique instead [modernize-make-unique] |
138 | // CHECK-FIXES: P5 = std::make_unique<int>(); |
139 | P6.reset(((((new int))))); |
140 | |
141 | { |
142 | // No std. |
143 | using namespace std; |
144 | unique_ptr<int> Q = unique_ptr<int>(new int()); |
145 | // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use std::make_unique instead |
146 | // CHECK-FIXES: unique_ptr<int> Q = std::make_unique<int>(); |
147 | unique_ptr<int> P = unique_ptr<int>(new int); |
148 | |
149 | Q = unique_ptr<int>(new int()); |
150 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use std::make_unique instead |
151 | // CHECK-FIXES: Q = std::make_unique<int>(); |
152 | |
153 | P = unique_ptr<int>(new int); |
154 | } |
155 | |
156 | std::unique_ptr<int> R(new int()); |
157 | std::unique_ptr<int> S(new int); |
158 | |
159 | // Create the unique_ptr as a parameter to a function. |
160 | int T = g(std::unique_ptr<int>(new int())); |
161 | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::make_unique instead |
162 | // CHECK-FIXES: int T = g(std::make_unique<int>()); |
163 | T = g(std::unique_ptr<int>(new int)); |
164 | |
165 | // Only replace if the type in the template is the same as the type returned |
166 | // by the new operator. |
167 | auto Pderived = std::unique_ptr<Base>(new Derived()); |
168 | auto PderivedNoparen = std::unique_ptr<Base>(new Derived); |
169 | |
170 | // OK to replace for reset and assign |
171 | Pderived.reset(new Derived()); |
172 | // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: use std::make_unique instead |
173 | // CHECK-FIXES: Pderived = std::make_unique<Derived>(); |
174 | PderivedNoparen.reset(new Derived); |
175 | // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: use std::make_unique instead |
176 | // CHECK-FIXES: PderivedNoparen = std::make_unique<Derived>(); |
177 | |
178 | Pderived = std::unique_ptr<Derived>(new Derived()); |
179 | // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: use std::make_unique instead |
180 | // CHECK-FIXES: Pderived = std::make_unique<Derived>(); |
181 | PderivedNoparen = std::unique_ptr<Derived>(new Derived); |
182 | // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: use std::make_unique instead |
183 | // CHECK-FIXES: PderivedNoparen = std::make_unique<Derived>(); |
184 | |
185 | // FIXME: OK to replace if assigned to unique_ptr<Base> |
186 | Pderived = std::unique_ptr<Base>(new Derived()); |
187 | Pderived = std::unique_ptr<Base>(new Derived); |
188 | |
189 | // FIXME: OK to replace when auto is not used |
190 | std::unique_ptr<Base> PBase = std::unique_ptr<Base>(new Derived()); |
191 | std::unique_ptr<Base> PBaseNoparen = std::unique_ptr<Base>(new Derived); |
192 | |
193 | // The pointer is returned by the function, nothing to do. |
194 | std::unique_ptr<Base> RetPtr = getPointer(); |
195 | RetPtr = getPointerValue(); |
196 | |
197 | // This emulates std::move. |
198 | std::unique_ptr<int> Move = static_cast<std::unique_ptr<int> &&>(P1); |
199 | |
200 | // Placement arguments should not be removed. |
201 | int *PInt = new int; |
202 | std::unique_ptr<int> Placement = std::unique_ptr<int>(new (PInt) int{3}); |
203 | Placement.reset(new (PInt) int{3}); |
204 | Placement = std::unique_ptr<int>(new (PInt) int{3}); |
205 | |
206 | std::unique_ptr<int> PlacementNoparen = std::unique_ptr<int>(new (PInt) int); |
207 | PlacementNoparen.reset(new (PInt) int); |
208 | PlacementNoparen = std::unique_ptr<int>(new (PInt) int); |
209 | } |
210 | |
211 | // Calling make_smart_ptr from within a member function of a type with a |
212 | // private or protected constructor would be ill-formed. |
213 | class Private { |
214 | private: |
215 | Private(int z) {} |
216 | |
217 | public: |
218 | Private() {} |
219 | void create() { |
220 | auto callsPublic = std::unique_ptr<Private>(new Private); |
221 | // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: use std::make_unique instead |
222 | // CHECK-FIXES: auto callsPublic = std::make_unique<Private>(); |
223 | auto ptr = std::unique_ptr<Private>(new Private(42)); |
224 | ptr.reset(new Private(42)); |
225 | ptr = std::unique_ptr<Private>(new Private(42)); |
226 | } |
227 | |
228 | virtual ~Private(); |
229 | }; |
230 | |
231 | class Protected { |
232 | protected: |
233 | Protected() {} |
234 | |
235 | public: |
236 | Protected(int, int) {} |
237 | void create() { |
238 | auto callsPublic = std::unique_ptr<Protected>(new Protected(1, 2)); |
239 | // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: use std::make_unique instead |
240 | // CHECK-FIXES: auto callsPublic = std::make_unique<Protected>(1, 2); |
241 | auto ptr = std::unique_ptr<Protected>(new Protected); |
242 | ptr.reset(new Protected); |
243 | ptr = std::unique_ptr<Protected>(new Protected); |
244 | } |
245 | }; |
246 | |
247 | void initialization(int T, Base b) { |
248 | // Test different kinds of initialization of the pointee. |
249 | |
250 | // Direct initialization with parenthesis. |
251 | std::unique_ptr<DPair> PDir1 = std::unique_ptr<DPair>(new DPair(1, T)); |
252 | // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_unique instead |
253 | // CHECK-FIXES: std::unique_ptr<DPair> PDir1 = std::make_unique<DPair>(1, T); |
254 | PDir1.reset(new DPair(1, T)); |
255 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use std::make_unique instead |
256 | // CHECK-FIXES: PDir1 = std::make_unique<DPair>(1, T); |
257 | |
258 | // Direct initialization with braces. |
259 | std::unique_ptr<DPair> PDir2 = std::unique_ptr<DPair>(new DPair{2, T}); |
260 | // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_unique instead |
261 | // CHECK-FIXES: std::unique_ptr<DPair> PDir2 = std::make_unique<DPair>(2, T); |
262 | PDir2.reset(new DPair{2, T}); |
263 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use std::make_unique instead |
264 | // CHECK-FIXES: PDir2 = std::make_unique<DPair>(2, T); |
265 | |
266 | // Aggregate initialization. |
267 | std::unique_ptr<APair> PAggr = std::unique_ptr<APair>(new APair{T, 1}); |
268 | // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_unique instead |
269 | // CHECK-FIXES: std::unique_ptr<APair> PAggr = std::make_unique<APair>(APair{T, 1}); |
270 | PAggr.reset(new APair{T, 1}); |
271 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use std::make_unique instead |
272 | // CHECK-FIXES: std::make_unique<APair>(APair{T, 1}); |
273 | |
274 | // Check aggregate init with intermediate temporaries. |
275 | std::unique_ptr<APair> PAggrTemp = std::unique_ptr<APair>(new APair({T, 1})); |
276 | // CHECK-MESSAGES: :[[@LINE-1]]:38: warning: use std::make_unique instead |
277 | // CHECK-FIXES: std::unique_ptr<APair> PAggrTemp = std::unique_ptr<APair>(new APair({T, 1})); |
278 | PAggrTemp.reset(new APair({T, 1})); |
279 | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::make_unique instead |
280 | // CHECK-FIXES: PAggrTemp.reset(new APair({T, 1})); |
281 | |
282 | // Test different kinds of initialization of the pointee, when the unique_ptr |
283 | // is initialized with braces. |
284 | |
285 | // Direct initialization with parenthesis. |
286 | std::unique_ptr<DPair> PDir3 = std::unique_ptr<DPair>{new DPair(3, T)}; |
287 | // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_unique instead |
288 | // CHECK-FIXES: std::unique_ptr<DPair> PDir3 = std::make_unique<DPair>(3, T); |
289 | |
290 | // Direct initialization with braces. |
291 | std::unique_ptr<DPair> PDir4 = std::unique_ptr<DPair>{new DPair{4, T}}; |
292 | // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_unique instead |
293 | // CHECK-FIXES: std::unique_ptr<DPair> PDir4 = std::make_unique<DPair>(4, T); |
294 | |
295 | // Aggregate initialization. |
296 | std::unique_ptr<APair> PAggr2 = std::unique_ptr<APair>{new APair{T, 2}}; |
297 | // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: use std::make_unique instead |
298 | // CHECK-FIXES: std::unique_ptr<APair> PAggr2 = std::make_unique<APair>(APair{T, 2}); |
299 | |
300 | // Direct initialization with parenthesis, without arguments. |
301 | std::unique_ptr<DPair> PDir5 = std::unique_ptr<DPair>(new DPair()); |
302 | // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_unique instead |
303 | // CHECK-FIXES: std::unique_ptr<DPair> PDir5 = std::make_unique<DPair>(); |
304 | |
305 | // Direct initialization with braces, without arguments. |
306 | std::unique_ptr<DPair> PDir6 = std::unique_ptr<DPair>(new DPair{}); |
307 | // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use std::make_unique instead |
308 | // CHECK-FIXES: std::unique_ptr<DPair> PDir6 = std::make_unique<DPair>(); |
309 | |
310 | // Aggregate initialization without arguments. |
311 | std::unique_ptr<Empty> PEmpty = std::unique_ptr<Empty>(new Empty{}); |
312 | // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: use std::make_unique instead |
313 | // CHECK-FIXES: std::unique_ptr<Empty> PEmpty = std::make_unique<Empty>(Empty{}); |
314 | |
315 | // Initialization with default constructor. |
316 | std::unique_ptr<E> PE1 = std::unique_ptr<E>(new E{}); |
317 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
318 | // CHECK-FIXES: std::unique_ptr<E> PE1 = std::make_unique<E>(); |
319 | PE1.reset(new E{}); |
320 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
321 | // CHECK-FIXES: PE1 = std::make_unique<E>(); |
322 | |
323 | // No warnings for `auto` new expression. |
324 | PE1.reset(new auto(E())); |
325 | |
326 | //============================================================================ |
327 | // NOTE: For initializer-list constructors, the check only gives warnings, |
328 | // and no fixes are generated. |
329 | //============================================================================ |
330 | |
331 | // Initialization with the initializer-list constructor. |
332 | std::unique_ptr<E> PE2 = std::unique_ptr<E>(new E{1, 2}); |
333 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
334 | // CHECK-FIXES: std::unique_ptr<E> PE2 = std::unique_ptr<E>(new E{1, 2}); |
335 | PE2.reset(new E{1, 2}); |
336 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
337 | // CHECK-FIXES: PE2.reset(new E{1, 2}); |
338 | |
339 | // Initialization with default constructor. |
340 | std::unique_ptr<F> PF1 = std::unique_ptr<F>(new F()); |
341 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
342 | // CHECK-FIXES: std::unique_ptr<F> PF1 = std::make_unique<F>(); |
343 | PF1.reset(new F()); |
344 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
345 | // CHECK-FIXES: PF1 = std::make_unique<F>(); |
346 | |
347 | // Initialization with default constructor. |
348 | std::unique_ptr<F> PF2 = std::unique_ptr<F>(new F{}); |
349 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
350 | // CHECK-FIXES: std::unique_ptr<F> PF2 = std::make_unique<F>(); |
351 | PF2.reset(new F()); |
352 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
353 | // CHECK-FIXES: PF2 = std::make_unique<F>(); |
354 | |
355 | // Initialization with the initializer-list constructor. |
356 | std::unique_ptr<F> PF3 = std::unique_ptr<F>(new F{1}); |
357 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
358 | // CHECK-FIXES: std::unique_ptr<F> PF3 = std::unique_ptr<F>(new F{1}); |
359 | PF3.reset(new F{1}); |
360 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
361 | // CHECK-FIXES: PF3.reset(new F{1}); |
362 | |
363 | // Initialization with the initializer-list constructor. |
364 | std::unique_ptr<F> PF4 = std::unique_ptr<F>(new F{1, 2}); |
365 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
366 | // CHECK-FIXES: std::unique_ptr<F> PF4 = std::unique_ptr<F>(new F{1, 2}); |
367 | |
368 | // Initialization with the initializer-list constructor. |
369 | std::unique_ptr<F> PF5 = std::unique_ptr<F>(new F({1, 2})); |
370 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
371 | // CHECK-FIXES: std::unique_ptr<F> PF5 = std::unique_ptr<F>(new F({1, 2})); |
372 | |
373 | // Initialization with the initializer-list constructor as the default |
374 | // constructor is not present. |
375 | std::unique_ptr<G> PG1 = std::unique_ptr<G>(new G{}); |
376 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
377 | // CHECK-FIXES: std::unique_ptr<G> PG1 = std::unique_ptr<G>(new G{}); |
378 | PG1.reset(new G{}); |
379 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
380 | // CHECK-FIXES: PG1.reset(new G{}); |
381 | |
382 | // Initialization with the initializer-list constructor. |
383 | std::unique_ptr<G> PG2 = std::unique_ptr<G>(new G{1}); |
384 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
385 | // CHECK-FIXES: std::unique_ptr<G> PG2 = std::unique_ptr<G>(new G{1}); |
386 | |
387 | // Initialization with the initializer-list constructor. |
388 | std::unique_ptr<G> PG3 = std::unique_ptr<G>(new G{1, 2}); |
389 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
390 | // CHECK-FIXES: std::unique_ptr<G> PG3 = std::unique_ptr<G>(new G{1, 2}); |
391 | |
392 | std::unique_ptr<H> PH1 = std::unique_ptr<H>(new H({1, 2, 3})); |
393 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
394 | // CHECK-FIXES: std::unique_ptr<H> PH1 = std::unique_ptr<H>(new H({1, 2, 3})); |
395 | PH1.reset(new H({1, 2, 3})); |
396 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
397 | // CHECK-FIXES: PH1.reset(new H({1, 2, 3})); |
398 | |
399 | std::unique_ptr<H> PH2 = std::unique_ptr<H>(new H({1, 2, 3}, 1)); |
400 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
401 | // CHECK-FIXES: std::unique_ptr<H> PH2 = std::unique_ptr<H>(new H({1, 2, 3}, 1)); |
402 | PH2.reset(new H({1, 2, 3}, 1)); |
403 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
404 | // CHECK-FIXES: PH2.reset(new H({1, 2, 3}, 1)); |
405 | |
406 | std::unique_ptr<H> PH3 = std::unique_ptr<H>(new H({1, 2, 3}, 1.0)); |
407 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
408 | // CHECK-FIXES: std::unique_ptr<H> PH3 = std::unique_ptr<H>(new H({1, 2, 3}, 1.0)); |
409 | PH3.reset(new H({1, 2, 3}, 1.0)); |
410 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
411 | // CHECK-FIXES: PH3.reset(new H({1, 2, 3}, 1.0)); |
412 | |
413 | std::unique_ptr<I> PI1 = std::unique_ptr<I>(new I(G({1, 2, 3}))); |
414 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
415 | // CHECK-FIXES: std::unique_ptr<I> PI1 = std::make_unique<I>(G({1, 2, 3})); |
416 | PI1.reset(new I(G({1, 2, 3}))); |
417 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
418 | // CHECK-FIXES: PI1 = std::make_unique<I>(G({1, 2, 3})); |
419 | |
420 | std::unique_ptr<J> PJ1 = std::unique_ptr<J>(new J({1, 2}, 1)); |
421 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
422 | // CHECK-FIXES: std::unique_ptr<J> PJ1 = std::unique_ptr<J>(new J({1, 2}, 1)); |
423 | PJ1.reset(new J({1, 2}, 1)); |
424 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
425 | // CHECK-FIXES: PJ1.reset(new J({1, 2}, 1)); |
426 | |
427 | std::unique_ptr<J> PJ2 = std::unique_ptr<J>(new J(E{1, 2}, 1)); |
428 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
429 | // CHECK-FIXES: std::unique_ptr<J> PJ2 = std::unique_ptr<J>(new J(E{1, 2}, 1)); |
430 | PJ2.reset(new J(E{1, 2}, 1)); |
431 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
432 | // CHECK-FIXES: PJ2.reset(new J(E{1, 2}, 1)); |
433 | |
434 | std::unique_ptr<J> PJ3 = std::unique_ptr<J>(new J{ {1, 2}, 1 }); |
435 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
436 | // CHECK-FIXES: std::unique_ptr<J> PJ3 = std::unique_ptr<J>(new J{ {1, 2}, 1 }); |
437 | PJ3.reset(new J{ {1, 2}, 1 }); |
438 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
439 | // CHECK-FIXES: PJ3.reset(new J{ {1, 2}, 1 }); |
440 | |
441 | std::unique_ptr<J> PJ4 = std::unique_ptr<J>(new J{E{1, 2}, 1}); |
442 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead |
443 | // CHECK-FIXES: std::unique_ptr<J> PJ4 = std::unique_ptr<J>(new J{E{1, 2}, 1}); |
444 | PJ4.reset(new J{E{1, 2}, 1}); |
445 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead |
446 | // CHECK-FIXES: PJ4.reset(new J{E{1, 2}, 1}); |
447 | |
448 | std::unique_ptr<Foo> FF = std::unique_ptr<Foo>(new Foo()); |
449 | // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: |
450 | // CHECK-FIXES: std::unique_ptr<Foo> FF = std::make_unique<Foo>(); |
451 | FF.reset(new Foo()); |
452 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: |
453 | // CHECK-FIXES: FF = std::make_unique<Foo>(); |
454 | |
455 | std::unique_ptr<bar::Bar> BB = std::unique_ptr<bar::Bar>(new bar::Bar()); |
456 | // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: |
457 | // CHECK-FIXES: std::unique_ptr<bar::Bar> BB = std::make_unique<bar::Bar>(); |
458 | BB.reset(new bar::Bar()); |
459 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: |
460 | // CHECK-FIXES: BB = std::make_unique<bar::Bar>(); |
461 | |
462 | std::unique_ptr<Foo[]> FFs; |
463 | FFs.reset(new Foo[5]); |
464 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: |
465 | // CHECK-FIXES: FFs = std::make_unique<Foo[]>(5); |
466 | FFs.reset(new Foo[5]()); |
467 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: |
468 | // CHECK-FIXES: FFs = std::make_unique<Foo[]>(5); |
469 | const int Num = 1; |
470 | FFs.reset(new Foo[Num]); |
471 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: |
472 | // CHECK-FIXES: FFs = std::make_unique<Foo[]>(Num); |
473 | int Num2 = 1; |
474 | FFs.reset(new Foo[Num2]); |
475 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: |
476 | // CHECK-FIXES: FFs = std::make_unique<Foo[]>(Num2); |
477 | |
478 | std::unique_ptr<int[]> FI; |
479 | FI.reset(new int[5]()); // value initialization. |
480 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: |
481 | // CHECK-FIXES: FI = std::make_unique<int[]>(5); |
482 | |
483 | // The check doesn't give warnings and fixes for cases where the original new |
484 | // expression does default initialization. |
485 | FI.reset(new int[5]); |
486 | FI.reset(new int[Num]); |
487 | FI.reset(new int[Num2]); |
488 | } |
489 | |
490 | void aliases() { |
491 | typedef std::unique_ptr<int> IntPtr; |
492 | IntPtr Typedef = IntPtr(new int()); |
493 | // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use std::make_unique instead |
494 | // CHECK-FIXES: IntPtr Typedef = std::make_unique<int>(); |
495 | IntPtr Typedef2 = IntPtr(new int); |
496 | |
497 | // We use 'bool' instead of '_Bool'. |
498 | typedef std::unique_ptr<bool> BoolPtr; |
499 | BoolPtr BoolType = BoolPtr(new bool()); |
500 | // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: use std::make_unique instead |
501 | // CHECK-FIXES: BoolPtr BoolType = std::make_unique<bool>(); |
502 | BoolPtr BoolType2 = BoolPtr(new bool); |
503 | |
504 | // We use 'Base' instead of 'struct Base'. |
505 | typedef std::unique_ptr<Base> BasePtr; |
506 | BasePtr StructType = BasePtr(new Base); |
507 | // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: use std::make_unique instead |
508 | // CHECK-FIXES: BasePtr StructType = std::make_unique<Base>(); |
509 | |
510 | #define PTR unique_ptr<int> |
511 | std::unique_ptr<int> Macro = std::PTR(new int()); |
512 | // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: use std::make_unique instead |
513 | // CHECK-FIXES: std::unique_ptr<int> Macro = std::make_unique<int>(); |
514 | std::unique_ptr<int> Macro2 = std::PTR(new int); |
515 | #undef PTR |
516 | |
517 | std::unique_ptr<int> Using = unique_ptr_<int>(new int()); |
518 | // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: use std::make_unique instead |
519 | // CHECK-FIXES: std::unique_ptr<int> Using = std::make_unique<int>(); |
520 | std::unique_ptr<int> Using2 = unique_ptr_<int>(new int); |
521 | } |
522 | |
523 | void whitespaces() { |
524 | // clang-format off |
525 | auto Space = std::unique_ptr <int>(new int()); |
526 | // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: use std::make_unique instead |
527 | // CHECK-FIXES: auto Space = std::make_unique<int>(); |
528 | auto Space2 = std::unique_ptr <int>(new int); |
529 | |
530 | auto Spaces = std :: unique_ptr <int>(new int()); |
531 | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use std::make_unique instead |
532 | // CHECK-FIXES: auto Spaces = std::make_unique<int>(); |
533 | auto Spaces2 = std :: unique_ptr <int>(new int); |
534 | // clang-format on |
535 | } |
536 | |
537 | void nesting() { |
538 | auto Nest = std::unique_ptr<std::unique_ptr<int>>(new std::unique_ptr<int>(new int)); |
539 | // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: use std::make_unique instead |
540 | // CHECK-FIXES: auto Nest = std::make_unique<std::unique_ptr<int>>(new int); |
541 | Nest.reset(new std::unique_ptr<int>(new int)); |
542 | // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use std::make_unique instead |
543 | // CHECK-FIXES: Nest = std::make_unique<std::unique_ptr<int>>(new int); |
544 | Nest->reset(new int()); |
545 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use std::make_unique instead |
546 | // CHECK-FIXES: *Nest = std::make_unique<int>(); |
547 | } |
548 | |
549 | void reset() { |
550 | std::unique_ptr<int> P; |
551 | P.reset(); |
552 | P.reset(nullptr); |
553 | P.reset(new int()); |
554 | // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use std::make_unique instead |
555 | // CHECK-FIXES: P = std::make_unique<int>(); |
556 | P.reset(new int); |
557 | |
558 | auto Q = &P; |
559 | Q->reset(new int()); |
560 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use std::make_unique instead |
561 | // CHECK-FIXES: *Q = std::make_unique<int>(); |
562 | Q->reset(new int); |
563 | } |
564 | |
565 | #define DEFINE(...) __VA_ARGS__ |
566 | template<typename T> |
567 | void g2(std::unique_ptr<Foo> *t) { |
568 | DEFINE(auto p = std::unique_ptr<Foo>(new Foo); t->reset(new Foo);); |
569 | } |
570 | void macro() { |
571 | std::unique_ptr<Foo> *t; |
572 | g2<bar::Bar>(t); |
573 | } |
574 | #undef DEFINE |
575 | |
576 | class UniqueFoo : public std::unique_ptr<Foo> { |
577 | public: |
578 | void foo() { |
579 | reset(new Foo); |
580 | this->reset(new Foo); |
581 | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use std::make_unique instead |
582 | // CHECK-FIXES: *this = std::make_unique<Foo>(); |
583 | this->reset(new Foo()); |
584 | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use std::make_unique instead |
585 | // CHECK-FIXES: *this = std::make_unique<Foo>(); |
586 | (*this).reset(new Foo); |
587 | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::make_unique instead |
588 | // CHECK-FIXES: (*this) = std::make_unique<Foo>(); |
589 | (*this).reset(new Foo()); |
590 | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use std::make_unique instead |
591 | // CHECK-FIXES: (*this) = std::make_unique<Foo>(); |
592 | } |
593 | }; |
594 | |
595 | // Ignore statements inside a template instantiation. |
596 | template<typename T> |
597 | void template_fun(T* t) { |
598 | std::unique_ptr<T> t2 = std::unique_ptr<T>(new T); |
599 | std::unique_ptr<T> t3 = std::unique_ptr<T>(new T()); |
600 | t2.reset(new T); |
601 | t3.reset(new T()); |
602 | } |
603 | |
604 | void invoke_template() { |
605 | Foo* foo; |
606 | template_fun(t: foo); |
607 | } |
608 | |
609 | void no_fix_for_invalid_new_loc() { |
610 | // FIXME: Although the code is valid, the end location of `new struct Base` is |
611 | // invalid. Correct it once https://bugs.llvm.org/show_bug.cgi?id=35952 is |
612 | // fixed. |
613 | auto T = std::unique_ptr<Base>(new struct Base); |
614 | // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: use std::make_unique instead |
615 | // CHECK-FIXES: auto T = std::unique_ptr<Base>(new struct Base); |
616 | } |
617 | |