xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/shrink-to-fit.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s modernize-shrink-to-fit %t
2*89a1d03eSRichard 
3*89a1d03eSRichard namespace std {
4*89a1d03eSRichard template <typename T> struct vector { void swap(vector &other); };
5*89a1d03eSRichard }
6*89a1d03eSRichard 
f()7*89a1d03eSRichard void f() {
8*89a1d03eSRichard   std::vector<int> v;
9*89a1d03eSRichard 
10*89a1d03eSRichard   std::vector<int>(v).swap(v);
11*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the shrink_to_fit method should be used to reduce the capacity of a shrinkable container [modernize-shrink-to-fit]
12*89a1d03eSRichard   // CHECK-FIXES: {{^  }}v.shrink_to_fit();{{$}}
13*89a1d03eSRichard 
14*89a1d03eSRichard   std::vector<int> &vref = v;
15*89a1d03eSRichard   std::vector<int>(vref).swap(vref);
16*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the shrink_to_fit method should
17*89a1d03eSRichard   // CHECK-FIXES: {{^  }}vref.shrink_to_fit();{{$}}
18*89a1d03eSRichard 
19*89a1d03eSRichard   std::vector<int> *vptr = &v;
20*89a1d03eSRichard   std::vector<int>(*vptr).swap(*vptr);
21*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the shrink_to_fit method should
22*89a1d03eSRichard   // CHECK-FIXES: {{^  }}vptr->shrink_to_fit();{{$}}
23*89a1d03eSRichard }
24*89a1d03eSRichard 
25*89a1d03eSRichard struct X {
26*89a1d03eSRichard   std::vector<int> v;
fX27*89a1d03eSRichard   void f() {
28*89a1d03eSRichard     std::vector<int>(v).swap(v);
29*89a1d03eSRichard     // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: the shrink_to_fit method should
30*89a1d03eSRichard     // CHECK-FIXES: {{^    }}v.shrink_to_fit();{{$}}
31*89a1d03eSRichard 
32*89a1d03eSRichard     std::vector<int> *vptr = &v;
33*89a1d03eSRichard     std::vector<int>(*vptr).swap(*vptr);
34*89a1d03eSRichard     // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: the shrink_to_fit method should
35*89a1d03eSRichard     // CHECK-FIXES: {{^    }}vptr->shrink_to_fit();{{$}}
36*89a1d03eSRichard   }
37*89a1d03eSRichard };
38*89a1d03eSRichard 
g()39*89a1d03eSRichard template <typename T> void g() {
40*89a1d03eSRichard   std::vector<int> v;
41*89a1d03eSRichard   std::vector<int>(v).swap(v);
42*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the shrink_to_fit method should
43*89a1d03eSRichard   // CHECK-FIXES: {{^  }}v.shrink_to_fit();{{$}}
44*89a1d03eSRichard 
45*89a1d03eSRichard   std::vector<T> v2;
46*89a1d03eSRichard   std::vector<T>(v2).swap(v2);
47*89a1d03eSRichard   // CHECK-FIXES: {{^  }}std::vector<T>(v2).swap(v2);{{$}}
48*89a1d03eSRichard }
49*89a1d03eSRichard 
g2()50*89a1d03eSRichard template <typename T> void g2() {
51*89a1d03eSRichard   std::vector<int> v;
52*89a1d03eSRichard   std::vector<int>(v).swap(v);
53*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the shrink_to_fit method should
54*89a1d03eSRichard   // CHECK-FIXES: {{^  }}v.shrink_to_fit();{{$}}
55*89a1d03eSRichard 
56*89a1d03eSRichard   T v3;
57*89a1d03eSRichard   T(v3).swap(v3);
58*89a1d03eSRichard   // CHECK-FIXES: {{^  }}T(v3).swap(v3);{{$}}
59*89a1d03eSRichard }
60*89a1d03eSRichard 
61*89a1d03eSRichard #define COPY_AND_SWAP_INT_VEC(x) std::vector<int>(x).swap(x)
62*89a1d03eSRichard // CHECK-FIXES: #define COPY_AND_SWAP_INT_VEC(x) std::vector<int>(x).swap(x)
63*89a1d03eSRichard 
h()64*89a1d03eSRichard void h() {
65*89a1d03eSRichard   g<int>();
66*89a1d03eSRichard   g<double>();
67*89a1d03eSRichard   g<bool>();
68*89a1d03eSRichard   g2<std::vector<int>>();
69*89a1d03eSRichard   std::vector<int> v;
70*89a1d03eSRichard   COPY_AND_SWAP_INT_VEC(v);
71*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the shrink_to_fit method should
72*89a1d03eSRichard   // CHECK-FIXES: {{^  }}COPY_AND_SWAP_INT_VEC(v);{{$}}
73*89a1d03eSRichard }
74*89a1d03eSRichard 
PR38315()75*89a1d03eSRichard void PR38315() {
76*89a1d03eSRichard   typedef std::vector<int> Vector;
77*89a1d03eSRichard   Vector v;
78*89a1d03eSRichard   Vector(v).swap(v);
79*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the shrink_to_fit method should
80*89a1d03eSRichard   // CHECK-FIXES: {{^  }}v.shrink_to_fit();{{$}}
81*89a1d03eSRichard 
82*89a1d03eSRichard   using Vector2 = std::vector<int>;
83*89a1d03eSRichard   Vector2 v2;
84*89a1d03eSRichard   Vector2(v2).swap(v2);
85*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: the shrink_to_fit method should
86*89a1d03eSRichard   // CHECK-FIXES: {{^  }}v2.shrink_to_fit();{{$}}
87*89a1d03eSRichard }
88