On Thu, Apr 5, 2018 at 5:13 PM Linus Torvalds <torva...@linux-foundation.org> wrote: > And btw, I hate how stupid gcc is about "constant size arrays but acts > as a VLA because it wasn't an integer-constant-expression size" > things.
> Your code generation example really is a sad sad example of it. A good > optimizer should have generated the same code even if the stupid array > again syntactically was VLA, because it damn well isn't in reality. Unfortunately, that behavior is required by the standard, it's not up to compiler optimization to change. Note that the optimizer in my example _did_ determine that the VLA had a constant size, and generated constant-size stack adjustment code. And it knew the result of the sizeof(), and put the value "4" straight into the return register. The only difference in the codegen from a non-VLA is the difference which was required by the language standard -- the useless call to "function". Note that the return value of the call is unused. And in fact, there is literally no reason for the expression in "sizeof(expression)" to ever be evaluated -- the result of the evaluation can _never_ be used! And, yet, the C99 standard requires that it is evaluated, regardless, when the resulting type of the expression is a VLA type. I have no idea why.... From C99 6.5.3.4 "The sizeof operator", paragraph 2: """ The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant. """ (C11 says the same thing.)