Since a recent refactor ("Factor common processing in expansion of
aggregates") where Initialize_Array_Component and
Initialize_Record_Component are merged, the behavior has slightly
changed. In the case of the expansion of an aggregate initialization
where the number of 'others' components is <= 3, the initialization
expression is not duplicated anymore, causing some incorrect multiple
definition when said expression is later transformed with
Expressions_With_Action that declares an object. The simple fix is to
add the now missing New_Copy_Tree where the assignments are created.
gcc/ada/
* exp_aggr.adb (Build_Array_Aggr_Code) <Gen_Loop>: Copy the
initialization expression when unrolling the loop.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/exp_aggr.adb | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb
index cff04fc1b79..9c5944a917d 100644
--- a/gcc/ada/exp_aggr.adb
+++ b/gcc/ada/exp_aggr.adb
@@ -1649,11 +1649,14 @@ package body Exp_Aggr is
and then Local_Expr_Value (H) - Local_Expr_Value (L) <= 2
and then not Is_Iterated_Component
then
- Append_List_To (S, Gen_Assign (New_Copy_Tree (L), Expr));
- Append_List_To (S, Gen_Assign (Add (1, To => L), Expr));
+ Append_List_To
+ (S, Gen_Assign (New_Copy_Tree (L), New_Copy_Tree (Expr)));
+ Append_List_To
+ (S, Gen_Assign (Add (1, To => L), New_Copy_Tree (Expr)));
if Local_Expr_Value (H) - Local_Expr_Value (L) = 2 then
- Append_List_To (S, Gen_Assign (Add (2, To => L), Expr));
+ Append_List_To
+ (S, Gen_Assign (Add (2, To => L), New_Copy_Tree (Expr)));
end if;
return S;
--
2.43.2