Messages in this thread Patch in this message | | | From | Roland Dreier <> | Subject | Re: [PATCH] Add BUILD_BUG_ON_NOT_POWER_OF_2() | Date | Wed, 06 Jan 2010 23:51:53 -0800 |
| |
> Can you please change the above into the following, such that the > macro does what its name suggests:
Argh! Good catch, thanks -- I even tested my patch, but with my brain in reverse so I sent the bad patch.
Andrew, please replace with this one, which includes your update to the comment as well:
===
Add BUILD_BUG_ON_NOT_POWER_OF_2()
When code relies on a constant being a power of 2:
#define FOO 512 /* must be a power of 2 */
it would be nice to be able to do:
BUILD_BUG_ON(!is_power_of_2(FOO));
However applying an inline function does not result in a compile-time constant that can be used with BUILD_BUG_ON(), so trying that gives results in:
error: bit-field '<anonymous>' width not an integer constant
As suggested by akpm, rather than monkeying around with is_power_of_2() and risking gcc warts about constant expressions, just create a macro BUILD_BUG_ON_NOT_POWER_OF_2() to encapsulate this common requirement.
Signed-off-by: Roland Dreier <rolandd@cisco.com> --- include/linux/kernel.h | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 3fc9f5a..328bca6 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -734,6 +734,10 @@ struct sysinfo { /* Force a compilation error if condition is constant and true */ #define MAYBE_BUILD_BUG_ON(cond) ((void)sizeof(char[1 - 2 * !!(cond)])) +/* Force a compilation error if a constant expression is not a power of 2 */ +#define BUILD_BUG_ON_NOT_POWER_OF_2(n) \ + BUILD_BUG_ON((n) == 0 || (((n) & ((n) - 1)) != 0)) + /* Force a compilation error if condition is true, but also produce a result (of value 0 and type size_t), so the expression can be used e.g. in a structure initializer (or where-ever else comma expressions
| |