On 14 Mar 2025, at 14:13, Martin Uecker wrote:

> Am Freitag, dem 14.03.2025 um 10:11 -0700 schrieb David Tarditi:
>> Hi Martin,
>>
>> The C design of VLAs misunderstood dependent typing.
>
> They probably did not care about theory, but the design is
> not inconsistent with theory.

This is almost true, but for bad reasons.  The theory of dependent types is 
heavily concerned with deciding whether two types are the same, and C simply 
sidesteps this question because type identity is largely meaningless in C. 
Every value of variably-modified type is (or decays to) a pointer, and all 
pointers in C freely convert to one another (within the object/function 
categories). _Generic is based on type compatibility, not equality. So in that 
sense, the standard doesn’t say anything inconsistent with theory because it 
doesn’t even try to say anything.

The reason it is not quite true is that C does have rules for compatible and 
composite types, and alas, those rules for variably-modified types are not 
consistent with theory. Two VLA types of compatible element type are always 
statically considered compatible, and it’s simply UB if the sizes aren’t the 
same. The composite type of a VLA and a fixed-size array type is always the 
fixed-size array type. The standard is literally incomplete about the composite 
type of two VLAs; if you use a ternary operator where both operands are casts 
to VLA types, the standard just says it’s straight-up just undefined behavior 
(because one of the types has a bound that’s unevaluated) and doesn’t even 
bother telling us what the static type is supposed to be.

John.

Reply via email to