From d21328a0d42f1b6a92f777acf4972e3c1c5d330c Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Fri, 5 Jul 2019 07:03:30 +0000 Subject: [Ada] Fix internal error on packed array In/Out actual parameter This fixes an issue introduced in Ada 2012 for calls to functions taking an In/Out parameter and for which the actual is the component of a packed array. In this case, the front-end needs to create a temporary for the actual, initialize it before the call and assign it back after it, because operations on bit-packed arrays are converted into mask-and-shift sequences. 2019-07-05 Eric Botcazou gcc/ada/ * exp_ch4.adb (Expand_N_Indexed_Component): Do not expand actual parameters of function calls here either. gcc/testsuite/ * gnat.dg/pack23.adb, gnat.dg/pack23_pkg.ads: New testcase. From-SVN: r273124 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/exp_ch4.adb | 11 ++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'gcc/ada') diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 1899bff..8373be7 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2019-07-05 Eric Botcazou + + * exp_ch4.adb (Expand_N_Indexed_Component): Do not expand actual + parameters of function calls here either. + 2019-07-05 Hristian Kirtchev * bindo-units.adb, checks.adb, exp_attr.adb, exp_ch3.adb, diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index a611e03..78b5028 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -6762,7 +6762,7 @@ package body Exp_Ch4 is -- Renaming objects in renaming associations -- This case is handled when a use of the renamed variable occurs - -- Actual parameters for a procedure call + -- Actual parameters for a subprogram call -- This case is handled in Exp_Ch6.Expand_Actuals -- The second expression in a 'Read attribute reference @@ -6783,11 +6783,12 @@ package body Exp_Ch4 is if Nkind (Parnt) = N_Unchecked_Expression then null; - elsif Nkind_In (Parnt, N_Object_Renaming_Declaration, - N_Procedure_Call_Statement) + elsif Nkind (Parnt) = N_Object_Renaming_Declaration then + return; + + elsif Nkind (Parnt) in N_Subprogram_Call or else (Nkind (Parnt) = N_Parameter_Association - and then - Nkind (Parent (Parnt)) = N_Procedure_Call_Statement) + and then Nkind (Parent (Parnt)) in N_Subprogram_Call) then return; -- cgit v1.1