|
152 | 152 | #define umax(x, y) \
|
153 | 153 | __careful_cmp(max, (x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull)
|
154 | 154 |
|
| 155 | +#define __careful_op3(op, x, y, z, ux, uy, uz) ({ \ |
| 156 | + __auto_type ux = (x); __auto_type uy = (y);__auto_type uz = (z);\ |
| 157 | + BUILD_BUG_ON_MSG(!__types_ok3(x,y,z,ux,uy,uz), \ |
| 158 | + #op"3("#x", "#y", "#z") signedness error"); \ |
| 159 | + __cmp(op, ux, __cmp(op, uy, uz)); }) |
| 160 | + |
155 | 161 | /**
|
156 | 162 | * min3 - return minimum of three values
|
157 | 163 | * @x: first value
|
158 | 164 | * @y: second value
|
159 | 165 | * @z: third value
|
160 | 166 | */
|
161 |
| -#define min3(x, y, z) min((typeof(x))min(x, y), z) |
| 167 | +#define min3(x, y, z) \ |
| 168 | + __careful_op3(min, x, y, z, __UNIQUE_ID(x_), __UNIQUE_ID(y_), __UNIQUE_ID(z_)) |
162 | 169 |
|
163 | 170 | /**
|
164 | 171 | * max3 - return maximum of three values
|
165 | 172 | * @x: first value
|
166 | 173 | * @y: second value
|
167 | 174 | * @z: third value
|
168 | 175 | */
|
169 |
| -#define max3(x, y, z) max((typeof(x))max(x, y), z) |
| 176 | +#define max3(x, y, z) \ |
| 177 | + __careful_op3(max, x, y, z, __UNIQUE_ID(x_), __UNIQUE_ID(y_), __UNIQUE_ID(z_)) |
170 | 178 |
|
171 | 179 | /**
|
172 | 180 | * min_not_zero - return the minimum that is _not_ zero, unless both are zero
|
|
0 commit comments