OSDN Git Service

* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Subtype>: Put
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Jan 2009 12:24:02 +0000 (12:24 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Jan 2009 12:24:02 +0000 (12:24 +0000)
the _Tag field before any discriminants in the field list.
(components_to_record): Remove obsolete comment.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143267 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 166baa8..a8ef574 100644 (file)
@@ -1,3 +1,9 @@
+2009-01-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Subtype>: Put
+       the _Tag field before any discriminants in the field list.
+       (components_to_record): Remove obsolete comment.
+
 2008-12-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR ada/38450
index 20c5fb4..0c7321d 100644 (file)
@@ -3139,8 +3139,18 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
                      = DECL_DISCRIMINANT_NUMBER (gnu_old_field);
                    TREE_THIS_VOLATILE (gnu_field)
                      = TREE_THIS_VOLATILE (gnu_old_field);
-                   TREE_CHAIN (gnu_field) = gnu_field_list;
-                   gnu_field_list = gnu_field;
+
+                   /* To match the layout crafted in components_to_record, if
+                      this is the _Tag field, put it before any discriminants
+                      instead of after them as for all other fields.  */
+                   if (Chars (gnat_field) == Name_uTag)
+                     gnu_field_list = chainon (gnu_field_list, gnu_field);
+                   else
+                     {
+                       TREE_CHAIN (gnu_field) = gnu_field_list;
+                       gnu_field_list = gnu_field;
+                     }
+
                    save_gnu_tree (gnat_field, gnu_field, false);
                  }
 
@@ -6436,8 +6446,7 @@ components_to_record (tree gnu_record_type, Node_Id component_list,
                                           packed, definition);
 
            /* If this is the _Tag field, put it before any discriminants,
-              instead of after them as is the case for all other fields.
-              Ignore field of void type if only annotating.  */
+              instead of after them as is the case for all other fields.  */
            if (Chars (gnat_field) == Name_uTag)
              gnu_field_list = chainon (gnu_field_list, gnu_field);
            else