Am Samstag, dem 07.12.2024 um 10:19 -0800 schrieb Linus Torvalds: > 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. There exist proposals along those lines for C2Y.