From: Marc Poulhiès Date: Tue, 5 Mar 2024 14:16:59 +0000 (+0100) Subject: ada: Fix crash caused by missing New_Copy_tree X-Git-Tag: basepoints/gcc-16~8955 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=93035031c5045255c7248576cc5750c1cb3dfd15;p=thirdparty%2Fgcc.git ada: Fix crash caused by missing New_Copy_tree 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) : Copy the initialization expression when unrolling the loop. --- 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;