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