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