]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: decl.c (gnat_to_gnu_entity): Reuse the existing fields of a dummy fat point...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 12 Jun 2018 09:31:48 +0000 (09:31 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 12 Jun 2018 09:31:48 +0000 (09:31 +0000)
Backport from mainline
2018-06-11  Eric Botcazou  <ebotcazou@adacore.com>

* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Reuse the
existing fields of a dummy fat pointer type, if any.  Clear the
TYPE_DECL_SUPPRESS_DEBUG on the fat pointer type after completing it.

From-SVN: r261478

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

index 1c79da526e9fe1e020a6c411051a3cf3793f4a90..9c5d7dc2a30de4669ed477e6152e25b94b0b56ce 100644 (file)
@@ -1,3 +1,12 @@
+2018-06-12  Eric Botcazou  <ebotcazou@adacore.com>
+
+       Backport from mainline
+       2018-06-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Reuse the
+       existing fields of a dummy fat pointer type, if any.  Clear the
+       TYPE_DECL_SUPPRESS_DEBUG on the fat pointer type after completing it.
+
 2018-06-02  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/ada-tree.h (TYPE_PADDING_FOR_COMPONENT): New macro.
index 113a9c8d8f510e93ab207048d15ea87dcac84b32..4ed49281b56069d3419da30c903bf5a32b30c461 100644 (file)
@@ -2063,11 +2063,16 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
          {
            gnu_fat_type = TYPE_MAIN_VARIANT (TYPE_POINTER_TO (gnu_type));
            TYPE_NAME (gnu_fat_type) = NULL_TREE;
-           /* Save the contents of the dummy type for update_pointer_to.  */
-           TYPE_POINTER_TO (gnu_type) = copy_type (gnu_fat_type);
            gnu_ptr_template =
-             TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_fat_type)));
+             TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (gnu_fat_type)));
            gnu_template_type = TREE_TYPE (gnu_ptr_template);
+
+           /* Save the contents of the dummy type for update_pointer_to.  */
+           TYPE_POINTER_TO (gnu_type) = copy_type (gnu_fat_type);
+           TYPE_FIELDS (TYPE_POINTER_TO (gnu_type))
+             = copy_node (TYPE_FIELDS (gnu_fat_type));
+           DECL_CHAIN (TYPE_FIELDS (TYPE_POINTER_TO (gnu_type)))
+             = copy_node (DECL_CHAIN (TYPE_FIELDS (gnu_fat_type)));
          }
        else
          {
@@ -2088,29 +2093,39 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
 
        /* Build the fat pointer type.  Use a "void *" object instead of
           a pointer to the array type since we don't have the array type
-          yet (it will reference the fat pointer via the bounds).  */
-       tem
-         = create_field_decl (get_identifier ("P_ARRAY"), ptr_type_node,
-                              gnu_fat_type, NULL_TREE, NULL_TREE, 0, 0);
-       DECL_CHAIN (tem)
-         = create_field_decl (get_identifier ("P_BOUNDS"), gnu_ptr_template,
-                              gnu_fat_type, NULL_TREE, NULL_TREE, 0, 0);
-
+          yet (it will reference the fat pointer via the bounds).  Note
+          that we reuse the existing fields of a dummy type because for:
+
+            type Arr is array (Positive range <>) of Element_Type;
+            type Array_Ref is access Arr;
+            Var : Array_Ref := Null;
+
+          in a declarative part, Arr will be frozen only after Var, which
+          means that the fields used in the CONSTRUCTOR built for Null are
+          those of the dummy type, which in turn means that COMPONENT_REFs
+          of Var may be built with these fields.  Now if COMPONENT_REFs of
+          Var are also built later with the fields of the final type, the
+          aliasing machinery may consider that the accesses are distinct
+          if the FIELD_DECLs are distinct as objects.  */
        if (COMPLETE_TYPE_P (gnu_fat_type))
          {
-           /* We are going to lay it out again so reset the alias set.  */
-           alias_set_type alias_set = TYPE_ALIAS_SET (gnu_fat_type);
-           TYPE_ALIAS_SET (gnu_fat_type) = -1;
-           finish_fat_pointer_type (gnu_fat_type, tem);
-           TYPE_ALIAS_SET (gnu_fat_type) = alias_set;
+           tem = TYPE_FIELDS (gnu_fat_type);
+           TREE_TYPE (tem) = ptr_type_node;
+           TREE_TYPE (DECL_CHAIN (tem)) = gnu_ptr_template;
+           TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (gnu_fat_type)) = 0;
            for (t = gnu_fat_type; t; t = TYPE_NEXT_VARIANT (t))
-             {
-               TYPE_FIELDS (t) = tem;
-               SET_TYPE_UNCONSTRAINED_ARRAY (t, gnu_type);
-             }
+             SET_TYPE_UNCONSTRAINED_ARRAY (t, gnu_type);
          }
        else
          {
+           tem
+             = create_field_decl (get_identifier ("P_ARRAY"),
+                                  ptr_type_node, gnu_fat_type,
+                                  NULL_TREE, NULL_TREE, 0, 0);
+           DECL_CHAIN (tem)
+             = create_field_decl (get_identifier ("P_BOUNDS"),
+                                  gnu_ptr_template, gnu_fat_type,
+                                  NULL_TREE, NULL_TREE, 0, 0);
            finish_fat_pointer_type (gnu_fat_type, tem);
            SET_TYPE_UNCONSTRAINED_ARRAY (gnu_fat_type, gnu_type);
          }