> 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?


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