|
183 | 183 | #define __clamp(val, lo, hi) \
|
184 | 184 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
|
185 | 185 |
|
186 |
| -#define __clamp_once(val, lo, hi, uval, ulo, uhi) ({ \ |
187 |
| - __auto_type uval = (val); \ |
188 |
| - __auto_type ulo = (lo); \ |
189 |
| - __auto_type uhi = (hi); \ |
| 186 | +#define __clamp_once(type, val, lo, hi, uval, ulo, uhi) ({ \ |
| 187 | + type uval = (val); \ |
| 188 | + type ulo = (lo); \ |
| 189 | + type uhi = (hi); \ |
190 | 190 | BUILD_BUG_ON_MSG(statically_true(ulo > uhi), \
|
191 | 191 | "clamp() low limit " #lo " greater than high limit " #hi); \
|
192 | 192 | BUILD_BUG_ON_MSG(!__types_ok3(uval, ulo, uhi), \
|
193 | 193 | "clamp("#val", "#lo", "#hi") signedness error"); \
|
194 | 194 | __clamp(uval, ulo, uhi); })
|
195 | 195 |
|
196 |
| -#define __careful_clamp(val, lo, hi) \ |
197 |
| - __clamp_once(val, lo, hi, __UNIQUE_ID(v_), __UNIQUE_ID(l_), __UNIQUE_ID(h_)) |
| 196 | +#define __careful_clamp(type, val, lo, hi) \ |
| 197 | + __clamp_once(type, val, lo, hi, __UNIQUE_ID(v_), __UNIQUE_ID(l_), __UNIQUE_ID(h_)) |
198 | 198 |
|
199 | 199 | /**
|
200 |
| - * clamp - return a value clamped to a given range with strict typechecking |
| 200 | + * clamp - return a value clamped to a given range with typechecking |
201 | 201 | * @val: current value
|
202 | 202 | * @lo: lowest allowable value
|
203 | 203 | * @hi: highest allowable value
|
204 | 204 | *
|
205 |
| - * This macro does strict typechecking of @lo/@hi to make sure they are of the |
206 |
| - * same type as @val. See the unnecessary pointer comparisons. |
| 205 | + * This macro checks @val/@lo/@hi to make sure they have compatible |
| 206 | + * signedness. |
207 | 207 | */
|
208 |
| -#define clamp(val, lo, hi) __careful_clamp(val, lo, hi) |
| 208 | +#define clamp(val, lo, hi) __careful_clamp(__auto_type, val, lo, hi) |
209 | 209 |
|
210 | 210 | /**
|
211 | 211 | * clamp_t - return a value clamped to a given range using a given type
|
|
217 | 217 | * This macro does no typechecking and uses temporary variables of type
|
218 | 218 | * @type to make all the comparisons.
|
219 | 219 | */
|
220 |
| -#define clamp_t(type, val, lo, hi) __careful_clamp((type)(val), (type)(lo), (type)(hi)) |
| 220 | +#define clamp_t(type, val, lo, hi) __careful_clamp(type, val, lo, hi) |
221 | 221 |
|
222 | 222 | /**
|
223 | 223 | * clamp_val - return a value clamped to a given range using val's type
|
|
230 | 230 | * type and @lo and @hi are literals that will otherwise be assigned a signed
|
231 | 231 | * integer type.
|
232 | 232 | */
|
233 |
| -#define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi) |
| 233 | +#define clamp_val(val, lo, hi) __careful_clamp(typeof(val), val, lo, hi) |
234 | 234 |
|
235 | 235 | /*
|
236 | 236 | * Do not check the array parameter using __must_be_array().
|
|
0 commit comments