aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier Miranda <miranda@adacore.com>2018-12-11 11:10:02 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-12-11 11:10:02 +0000
commite64ac63149a6ec0ee9403079eea7df857ff59587 (patch)
tree4e1a75329c0ff44957c6b41aa87b4f5c9ece49a6
parent66f84da8f3232cc104cacf16b2c1f99d7f8ba676 (diff)
downloadgcc-e64ac63149a6ec0ee9403079eea7df857ff59587.zip
gcc-e64ac63149a6ec0ee9403079eea7df857ff59587.tar.gz
gcc-e64ac63149a6ec0ee9403079eea7df857ff59587.tar.bz2
[Ada] Fix runtime stack overflow for out/in-out actuals without discr.
2018-12-11 Javier Miranda <miranda@adacore.com> gcc/ada/ * exp_aggr.adb (Convert_To_Assignments): When gnerating C, do not declare a temporary to initialize an aggregate assigned to Out or In_Out parameters whose type has no discriminants. This avoids stack overflow errors at runtime. From-SVN: r266988
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/exp_aggr.adb16
2 files changed, 23 insertions, 0 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index f242a2f..ba91b12 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,10 @@
+2018-12-11 Javier Miranda <miranda@adacore.com>
+
+ * exp_aggr.adb (Convert_To_Assignments): When gnerating C, do
+ not declare a temporary to initialize an aggregate assigned to
+ Out or In_Out parameters whose type has no discriminants. This
+ avoids stack overflow errors at runtime.
+
2018-12-11 Ed Schonberg <schonberg@adacore.com>
* exp_ch7.adb (Check_Unnesting_Elaboration_Code): Extend
diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb
index 1c1890f..64233a5 100644
--- a/gcc/ada/exp_aggr.adb
+++ b/gcc/ada/exp_aggr.adb
@@ -4245,6 +4245,22 @@ package body Exp_Aggr is
Build_Record_Aggr_Code (N, Typ, Target_Expr));
Rewrite (Parent (N), Make_Null_Statement (Loc));
+ -- Generating C, do not declare a temporary to initialize an aggregate
+ -- assigned to Out or In_Out parameters whose type has no discriminants.
+ -- This avoids stack overflow errors at run time.
+
+ elsif Modify_Tree_For_C
+ and then Nkind (Parent (N)) = N_Assignment_Statement
+ and then Nkind (Name (Parent (N))) = N_Identifier
+ and then Ekind_In (Entity (Name (Parent (N))), E_Out_Parameter,
+ E_In_Out_Parameter)
+ and then not Has_Discriminants (Etype (Entity (Name (Parent (N)))))
+ then
+ Target_Expr := New_Copy_Tree (Name (Parent (N)));
+ Insert_Actions (Parent (N),
+ Build_Record_Aggr_Code (N, Typ, Target_Expr));
+ Rewrite (Parent (N), Make_Null_Statement (Loc));
+
else
Temp := Make_Temporary (Loc, 'A', N);