On Wed, Apr 18, 2018 at 1:12 AM, Martin Wilck <mwi...@suse.com> wrote: > > No, it doesn't (gcc 7.3.0). -> https://paste.opensuse.org/27471594 > It doesn't even warn on an expression like this: > > #define SIZE (1<<10) > static int foo[ilog2(SIZE)];
Ok, I think this is the "random gcc versions act differently" issue. Sometimes __builtin_constant_p() to a ternary operation acts as a constant expression, and sometimes it doesn't. Oh well. > sparse 0.5.2 doesn't warn about that either. Yeah, sparse doesn't get picky about "constant value" vs "constant expression" normally. But some things do use the strict form, and array index expressions is one of those cases. > So maybe I was wrong, and this is actually a false positive in sparse. No, it's correct, it's just that the semantics of exactly when something is considered constant are a bit fluid. > Do you want me to convert the patch to your approach anyway? I suspect using the __is_constexpr() trick would make it rather more technically correct, but would actually generate much worse code. Because it would make us do that dynamic "__ilog2_uXX()" function call even when you have a compile-time constant value, if it wasn't actually a constant expression (ie a constant argument passed to an inline function, for example). So I guess your patch is fine, but I also wonder if we should just default sparse to allow the good old non-strict "constant values are ok" for indexes. And turn on strict mode only with -pedantic or something. Linus