exp_aggr.adb (Static_Array_Aggregate): Use Max_Aggr_Size to determine whether an...
authorEd Schonberg <schonberg@adacore.com>
Tue, 8 Apr 2008 06:49:26 +0000 (08:49 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 8 Apr 2008 06:49:26 +0000 (08:49 +0200)
2008-04-08  Ed Schonberg  <schonberg@adacore.com>

* exp_aggr.adb (Static_Array_Aggregate): Use Max_Aggr_Size to determine
whether an array aggregate with static bounds and scalar components
should be expanded into a static constant.

From-SVN: r134025

gcc/ada/exp_aggr.adb

index c334150b84ad538c19f266c56bfc2717a33237b3..c815369e821ddaa2338411b77e99ce3109259838 100644 (file)
@@ -300,7 +300,7 @@ package body Exp_Aggr is
       Hiv  : Uint;
 
       --  The following constant determines the maximum size of an
-      --  aggregate produced by converting named to positional
+      --  array aggregate produced by converting named to positional
       --  notation (e.g. from others clauses). This avoids running
       --  away with attempts to convert huge aggregates, which hit
       --  memory limits in the backend.
@@ -1170,9 +1170,9 @@ package body Exp_Aggr is
             --  If the component is itself an array of controlled types, whose
             --  value is given by a sub-aggregate, then the attach calls have
             --  been generated when individual subcomponent are assigned, and
-            --  and must not be done again to prevent malformed finalization
-            --  chains (see comments above, concerning the creation of a block
-            --  to hold inner finalization actions).
+            --  must not be done again to prevent malformed finalization chains
+            --  (see comments above, concerning the creation of a block to hold
+            --  inner finalization actions).
 
             if Present (Comp_Type)
               and then Controlled_Type (Comp_Type)
@@ -1677,10 +1677,6 @@ package body Exp_Aggr is
    -- Build_Record_Aggr_Code --
    ----------------------------
 
-   ----------------------------
-   -- Build_Record_Aggr_Code --
-   ----------------------------
-
    function Build_Record_Aggr_Code
      (N                             : Node_Id;
       Typ                           : Entity_Id;
@@ -6350,7 +6346,8 @@ package body Exp_Aggr is
             else
                --  The aggregate is static if all components are literals, or
                --  else all its components are static aggregates for the
-               --  component type.
+               --  component type. We also limit the size of a static aggregate
+               --  to prevent runaway static expressions.
 
                if Is_Array_Type (Comp_Type)
                  or else Is_Record_Type (Comp_Type)
@@ -6364,6 +6361,9 @@ package body Exp_Aggr is
 
                elsif Nkind (Expression (Expr)) /= N_Integer_Literal then
                   return False;
+
+               elsif not Aggr_Size_OK (Typ) then
+                  return False;
                end if;
 
                --  Create a positional aggregate with the right number of