xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/readability/use-std-min-max.cpp (revision 32bcd41adcc664f6d690efc9b7cd209ac9c65f68)
1c13e271aSBhuminjay Soni // RUN: %check_clang_tidy -std=c++11-or-later %s readability-use-std-min-max %t -- -- -fno-delayed-template-parsing
2c13e271aSBhuminjay Soni #define MY_MACRO_MIN(a, b) ((a) < (b) ? (a) : (b))
3c13e271aSBhuminjay Soni 
4c13e271aSBhuminjay Soni constexpr int myConstexprMin(int a, int b) {
5c13e271aSBhuminjay Soni   return a < b ? a : b;
6c13e271aSBhuminjay Soni }
7c13e271aSBhuminjay Soni 
8c13e271aSBhuminjay Soni constexpr int myConstexprMax(int a, int b) {
9c13e271aSBhuminjay Soni   return a > b ? a : b;
10c13e271aSBhuminjay Soni }
11c13e271aSBhuminjay Soni 
12c13e271aSBhuminjay Soni #define MY_IF_MACRO(condition, statement) \
13c13e271aSBhuminjay Soni   if (condition) {                        \
14c13e271aSBhuminjay Soni     statement                             \
15c13e271aSBhuminjay Soni   }
16c13e271aSBhuminjay Soni 
17c13e271aSBhuminjay Soni class MyClass {
18c13e271aSBhuminjay Soni public:
19c13e271aSBhuminjay Soni   int member1;
20c13e271aSBhuminjay Soni   int member2;
21c13e271aSBhuminjay Soni };
22c13e271aSBhuminjay Soni 
23c13e271aSBhuminjay Soni template<typename T>
24c13e271aSBhuminjay Soni 
25c13e271aSBhuminjay Soni void foo(T value7) {
26c13e271aSBhuminjay Soni   int value1,value2,value3;
27c13e271aSBhuminjay Soni 
28c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `<` [readability-use-std-min-max]
29c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::max(value1, value2);
30c13e271aSBhuminjay Soni   if (value1 < value2)
31c13e271aSBhuminjay Soni     value1 = value2;
32c13e271aSBhuminjay Soni 
33c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `<` [readability-use-std-min-max]
34c13e271aSBhuminjay Soni   // CHECK-FIXES: value2 = std::min(value1, value2);
35c13e271aSBhuminjay Soni   if (value1 < value2)
36c13e271aSBhuminjay Soni     value2 = value1;
37c13e271aSBhuminjay Soni 
38c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `>` [readability-use-std-min-max]
39c13e271aSBhuminjay Soni   // CHECK-FIXES: value2 = std::min(value2, value1);
40c13e271aSBhuminjay Soni   if (value2 > value1)
41c13e271aSBhuminjay Soni     value2 = value1;
42c13e271aSBhuminjay Soni 
43c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `>` [readability-use-std-min-max]
44c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::max(value2, value1);
45c13e271aSBhuminjay Soni   if (value2 > value1)
46c13e271aSBhuminjay Soni     value1 = value2;
47c13e271aSBhuminjay Soni 
48c13e271aSBhuminjay Soni   // No suggestion needed here
49c13e271aSBhuminjay Soni   if (value1 == value2)
50c13e271aSBhuminjay Soni     value1 = value2;
51c13e271aSBhuminjay Soni 
52c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+3]]:3: warning: use `std::max` instead of `<` [readability-use-std-min-max]
53c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::max<int>(value1, value4);
54c13e271aSBhuminjay Soni   short value4;
55c13e271aSBhuminjay Soni   if(value1<value4)
56c13e271aSBhuminjay Soni     value1=value4;
57c13e271aSBhuminjay Soni 
58c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `<` [readability-use-std-min-max]
59c13e271aSBhuminjay Soni   // CHECK-FIXES: value3 = std::min(value1+value2, value3);
60c13e271aSBhuminjay Soni   if(value1+value2<value3)
61c13e271aSBhuminjay Soni     value3 = value1+value2;
62c13e271aSBhuminjay Soni 
63c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `<` [readability-use-std-min-max]
64c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::max(value1, myConstexprMin(value2, value3));
65c13e271aSBhuminjay Soni   if (value1 < myConstexprMin(value2, value3))
66c13e271aSBhuminjay Soni     value1 = myConstexprMin(value2, value3);
67c13e271aSBhuminjay Soni 
68c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `>` [readability-use-std-min-max]
69c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::min(value1, myConstexprMax(value2, value3));
70c13e271aSBhuminjay Soni   if (value1 > myConstexprMax(value2, value3))
71c13e271aSBhuminjay Soni     value1 = myConstexprMax(value2, value3);
72c13e271aSBhuminjay Soni 
73c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `<=` [readability-use-std-min-max]
74c13e271aSBhuminjay Soni   // CHECK-FIXES: value2 = std::min(value1, value2);
75c13e271aSBhuminjay Soni   if (value1 <= value2)
76c13e271aSBhuminjay Soni     value2 = value1;
77c13e271aSBhuminjay Soni 
78c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `<=` [readability-use-std-min-max]
79c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::max(value1, value2);
80c13e271aSBhuminjay Soni   if (value1 <= value2)
81c13e271aSBhuminjay Soni     value1 = value2;
82c13e271aSBhuminjay Soni 
83c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `>=` [readability-use-std-min-max]
84c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::max(value2, value1);
85c13e271aSBhuminjay Soni   if (value2 >= value1)
86c13e271aSBhuminjay Soni     value1 = value2;
87c13e271aSBhuminjay Soni 
88c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `>=` [readability-use-std-min-max]
89c13e271aSBhuminjay Soni   // CHECK-FIXES: value2 = std::min(value2, value1);
90c13e271aSBhuminjay Soni   if (value2 >= value1)
91c13e271aSBhuminjay Soni     value2 = value1;
92c13e271aSBhuminjay Soni 
93c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+3]]:3: warning: use `std::max` instead of `<` [readability-use-std-min-max]
94c13e271aSBhuminjay Soni   // CHECK-FIXES: obj.member1 = std::max(obj.member1, obj.member2);
95c13e271aSBhuminjay Soni   MyClass obj;
96c13e271aSBhuminjay Soni   if (obj.member1 < obj.member2)
97c13e271aSBhuminjay Soni     obj.member1 = obj.member2;
98c13e271aSBhuminjay Soni 
99c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `<` [readability-use-std-min-max]
100c13e271aSBhuminjay Soni   // CHECK-FIXES: obj.member2 = std::min(obj.member1, obj.member2);
101c13e271aSBhuminjay Soni   if (obj.member1 < obj.member2)
102c13e271aSBhuminjay Soni     obj.member2 = obj.member1;
103c13e271aSBhuminjay Soni 
104c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `>` [readability-use-std-min-max]
105c13e271aSBhuminjay Soni   // CHECK-FIXES: obj.member2 = std::min(obj.member2, obj.member1);
106c13e271aSBhuminjay Soni   if (obj.member2 > obj.member1)
107c13e271aSBhuminjay Soni     obj.member2 = obj.member1;
108c13e271aSBhuminjay Soni 
109c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `>` [readability-use-std-min-max]
110c13e271aSBhuminjay Soni   // CHECK-FIXES: obj.member1 = std::max(obj.member2, obj.member1);
111c13e271aSBhuminjay Soni   if (obj.member2 > obj.member1)
112c13e271aSBhuminjay Soni     obj.member1 = obj.member2;
113c13e271aSBhuminjay Soni 
114c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `<` [readability-use-std-min-max]
115c13e271aSBhuminjay Soni   // CHECK-FIXES: obj.member1 = std::max<int>(obj.member1, value4);
116c13e271aSBhuminjay Soni   if (obj.member1 < value4)
117c13e271aSBhuminjay Soni     obj.member1 = value4;
118c13e271aSBhuminjay Soni 
119c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `<` [readability-use-std-min-max]
120c13e271aSBhuminjay Soni   // CHECK-FIXES: value3 = std::min(obj.member1 + value2, value3);
121c13e271aSBhuminjay Soni   if (obj.member1 + value2 < value3)
122c13e271aSBhuminjay Soni     value3 = obj.member1 + value2;
123c13e271aSBhuminjay Soni 
124c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `<=` [readability-use-std-min-max]
125c13e271aSBhuminjay Soni   // CHECK-FIXES: obj.member2 = std::min(value1, obj.member2);
126c13e271aSBhuminjay Soni   if (value1 <= obj.member2)
127c13e271aSBhuminjay Soni     obj.member2 = value1;
128c13e271aSBhuminjay Soni 
129c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `<=` [readability-use-std-min-max]
130c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::max(value1, obj.member2);
131c13e271aSBhuminjay Soni   if (value1 <= obj.member2)
132c13e271aSBhuminjay Soni     value1 = obj.member2;
133c13e271aSBhuminjay Soni 
134c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `>=` [readability-use-std-min-max]
135c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::max(obj.member2, value1);
136c13e271aSBhuminjay Soni   if (obj.member2 >= value1)
137c13e271aSBhuminjay Soni     value1 = obj.member2;
138c13e271aSBhuminjay Soni 
139c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `>=` [readability-use-std-min-max]
140c13e271aSBhuminjay Soni   // CHECK-FIXES: obj.member2 = std::min(obj.member2, value1);
141c13e271aSBhuminjay Soni   if (obj.member2 >= value1)
142c13e271aSBhuminjay Soni     obj.member2 = value1;
143c13e271aSBhuminjay Soni 
144c13e271aSBhuminjay Soni   // No suggestion needed here
145c13e271aSBhuminjay Soni   if (MY_MACRO_MIN(value1, value2) < value3)
146c13e271aSBhuminjay Soni     value3 = MY_MACRO_MIN(value1, value2);
147c13e271aSBhuminjay Soni 
148c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `<` [readability-use-std-min-max]
149c13e271aSBhuminjay Soni   // CHECK-FIXES: value4 = std::max<int>(value4, value2);
150c13e271aSBhuminjay Soni   if (value4 < value2){
151c13e271aSBhuminjay Soni     value4 = value2;
152c13e271aSBhuminjay Soni   }
153c13e271aSBhuminjay Soni 
154c13e271aSBhuminjay Soni   // No suggestion needed here
155c13e271aSBhuminjay Soni   if(value1 < value2)
156c13e271aSBhuminjay Soni     value2 = value1;
157c13e271aSBhuminjay Soni   else
158c13e271aSBhuminjay Soni     value2 = value3;
159c13e271aSBhuminjay Soni 
160c13e271aSBhuminjay Soni   // No suggestion needed here
161c13e271aSBhuminjay Soni   if(value1<value2){
162c13e271aSBhuminjay Soni     value2 = value1;
163c13e271aSBhuminjay Soni   }
164c13e271aSBhuminjay Soni   else{
165c13e271aSBhuminjay Soni     value2 = value3;
166c13e271aSBhuminjay Soni   }
167c13e271aSBhuminjay Soni 
168c13e271aSBhuminjay Soni   // No suggestion needed here
169c13e271aSBhuminjay Soni   if(value1<value2){
170c13e271aSBhuminjay Soni     value2 = value1;
171c13e271aSBhuminjay Soni     int res = value1 + value2;
172c13e271aSBhuminjay Soni   }
173c13e271aSBhuminjay Soni 
174c13e271aSBhuminjay Soni   // No suggestion needed here
175c13e271aSBhuminjay Soni   MY_IF_MACRO(value1 < value2, value1 = value2;)
176c13e271aSBhuminjay Soni 
177c13e271aSBhuminjay Soni   // No suggestion needed here
178c13e271aSBhuminjay Soni   if(value1<value2){
179c13e271aSBhuminjay Soni     value1 = value2;
180c13e271aSBhuminjay Soni   }
181c13e271aSBhuminjay Soni   else if(value1>value2){
182c13e271aSBhuminjay Soni     value2 = value1;
183c13e271aSBhuminjay Soni   }
184c13e271aSBhuminjay Soni 
185c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+3]]:5: warning: use `std::max` instead of `<` [readability-use-std-min-max]
186c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::max(value1, value3);
187c13e271aSBhuminjay Soni   if(value1 == value2){
188c13e271aSBhuminjay Soni     if(value1<value3)
189c13e271aSBhuminjay Soni       value1 = value3;
190c13e271aSBhuminjay Soni   }
191c13e271aSBhuminjay Soni 
192c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+5]]:7: warning: use `std::max` instead of `<` [readability-use-std-min-max]
193c13e271aSBhuminjay Soni   // CHECK-FIXES: value1 = std::max<int>(value1, value4);
194c13e271aSBhuminjay Soni   if(value1 == value2){
195c13e271aSBhuminjay Soni     if(value2 == value3){
196c13e271aSBhuminjay Soni       value3+=1;
197c13e271aSBhuminjay Soni       if(value1<value4){
198c13e271aSBhuminjay Soni         value1 = value4;
199c13e271aSBhuminjay Soni       }
200c13e271aSBhuminjay Soni     }
201c13e271aSBhuminjay Soni     else if(value3>value2){
202c13e271aSBhuminjay Soni       value2 = value3;
203c13e271aSBhuminjay Soni     }
204c13e271aSBhuminjay Soni   }
205c13e271aSBhuminjay Soni 
206c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+4]]:3: warning: use `std::min` instead of `<` [readability-use-std-min-max]
207c13e271aSBhuminjay Soni   // CHECK-FIXES: value6 = std::min<unsigned int>(value5, value6);
208c13e271aSBhuminjay Soni   unsigned int value5;
209c13e271aSBhuminjay Soni   unsigned char value6;
210c13e271aSBhuminjay Soni   if(value5<value6){
211c13e271aSBhuminjay Soni     value6 = value5;
212c13e271aSBhuminjay Soni   }
213c13e271aSBhuminjay Soni 
214c13e271aSBhuminjay Soni   //No suggestion needed here
215c13e271aSBhuminjay Soni   if(value7<value6){
216c13e271aSBhuminjay Soni     value6 = value7;
217c13e271aSBhuminjay Soni   }
218c13e271aSBhuminjay Soni 
219c13e271aSBhuminjay Soni   //CHECK-MESSAGES: :[[@LINE+3]]:3: warning: use `std::min` instead of `<` [readability-use-std-min-max]
220c13e271aSBhuminjay Soni   //CHECK-FIXES: value1 = std::min(value8, value1);
221c13e271aSBhuminjay Soni   const int value8 = 5;
222c13e271aSBhuminjay Soni   if(value8<value1)
223c13e271aSBhuminjay Soni     value1 = value8;
224c13e271aSBhuminjay Soni 
225c13e271aSBhuminjay Soni   //CHECK-MESSAGES: :[[@LINE+3]]:3: warning: use `std::min` instead of `<` [readability-use-std-min-max]
226c13e271aSBhuminjay Soni   //CHECK-FIXES: value1 = std::min(value9, value1);
227c13e271aSBhuminjay Soni   volatile int value9 = 6;
228c13e271aSBhuminjay Soni   if(value9<value1)
229c13e271aSBhuminjay Soni     value1 = value9;
230c13e271aSBhuminjay Soni }
231c13e271aSBhuminjay Soni 
232c13e271aSBhuminjay Soni using my_size = unsigned long long;
233c13e271aSBhuminjay Soni 
234c13e271aSBhuminjay Soni template<typename T>
235c13e271aSBhuminjay Soni struct MyVector
236c13e271aSBhuminjay Soni {
237c13e271aSBhuminjay Soni     using size_type = my_size;
238c13e271aSBhuminjay Soni     size_type size() const;
239c13e271aSBhuminjay Soni };
240c13e271aSBhuminjay Soni 
241c13e271aSBhuminjay Soni void testVectorSizeType() {
242c13e271aSBhuminjay Soni   MyVector<int> v;
243c13e271aSBhuminjay Soni   unsigned int value;
244c13e271aSBhuminjay Soni 
245c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `>` [readability-use-std-min-max]
246c13e271aSBhuminjay Soni   // CHECK-FIXES: value = std::max<my_size>(v.size(), value);
247c13e271aSBhuminjay Soni   if (v.size() > value)
248c13e271aSBhuminjay Soni     value = v.size();
249c13e271aSBhuminjay Soni 
250c13e271aSBhuminjay Soni   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `<` [readability-use-std-min-max]
251c13e271aSBhuminjay Soni   // CHECK-FIXES: value = std::max<my_size>(value, v.size());
252c13e271aSBhuminjay Soni   if (value < v.size())
253c13e271aSBhuminjay Soni     value = v.size();
254c13e271aSBhuminjay Soni }
255*32bcd41aSCongcong Cai 
256*32bcd41aSCongcong Cai namespace gh121676 {
257*32bcd41aSCongcong Cai 
258*32bcd41aSCongcong Cai void useLeft() {
259*32bcd41aSCongcong Cai   using U16 = unsigned short;
260*32bcd41aSCongcong Cai   U16 I = 0;
261*32bcd41aSCongcong Cai   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `<` [readability-use-std-min-max]
262*32bcd41aSCongcong Cai   // CHECK-FIXES: I = std::max<U16>(I, 16U);
263*32bcd41aSCongcong Cai   if (I < 16U)
264*32bcd41aSCongcong Cai     I = 16U;
265*32bcd41aSCongcong Cai }
266*32bcd41aSCongcong Cai void useRight() {
267*32bcd41aSCongcong Cai   using U16 = unsigned short;
268*32bcd41aSCongcong Cai   U16 I = 0;
269*32bcd41aSCongcong Cai   // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `<` [readability-use-std-min-max]
270*32bcd41aSCongcong Cai   // CHECK-FIXES: I = std::min<U16>(16U, I);
271*32bcd41aSCongcong Cai   if (16U < I)
272*32bcd41aSCongcong Cai     I = 16U;
273*32bcd41aSCongcong Cai }
274*32bcd41aSCongcong Cai 
275*32bcd41aSCongcong Cai } // namespace gh121676
276