* stor-layout.c (self_referential_size): Do not promote arguments.
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 15 Oct 2014 10:24:36 +0000 (10:24 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 15 Oct 2014 10:24:36 +0000 (10:24 +0000)
From-SVN: r216249

gcc/ChangeLog
gcc/stor-layout.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt41.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt41_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt41_pkg.ads [new file with mode: 0644]

index 9c3dcf4a6d16cb49c568d222d3c1c48cf0a81a4a..5bc3571e39f89f57f1ba4b24c951ca5fd072968b 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * stor-layout.c (self_referential_size): Do not promote arguments.
+
 2014-10-15  Marek Polacek  <polacek@redhat.com>
 
        * doc/invoke.texi: Update to reflect that GNU11 is the default
index c7b524c574c7f9b6994933c4953e010a905ea772..a95722ac10ec959bce4cefe28a57e6b8eb3fcfaf 100644 (file)
@@ -211,12 +211,7 @@ self_referential_size (tree size)
       param_type = TREE_TYPE (ref);
       param_decl
        = build_decl (input_location, PARM_DECL, param_name, param_type);
-      if (targetm.calls.promote_prototypes (NULL_TREE)
-         && INTEGRAL_TYPE_P (param_type)
-         && TYPE_PRECISION (param_type) < TYPE_PRECISION (integer_type_node))
-       DECL_ARG_TYPE (param_decl) = integer_type_node;
-      else
-       DECL_ARG_TYPE (param_decl) = param_type;
+      DECL_ARG_TYPE (param_decl) = param_type;
       DECL_ARTIFICIAL (param_decl) = 1;
       TREE_READONLY (param_decl) = 1;
 
index 65cb5fdc77be6bd21741e30785e4e2f491f077b3..fb25dae6f94a5e19f562eb13eec46df0467085dc 100644 (file)
@@ -1,3 +1,8 @@
+2014-10-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt41.adb: New test.
+       * gnat.dg/opt41_pkg.ad[sb]: New helper.
+
 2014-10-15  Richard Biener  <rguenther@suse.de>
 
        * g++.dg/torture/pr63419.C: Add -Wno-psabi.
diff --git a/gcc/testsuite/gnat.dg/opt41.adb b/gcc/testsuite/gnat.dg/opt41.adb
new file mode 100644 (file)
index 0000000..2166043
--- /dev/null
@@ -0,0 +1,15 @@
+-- { dg-do run }
+-- { dg-options "-Os" }
+
+with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
+with Opt41_Pkg;             use Opt41_Pkg;
+
+procedure Opt41 is
+   R  : Rec := (Five, To_Unbounded_String ("CONFIG"));
+   SP : String_Access := new String'(To_String (Rec_Write (R)));
+   RP : Rec_Ptr := new Rec'(Rec_Read (SP));
+begin
+   if RP.D /= R.D then
+      raise Program_Error;
+   end if;
+end;
diff --git a/gcc/testsuite/gnat.dg/opt41_pkg.adb b/gcc/testsuite/gnat.dg/opt41_pkg.adb
new file mode 100644 (file)
index 0000000..c43c1bf
--- /dev/null
@@ -0,0 +1,53 @@
+with Ada.Streams; use Ada.Streams;\r
+\r
+package body Opt41_Pkg is\r
+\r
+   type Wstream is new Root_Stream_Type with record\r
+      S : Unbounded_String;\r
+   end record;\r
+\r
+   procedure Read (Stream : in out Wstream;\r
+                   Item   : out Stream_Element_Array;\r
+                   Last   : out Stream_Element_Offset) is null;\r
+\r
+   procedure Write (Stream : in out Wstream; Item : Stream_Element_Array) is\r
+   begin\r
+      for J in Item'Range loop\r
+         Append (Stream.S, Character'Val (Item (J)));\r
+      end loop;\r
+   end Write;\r
+\r
+   function Rec_Write (R : Rec) return Unbounded_String is\r
+      S : aliased Wstream;\r
+   begin\r
+      Rec'Output (S'Access, R);\r
+      return S.S;\r
+   end Rec_Write;\r
+\r
+   type Rstream is new Root_Stream_Type with record\r
+      S   : String_Access;\r
+      Idx : Integer := 1;\r
+   end record;\r
+\r
+   procedure Write (Stream : in out Rstream; Item : Stream_Element_Array) is null;\r
+\r
+   procedure Read (Stream : in out Rstream;\r
+                   Item   : out Stream_Element_Array;\r
+                   Last   : out Stream_Element_Offset) is\r
+   begin\r
+      Last := Stream_Element_Offset'Min\r
+         (Item'Last, Item'First + Stream_Element_Offset (Stream.S'Last - Stream.Idx));\r
+      for I in Item'First .. Last loop\r
+         Item (I) := Stream_Element (Character'Pos (Stream.S (Stream.Idx)));\r
+         Stream.Idx := Stream.Idx + 1;\r
+      end loop;\r
+   end Read;\r
+\r
+   function Rec_Read (Str : String_Access) return Rec is\r
+      S : aliased Rstream;\r
+   begin\r
+      S.S := Str;\r
+      return Rec'Input (S'Access);\r
+   end Rec_Read;\r
+\r
+end Opt41_Pkg;\r
diff --git a/gcc/testsuite/gnat.dg/opt41_pkg.ads b/gcc/testsuite/gnat.dg/opt41_pkg.ads
new file mode 100644 (file)
index 0000000..e73bc93
--- /dev/null
@@ -0,0 +1,28 @@
+with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;\r
+\r
+package Opt41_Pkg is\r
+\r
+   type Enum is (One, Two, Three, Four, Five, Six);\r
+\r
+   type Rec (D : Enum) is record\r
+      case D is\r
+         when One => \r
+            I : Integer;\r
+         when Two | Five | Six =>\r
+            S : Unbounded_String;\r
+            case D is\r
+               when Two => B : Boolean;\r
+               when others => null;\r
+            end case;\r
+         when others =>\r
+            null;\r
+      end case;\r
+   end record;\r
+\r
+   type Rec_Ptr is access all Rec;\r
+\r
+   function Rec_Write (R : Rec) return Unbounded_String;\r
+\r
+   function Rec_Read (Str : String_Access) return Rec;\r
+\r
+end Opt41_Pkg;\r