OSDN Git Service

* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: If an
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 24 Apr 2009 07:01:41 +0000 (07:01 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 24 Apr 2009 07:01:41 +0000 (07:01 +0000)
alignment is specified, do not promote that of the component type
beyond it.
<E_Array_Subtype>: Likewise.

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

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/specs/rep_clause1.ads [moved from gcc/testsuite/gnat.dg/specs/pr34799.ads with 89% similarity]
gcc/testsuite/gnat.dg/specs/rep_clause2.ads [new file with mode: 0644]

index dd21b44..0c74f82 100644 (file)
@@ -1,3 +1,10 @@
+2009-04-24  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: If an
+       alignment is specified, do not promote that of the component type
+       beyond it.
+       <E_Array_Subtype>: Likewise.
+
 2009-04-23  Eric Botcazou  <ebotcazou@adacore.com>
 
        * einfo.ads (Is_True_Constant): Lift restriction on atomic objects.
index 746e1e8..bc44fa0 100644 (file)
@@ -1957,11 +1957,28 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
 
        if (gnu_comp_size && !Is_Bit_Packed_Array (gnat_entity))
          {
-           tree orig_tem;
+           tree orig_tem = tem;
+           unsigned int max_align;
+
+           /* If an alignment is specified, use it as a cap on the component
+              type so that it can be honored for the whole type.  But ignore
+              it for the original type of packed array types.  */
+           if (No (Packed_Array_Type (gnat_entity))
+               && Known_Alignment (gnat_entity))
+             max_align = validate_alignment (Alignment (gnat_entity),
+                                             gnat_entity, 0);
+           else
+             max_align = 0;
+
            tem = make_type_from_size (tem, gnu_comp_size, false);
-           orig_tem = tem;
+           if (max_align > 0 && TYPE_ALIGN (tem) > max_align)
+             tem = orig_tem;
+           else
+             orig_tem = tem;
+
            tem = maybe_pad_type (tem, gnu_comp_size, 0, gnat_entity,
                                  "C_PAD", false, definition, true);
+
            /* If a padding record was made, declare it now since it will
               never be declared otherwise.  This is necessary to ensure
               that its subtrees are properly marked.  */
@@ -2343,13 +2360,31 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
 
              if (gnu_comp_size && !Is_Bit_Packed_Array (gnat_entity))
                {
-                 tree orig_gnu_type;
+                 tree orig_gnu_type = gnu_type;
+                 unsigned int max_align;
+
+                 /* If an alignment is specified, use it as a cap on the
+                    component type so that it can be honored for the whole
+                    type.  But ignore it for the original type of packed
+                    array types.  */
+                 if (No (Packed_Array_Type (gnat_entity))
+                     && Known_Alignment (gnat_entity))
+                   max_align = validate_alignment (Alignment (gnat_entity),
+                                                   gnat_entity, 0);
+                 else
+                   max_align = 0;
+
                  gnu_type
                    = make_type_from_size (gnu_type, gnu_comp_size, false);
-                 orig_gnu_type = gnu_type;
+                 if (max_align > 0 && TYPE_ALIGN (gnu_type) > max_align)
+                   gnu_type = orig_gnu_type;
+                 else
+                   orig_gnu_type = gnu_type;
+
                  gnu_type = maybe_pad_type (gnu_type, gnu_comp_size, 0,
                                             gnat_entity, "C_PAD", false,
                                             definition, true);
+
                  /* If a padding record was made, declare it now since it
                     will never be declared otherwise.  This is necessary
                     to ensure that its subtrees are properly marked.  */
index bb5ffce..592aac6 100644 (file)
@@ -1,3 +1,8 @@
+2009-04-24  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/specs/pr34799.ads: Rename to rep_clause1.ads.
+       * gnat.dg/specs/rep_clause2.ads: New test.
+
 2009-04-24  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/39794
similarity index 89%
rename from gcc/testsuite/gnat.dg/specs/pr34799.ads
rename to gcc/testsuite/gnat.dg/specs/rep_clause1.ads
index 7d06049..57f63ad 100644 (file)
@@ -1,7 +1,7 @@
 -- { dg-do compile }
 -- { dg-options "-gnatwa" }
 
-package PR34799 is
+package Rep_Clause1 is
    generic
       type Custom_T is private;
    package Handler is
@@ -16,4 +16,4 @@ package PR34799 is
          B at 1 range 0..0;
       end record;
    end Handler;
-end PR34799;
+end Rep_Clause1;
diff --git a/gcc/testsuite/gnat.dg/specs/rep_clause2.ads b/gcc/testsuite/gnat.dg/specs/rep_clause2.ads
new file mode 100644 (file)
index 0000000..361c141
--- /dev/null
@@ -0,0 +1,11 @@
+-- { dg-do compile }
+-- { dg-options "-gnatws" }
+
+package Rep_Clause2 is
+
+  type S is new String;
+  for S'Component_Size use 256;
+
+  type T is new S(1..8);
+
+end Rep_Clause2;