On Wed, Jun 19, 2024 at 09:36:40AM +0200, Richard Biener wrote:
> > TYPE_CANONICAL (x)
> >         = build_qualified_type (TYPE_CANONICAL (t), TYPE_QUALS (x));
> 
> That looks indeed weird.  What are the constraints on 't' for
> c_update_type_canonical?  If it is TYPE_STRUCTURAL_EQUALITY_P
> the above will segfault.
> 
> The docs of the function says
> 
> /* Recompute TYPE_CANONICAL for variants of the type including qualified
>    versions of the type and related pointer types after an aggregate type
>    has been finalized.
> 
> but it seems to also possibly update the main variants canonical type.
> But the main variants canonical type should be the canonical type of
> all other variants, so I would expect the function to determine
> the main variant, possibly update (why?) it's canonical type and
> then assign that to all variant types.

The function is supposed to be called on previously
TYPE_STRUCTURAL_EQUALITY_P main variant on which the FE set
TYPE_CANONICAL to non-NULL:

      gcc_checking_assert (TYPE_STRUCTURAL_EQUALITY_P (t));
      tree *e = c_struct_htab->find_slot_with_hash (t, hash, INSERT);
      if (*e)
        TYPE_CANONICAL (t) = *e;
      else
        {
          TYPE_CANONICAL (t) = t;
          *e = t;
        }
      c_update_type_canonical (t);
and the function should propagate that canonical type or canonical types
derived from that also to its variants (qualified or unqualified) and
pointers to those as long as the variants/pointers are still
TYPE_STRUCTURAL_EQUALITY_P before the change.

        Jakub

Reply via email to