On Sat, 7 Dec 2024 at 04:24, Vincent Mailhol <vincent.mailhol@xxxxxxxxx> wrote: > > > No good - expands everything twice. > > And? __is_const_zero() does not evaluate its arguments, so no side effect: No, the problem is literally the expansion. Double expansion of these fundamental helpers gets exponential, because they are used in various nested ways in other fundamental helpers. That's why we then spent so much effort on trying to clean up the min/max macros, because a single line of code would expand to literally tens of megabytes of horrific expansions. And the problem with these things is that you can't make them inline functions, so they have to be macros, and then you build up other macros using them (like that "clamp()" macro), and it really gets horrendous and affects the build time. And yes, it is very sad. Particularly since a compiler would have a really easy time with some nice helper builtins. Of course, often the compiler *does* have helper builtins, but we can't use them, because they aren't *quite* the right thing. Like that "__builtin_constant_p()" not actually working for some situations where we absolutely need not just a constant value, but a constant _expression_ due to C parsing rules. Quite a lot of the pain we tend to have with these things is directly related to the fact that we often want to do these tests in contexts like global array initializers etc. If there is one feature of C I would have liked it is "allow inline functions and statement expressions with constant arguments as constant expressions". Other languages have done that, and it really does help. And yes, it means that you have to basically have a language interpreter in the compiler (you do want to allow loop constructions etc), but it really is very useful. Oh well. Even if compilers added that today, it would be years until we could take advantage of it. At one point I literally was thinking I'd do 'sparse' as a pre-processor for kernel code, in order to have extended language facilities like that. Linus