Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

minmax.h: reduce the #define expansion of min(), max() and clamp()

Since the test for signed values being non-negative only relies on
__builtion_constant_p() (not is_constexpr()) it can use the 'ux' variable
instead of the caller supplied expression. This means that the #define
parameters are only expanded twice. Once in the code and once quoted in
the error message.

Link: https://lkml.kernel.org/r/051afc171806425da991908ed8688a98@AcuMS.aculab.com
Signed-off-by: David Laight <david.laight@aculab.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Arnd Bergmann <arnd@kernel.org>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Dan Carpenter <dan.carpenter@linaro.org>
Cc: Jason A. Donenfeld <Jason@zx2c4.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Mateusz Guzik <mjguzik@gmail.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Pedro Falcato <pedro.falcato@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

David Laight and committed by
Andrew Morton
b280bb27 10666e99

+12 -12
+12 -12
include/linux/minmax.h
··· 46 46 * comparison, and these expressions only need to be careful to not cause 47 47 * warnings for pointer use. 48 48 */ 49 - #define __signed_type_use(x, ux) (2 + __is_nonneg(x, ux)) 50 - #define __unsigned_type_use(x, ux) (1 + 2 * (sizeof(ux) < 4)) 51 - #define __sign_use(x, ux) (is_signed_type(typeof(ux)) ? \ 52 - __signed_type_use(x, ux) : __unsigned_type_use(x, ux)) 49 + #define __signed_type_use(ux) (2 + __is_nonneg(ux)) 50 + #define __unsigned_type_use(ux) (1 + 2 * (sizeof(ux) < 4)) 51 + #define __sign_use(ux) (is_signed_type(typeof(ux)) ? \ 52 + __signed_type_use(ux) : __unsigned_type_use(ux)) 53 53 54 54 /* 55 55 * Check whether a signed value is always non-negative. ··· 71 71 #else 72 72 #define __signed_type(ux) typeof(__builtin_choose_expr(sizeof(ux) > 4, 1LL, 1L)) 73 73 #endif 74 - #define __is_nonneg(x, ux) statically_true((__signed_type(ux))(x) >= 0) 74 + #define __is_nonneg(ux) statically_true((__signed_type(ux))(ux) >= 0) 75 75 76 - #define __types_ok(x, y, ux, uy) \ 77 - (__sign_use(x, ux) & __sign_use(y, uy)) 76 + #define __types_ok(ux, uy) \ 77 + (__sign_use(ux) & __sign_use(uy)) 78 78 79 - #define __types_ok3(x, y, z, ux, uy, uz) \ 80 - (__sign_use(x, ux) & __sign_use(y, uy) & __sign_use(z, uz)) 79 + #define __types_ok3(ux, uy, uz) \ 80 + (__sign_use(ux) & __sign_use(uy) & __sign_use(uz)) 81 81 82 82 #define __cmp_op_min < 83 83 #define __cmp_op_max > ··· 92 92 93 93 #define __careful_cmp_once(op, x, y, ux, uy) ({ \ 94 94 __auto_type ux = (x); __auto_type uy = (y); \ 95 - BUILD_BUG_ON_MSG(!__types_ok(x, y, ux, uy), \ 95 + BUILD_BUG_ON_MSG(!__types_ok(ux, uy), \ 96 96 #op"("#x", "#y") signedness error"); \ 97 97 __cmp(op, ux, uy); }) 98 98 ··· 109 109 static_assert(__builtin_choose_expr(__is_constexpr((lo) > (hi)), \ 110 110 (lo) <= (hi), true), \ 111 111 "clamp() low limit " #lo " greater than high limit " #hi); \ 112 - BUILD_BUG_ON_MSG(!__types_ok3(val, lo, hi, uval, ulo, uhi), \ 112 + BUILD_BUG_ON_MSG(!__types_ok3(uval, ulo, uhi), \ 113 113 "clamp("#val", "#lo", "#hi") signedness error"); \ 114 114 __clamp(uval, ulo, uhi); }) 115 115 ··· 149 149 150 150 #define __careful_op3(op, x, y, z, ux, uy, uz) ({ \ 151 151 __auto_type ux = (x); __auto_type uy = (y);__auto_type uz = (z);\ 152 - BUILD_BUG_ON_MSG(!__types_ok3(x, y, z, ux, uy, uz), \ 152 + BUILD_BUG_ON_MSG(!__types_ok3(ux, uy, uz), \ 153 153 #op"3("#x", "#y", "#z") signedness error"); \ 154 154 __cmp(op, ux, __cmp(op, uy, uz)); }) 155 155