decl.c (gnat_to_gnu_entity): Set TYPE_NONALIASED_COMPONENT on the array type only...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 9 Feb 2009 18:34:20 +0000 (18:34 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 9 Feb 2009 18:34:20 +0000 (18:34 +0000)
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_String_Literal_Subtype>:
Set TYPE_NONALIASED_COMPONENT on the array type only if appropriate.
(copy_alias_set): Assert that arrays have the same aliasing settings.
(substitute_in_type) <ARRAY_TYPE>: Copy TYPE_NONALIASED_COMPONENT.

From-SVN: r144038

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c

index 4da0bbb7222f526602cdaaf7b8101e12894bcb57..6a65f22a135e8cda7734f0b6fe373c9604a9f93a 100644 (file)
@@ -1,3 +1,10 @@
+2009-02-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_String_Literal_Subtype>:
+       Set TYPE_NONALIASED_COMPONENT on the array type only if appropriate.
+       (copy_alias_set): Assert that arrays have the same aliasing settings.
+       (substitute_in_type) <ARRAY_TYPE>: Copy TYPE_NONALIASED_COMPONENT.
+
 2009-02-08  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (gnat_to_gnu_entity) <E_String_Literal_Subtype>:
index 874b1ccb0353d67f449c9b953e9be98c080806c9..e86c2f93145fb16d0620882f83dd0f08da30929c 100644 (file)
@@ -2615,8 +2615,9 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
        gnu_type
          = build_array_type (gnat_to_gnu_type (Component_Type (gnat_entity)),
                              gnu_index_type);
-       TYPE_NONALIASED_COMPONENT (gnu_type) = 1;
-       copy_alias_set (gnu_type,  gnu_string_type);
+       if (array_type_has_nonaliased_component (gnat_entity, gnu_type))
+         TYPE_NONALIASED_COMPONENT (gnu_type) = 1;
+       copy_alias_set (gnu_type, gnu_string_type);
       }
       break;
 
@@ -5184,6 +5185,17 @@ copy_alias_set (tree gnu_new_type, tree gnu_old_type)
       && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_new_type)))
     copy_alias_set (TREE_TYPE (gnu_new_type), TREE_TYPE (gnu_old_type));
 
+  /* The alias set shouldn't be copied between array types with different
+     aliasing settings because this can break the aliasing relationship
+     between the array type and its element type.  */
+#ifndef ENABLE_CHECKING
+  if (flag_strict_aliasing)
+#endif
+    gcc_assert (!(TREE_CODE (gnu_new_type) == ARRAY_TYPE
+                 && TREE_CODE (gnu_old_type) == ARRAY_TYPE
+                 && TYPE_NONALIASED_COMPONENT (gnu_new_type)
+                    != TYPE_NONALIASED_COMPONENT (gnu_old_type)));
+
   TYPE_ALIAS_SET (gnu_new_type) = get_alias_set (gnu_old_type);
   record_component_aliases (gnu_new_type);
 }
@@ -7510,6 +7522,7 @@ substitute_in_type (tree t, tree f, tree r)
 
        new = build_array_type (component, domain);
        TYPE_SIZE (new) = 0;
+       TYPE_NONALIASED_COMPONENT (new) = TYPE_NONALIASED_COMPONENT (t);
        TYPE_MULTI_ARRAY_P (new) = TYPE_MULTI_ARRAY_P (t);
        TYPE_CONVENTION_FORTRAN_P (new) = TYPE_CONVENTION_FORTRAN_P (t);
        layout_type (new);