https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113688
--- Comment #23 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> This was based on a discussion with Richard. TYPE_CANONICAL is used for
> aliasing decisions and the FE must set it to from equivalence classes for
> types that are compatible. In C, the types
>
> int[];
> int[3];
> int[n];
>
> are compatible, and this means that also the following types
> are compatible:
>
> struct foo { int a; int b[]; };
> struct foo { int a; int b[3]; };
> struct foo { int a; int b[n]; };
>
> Treating them as not compatible (by setting different TYPE_CANONICAL) causes
> subtle miscompilation issues in C. I wonder how this works in Ada?
In Ada, array types are compatible (essentially) if they have the same range
(lb, ub) and the same component type T:
type Arr is array (lb .. ub) of T;
and recursively when they are components of record types:
type Rec is record
I : Integer;
A : Arr;
end record;
That's exactly what has been implemented by the GCC system for 2 decades, see
for example gimple_canonical_types_compatible_p and hash_canonical_type.
Can't the very peculiar C rules be implemented by means of a language hook?