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*89a1d03eSRichardvoid 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*89a1d03eSRichardtemplate <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*89a1d03eSRichardtemplate <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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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