trans.c (Call_to_gnu): Use the unpadded type when putting back an intermediate conver...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 27 May 2019 10:16:04 +0000 (10:16 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 27 May 2019 10:16:04 +0000 (10:16 +0000)
* gcc-interface/trans.c (Call_to_gnu): Use the unpadded type when
putting back an intermediate conversion the type of the actuals.

From-SVN: r271647

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

index b07c2ce3e1e4310405528931fc90df31e4e6ecfb..607b9550bd5a9c5bcfea3be0bc070ad0f335bcb6 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-27  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/trans.c (Call_to_gnu): Use the unpadded type when
+       putting back an intermediate conversion the type of the actuals.
+
 2019-05-27  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/trans.c (gnat_to_gnu) <Shift operations>: Convert the
index 4df0dfaae02d8bd73074a288a628a36ef0fd90f5..e41703b6601e776adf9f2a578b254bb3d3689201 100644 (file)
@@ -5355,7 +5355,7 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target,
         since the parent is a procedure call, so put it back here.  Note that
         we might have a dummy type here if the actual is the dereference of a
         pointer to it, but that's OK if the formal is passed by reference.  */
-      tree gnu_actual_type = gnat_to_gnu_type (Etype (gnat_actual));
+      tree gnu_actual_type = get_unpadded_type (Etype (gnat_actual));
       if (TYPE_IS_DUMMY_P (gnu_actual_type))
        gcc_assert (is_true_formal_parm && DECL_BY_REF_P (gnu_formal));
       else if (suppress_type_conversion
index 04bdb6cb193b6aac8cb63a0989a271c553b84693..7f64d13f965a9ea870667c4b1ad8432110716006 100644 (file)
@@ -1,3 +1,7 @@
+2019-05-27  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/unchecked_convert13.adb: New test.
+
 2019-05-27  Richard Biener  <rguenther@suse.de>
 
        PR testsuite/90615
diff --git a/gcc/testsuite/gnat.dg/unchecked_convert13.adb b/gcc/testsuite/gnat.dg/unchecked_convert13.adb
new file mode 100644 (file)
index 0000000..6297e27
--- /dev/null
@@ -0,0 +1,30 @@
+-- { dg-do compile }
+
+with Ada.Unchecked_Conversion;
+
+procedure Unchecked_Convert13 is
+
+  type B16_T is mod 2 ** 16;
+  for B16_T'Size use 16;
+  for B16_T'Alignment use 1;
+
+  type Rec_T is record
+    A : Short_Integer;
+  end record;
+  for Rec_T use record
+    A at 0 range 0 .. 15;
+  end record;
+  for Rec_T'Size use 16;
+
+  Rec : constant Rec_T := (A => 0);
+
+  function Rec_To_B16 is new Ada.Unchecked_Conversion (Rec_T, B16_T);
+
+  procedure Nested (B16 : B16_T) is
+  begin
+    null;
+  end;
+
+begin
+  Nested (Rec_To_B16 (Rec));
+end;