]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* stor-layout.c (self_referential_size): Do not promote arguments.
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 15 Oct 2014 10:30:03 +0000 (10:30 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 15 Oct 2014 10:30:03 +0000 (10:30 +0000)
From-SVN: r216251

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 16541a88bd32e0dd721705f06522baf29f8de21f..f3cf994a9bc8580a153dd68f05853eb1c5f14ecf 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-12  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        Backport from mainline r215880
index 3381fcfd52eed1ff9da0fef11156b99d47789aa7..24cad6c889a1696803aab39e5f1388e375ce8063 100644 (file)
@@ -234,12 +234,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 2608e96dd45fb74088686029aafca20dfe3a8da9..195a3c8fc3c20a0d398f07f53df9c128e45ede81 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-12  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        Backport from mainline r215880
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