decl.c (gnat_to_gnu_entity): Create TYPE_DECL for the padded type built to support...
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 26 Mar 2011 10:18:54 +0000 (10:18 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 26 Mar 2011 10:18:54 +0000 (10:18 +0000)
* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Create TYPE_DECL
for the padded type built to support a specified size or alignment.

From-SVN: r171554

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/discr27.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/discr27.ads [new file with mode: 0644]

index a4d45a5670450d08a744234e5238f6269baa30e5..91725e4e057829a2d735a86fcb72fbbdf33f29ed 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-26  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Create TYPE_DECL
+       for the padded type built to support a specified size or alignment.
+
 2011-03-26  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/gigi.h (finalize_from_with_types): Adjust comment.
index d3d2b9635877c91b72dfcbeb1befd4fc4a887511..cea8d3d6990593692eb5b4725083bfa240e9d383 100644 (file)
@@ -911,9 +911,20 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
           size of the object.  */
        gnu_object_size = gnu_size ? gnu_size : TYPE_SIZE (gnu_type);
        if (gnu_size || align > 0)
-         gnu_type = maybe_pad_type (gnu_type, gnu_size, align, gnat_entity,
-                                    false, false, definition,
-                                    gnu_size ? true : false);
+         {
+           tree orig_type = gnu_type;
+
+           gnu_type = maybe_pad_type (gnu_type, gnu_size, align, gnat_entity,
+                                      false, false, definition,
+                                      gnu_size ? true : false);
+
+           /* 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.  */
+           if (gnu_type != orig_type && !DECL_P (TYPE_NAME (gnu_type)))
+             create_type_decl (TYPE_NAME (gnu_type), gnu_type, NULL, true,
+                               debug_info_p, gnat_entity);
+         }
 
        /* If this is a renaming, avoid as much as possible to create a new
           object.  However, in several cases, creating it is required.
index 4f1fa8a5f61386fa66c2c663c19fc7bab67ecec8..28ab5b98f685e005000166b4b939debd37265623 100644 (file)
@@ -1,3 +1,7 @@
+2011-03-26  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/discr27.ad[sb]: New test.
+
 2011-03-26  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/limited_with2.ad[sb]: New test.
diff --git a/gcc/testsuite/gnat.dg/discr27.adb b/gcc/testsuite/gnat.dg/discr27.adb
new file mode 100644 (file)
index 0000000..cfaba34
--- /dev/null
@@ -0,0 +1,31 @@
+package body Discr27 is\r
+\r
+   subtype Index is Positive range 1..4096;\r
+\r
+   function F return String is\r
+      S : String(1..1) := (others =>'w');\r
+   begin\r
+      return S;\r
+   end;\r
+\r
+   type Enum is (One, Two);\r
+\r
+   type Rec (D : Enum  := One; Len : Index := 1) is record\r
+      case D is\r
+          when One => I : Integer;\r
+          when Two => A : String(1..Len);\r
+      end case;\r
+   end record;\r
+\r
+   procedure Nothing is\r
+      M : constant String := F;\r
+      C : constant Rec := (Two, M'Length, M);\r
+   begin\r
+      null;\r
+   end;\r
+\r
+   procedure Proc is begin\r
+      null;\r
+   end;\r
+\r
+end Discr27;\r
diff --git a/gcc/testsuite/gnat.dg/discr27.ads b/gcc/testsuite/gnat.dg/discr27.ads
new file mode 100644 (file)
index 0000000..db1914a
--- /dev/null
@@ -0,0 +1,7 @@
+-- { dg-do compile }\r
+\r
+package Discr27 is\r
+\r
+   procedure Proc;\r
+\r
+end Discr27;\r