From: Martin Uecker > Sent: 07 December 2024 19:52 ... > > 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. In many cases the C language says 'constant integer expression' but is reality something that passes __builtin_constant_p() is likely to be fine - because the actual value isn't needed until late on in the compilation. ... > > 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. It the output needs to be a constant the loop would have to be unrollable. In those cases the result will be 'constant enough' for __builtin_constant_p() and the compiler is actually already capable doing 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. You could use m4 :-) and make it entirely unreadable. > There exist proposals along those lines for C2Y. > > From a more near-term solution, I wonder if making it possible (or > easier) to return integer constant expressions from statement > expressions and allowing a restricted form of statement expressions > at file scope would help? It would help a lot if a #define that just used local variables to avoid arguments being re-expanded and for CSE could still generate a constant value. Does need to be a #define - to get token pasting and 'stringify'. Although you would need something for reporting detected errors, and builtin compiler support for const_true() for the detection itself. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)