• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %check_clang_tidy -std=c++14-or-later %s modernize-make-unique %t -- -- -I %S/Inputs/modernize-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 {
DPairDPair22   DPair() : a(0), b(0) {}
DPairDPair23   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 
getPointer()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 
getPointerValue()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 
basic()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:
Private(int z)215   Private(int z) {}
216 
217 public:
Private()218   Private() {}
create()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:
Protected()233   Protected() {}
234 
235 public:
Protected(int,int)236   Protected(int, int) {}
create()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 
initialization(int T,Base b)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 
aliases()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 
whitespaces()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 
nesting()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 
reset()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>
g2(std::unique_ptr<Foo> * t)567 void g2(std::unique_ptr<Foo> *t) {
568   DEFINE(auto p = std::unique_ptr<Foo>(new Foo); t->reset(new Foo););
569 }
macro()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:
foo()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>
template_fun(T * 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 
invoke_template()604 void invoke_template() {
605   Foo* foo;
606   template_fun(foo);
607 }
608 
no_fix_for_invalid_new_loc()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