> > Ah, right.  The patch oversimplifies this.  We need to do sth like
> > TREE_CODE (t1) == ARRAY_TYPE && ! TYPE_NONALIASED_COMPONENT (t1) && ...
> > right?
> 
> Right.  Any objection to me applying this?

Not form my side - lto-symtab change makes sense to me.
With LTO all array types have canonical type so indeed we can drop the check
for structural equality used by alias.c

Honza
> 
> 
> lto/
>       PR lto/83954
>       * lto-symtab.c (warn_type_compatibility_p): Do not recurse into the
>       component type of array types with non-aliased component.
> ada/
>       * gcc-interface/decl.c (array_type_has_nonaliased_component): Return
>       false if the component type is a pointer.
> 
> -- 
> Eric Botcazou

> Index: ada/gcc-interface/decl.c
> ===================================================================
> --- ada/gcc-interface/decl.c  (revision 257325)
> +++ ada/gcc-interface/decl.c  (working copy)
> @@ -6113,6 +6113,11 @@ array_type_has_nonaliased_component (tre
>        return TYPE_NONALIASED_COMPONENT (gnu_parent_type);
>      }
>  
> +  /* Consider that an array of pointers has an aliased component, which is 
> sort
> +     of logical and helps with arrays of Taft Amendment types in LTO mode.  
> */
> +  if (POINTER_TYPE_P (TREE_TYPE (gnu_type)))
> +    return false;
> +
>    /* Otherwise, rely exclusively on properties of the element type.  */
>    return type_for_nonaliased_component_p (TREE_TYPE (gnu_type));
>  }
> Index: lto/lto-symtab.c
> ===================================================================
> --- lto/lto-symtab.c  (revision 257325)
> +++ lto/lto-symtab.c  (working copy)
> @@ -288,9 +288,12 @@ warn_type_compatibility_p (tree prevaili
>       {
>            tree t1 = type, t2 = prevailing_type;
>  
> -       /* Alias sets of arrays are the same as alias sets of the inner
> -          types.  */
> -       while (TREE_CODE (t1) == ARRAY_TYPE && TREE_CODE (t2) == ARRAY_TYPE)
> +       /* Alias sets of arrays with aliased components are the same as alias
> +          sets of the inner types.  */
> +       while (TREE_CODE (t1) == ARRAY_TYPE
> +              && !TYPE_NONALIASED_COMPONENT (t1)
> +              && TREE_CODE (t2) == ARRAY_TYPE
> +              && !TYPE_NONALIASED_COMPONENT (t2))
>           {
>             t1 = TREE_TYPE (t1);
>             t2 = TREE_TYPE (t2);

Reply via email to