From: Javier Miranda <[email protected]>
This patch adds support for C++ constructor calls in array aggregates.
gcc/ada/ChangeLog:
* exp_ch5.adb (Expand_N_Assignment_Statement): Handle internally
generated initialization invoking a C++ constructor.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/exp_ch5.adb | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb
index d08c8c4a59d..c75cfc174d2 100644
--- a/gcc/ada/exp_ch5.adb
+++ b/gcc/ada/exp_ch5.adb
@@ -32,6 +32,7 @@ with Einfo.Entities; use Einfo.Entities;
with Einfo.Utils; use Einfo.Utils;
with Elists; use Elists;
with Exp_Aggr; use Exp_Aggr;
+with Exp_Ch3; use Exp_Ch3;
with Exp_Ch6; use Exp_Ch6;
with Exp_Ch7; use Exp_Ch7;
with Exp_Ch11; use Exp_Ch11;
@@ -2412,6 +2413,26 @@ package body Exp_Ch5 is
if Componentwise_Assignment (N) then
Expand_Assign_Record (N);
return;
+
+ -- Another special case: internally generated initialization invoking
+ -- a C++ constructor. This case corresponds with the initialization
+ -- of an aggregate component.
+
+ elsif not Comes_From_Source (N)
+ and then (No_Ctrl_Actions (N) or else No_Finalize_Actions (N))
+ and then Is_CPP_Constructor_Call (Rhs)
+ then
+ declare
+ Expr : constant Node_Id := Relocate_Node (Rhs);
+ Id_Ref : constant Node_Id := Relocate_Node (Lhs);
+
+ begin
+ Insert_List_Before_And_Analyze (N,
+ Build_Initialization_Call (N, Id_Ref, Typ,
+ Constructor_Ref => Expr));
+ Rewrite (N, Make_Null_Statement (Loc));
+ return;
+ end;
end if;
-- Defend against invalid subscripts on left side if we are in standard
--
2.53.0