diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index b07c2ce3e1e4310405528931fc90df31e4e6ecfb..607b9550bd5a9c5bcfea3be0bc070ad0f335bcb6 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -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 diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 4df0dfaae02d8bd73074a288a628a36ef0fd90f5..e41703b6601e776adf9f2a578b254bb3d3689201 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 04bdb6cb193b6aac8cb63a0989a271c553b84693..7f64d13f965a9ea870667c4b1ad8432110716006 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000000000000000000000000000000000000..6297e276e0f88af34f0eee42c8e2a5582b034c11 --- /dev/null +++ b/gcc/testsuite/gnat.dg/unchecked_convert13.adb @@ -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;