OSDN Git Service

* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: For an object at
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 May 2012 20:40:23 +0000 (20:40 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 May 2012 20:40:23 +0000 (20:40 +0000)
global level with unconstrained nominal subtype and a non-fixed size,
make a variable for the size.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@187668 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 3699586..293ee33 100644 (file)
@@ -1,3 +1,9 @@
+2012-05-18  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <object>: For an object at
+       global level with unconstrained nominal subtype and a non-fixed size,
+       make a variable for the size.
+
 2012-05-15  Andris Pavenis  <andris.pavenis@iki.fi>
 
        PR ada/52494
index 5b6d2f7..122fdd3 100644 (file)
@@ -778,6 +778,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
                gnu_size = max_size (TYPE_SIZE (gnu_type), true);
                mutable_p = true;
              }
+
+           /* If we are at global level and the size isn't constant, call
+              elaborate_expression_1 to make a variable for it rather than
+              calculating it each time.  */
+           if (global_bindings_p () && !TREE_CONSTANT (gnu_size))
+             gnu_size = elaborate_expression_1 (gnu_size, gnat_entity,
+                                                get_identifier ("SIZE"),
+                                                definition, false);
          }
 
        /* If the size is zero byte, make it one byte since some linkers have
index b6d9b7d..f60b86e 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-18  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/specs/lto12.ads: New test.
+       * gnat.dg/specs/lto12_pkg.ads: New helper.
+
 2012-05-17  David S. Miller  <davem@davemloft.net>
 
        * gfortran.dg/bessel_7.f90: Bump allowed precision to avoid
diff --git a/gcc/testsuite/gnat.dg/specs/lto12.ads b/gcc/testsuite/gnat.dg/specs/lto12.ads
new file mode 100644 (file)
index 0000000..3914e0f
--- /dev/null
@@ -0,0 +1,10 @@
+-- { dg-do compile }
+-- { dg-options "-flto" { target lto } }
+
+with Lto12_Pkg; use Lto12_Pkg;
+
+package Lto12 is
+
+  C : constant R := F;
+
+end Lto12;
diff --git a/gcc/testsuite/gnat.dg/specs/lto12_pkg.ads b/gcc/testsuite/gnat.dg/specs/lto12_pkg.ads
new file mode 100644 (file)
index 0000000..02ee491
--- /dev/null
@@ -0,0 +1,14 @@
+-- { dg-excess-errors "cannot generate code" }
+
+package Lto12_Pkg is
+
+  type R (Kind  : Boolean := False) is record
+    case Kind is
+      when True => I : Integer;
+      when others => null;
+    end case;
+  end record;
+
+  function F return R;
+
+end Lto12_Pkg;