[Ada] Compiler crash on decl. with limited aggregate and address clause
authorEd Schonberg <schonberg@adacore.com>
Wed, 14 Nov 2018 11:41:41 +0000 (11:41 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 14 Nov 2018 11:41:41 +0000 (11:41 +0000)
This patch fixes a compiler abort on an object declaration whose
expression is an aggregate, when the type of the object is limited and
the declaration is followed by an address clause for the declared
object.

2018-11-14  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* exp_ch3.adb: (Expand_N_Object_Declaration): If the expression
is a limited aggregate its resolution is delayed until the
object declaration is expanded.
* sem_ch3.adb: (Analyze_Object_Declaration): If the expression
is a limited aggregate and the declaration has a following
address clause indicate that resolution of the aggregate (which
must be built in place) must be delayed.

gcc/testsuite/

* gnat.dg/limited_aggr.adb, gnat.dg/limited_aggr.ads: New
testcase.

From-SVN: r266125

gcc/ada/ChangeLog
gcc/ada/exp_ch3.adb
gcc/ada/sem_ch3.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/limited_aggr.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/limited_aggr.ads [new file with mode: 0644]

index 52ea778131afd06320c44d695efd1db8e7898137..6be83416933d05a1dbedc985eacd033a303b2c8f 100644 (file)
@@ -1,3 +1,13 @@
+2018-11-14  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_ch3.adb: (Expand_N_Object_Declaration): If the expression
+       is a limited aggregate its resolution is delayed until the
+       object declaration is expanded.
+       * sem_ch3.adb: (Analyze_Object_Declaration): If the expression
+       is a limited aggregate and the declaration has a following
+       address clause indicate that resolution of the aggregate (which
+       must be built in place) must be delayed.
+
 2018-11-14  Bob Duff  <duff@adacore.com>
 
        * sem_attr.adb (To_Address): Simplify setting of
index 1eddd61b992c566850d37fbc0633d28911b7b40d..64cded5c0a1adb0d0ce27ecf1146bc9c9c76fa87 100644 (file)
@@ -6586,6 +6586,16 @@ package body Exp_Ch3 is
          --  thus avoid creating a temporary.
 
          if Is_Delayed_Aggregate (Expr_Q) then
+
+            --  An aggregate that must be built in place is not resolved
+            --  and expanded until the enclosing construct is expanded.
+            --  This will happen when the aggregqte is limited and the
+            --  declared object has a following address clause.
+
+            if Is_Limited_Type (Typ) and then not Analyzed (Expr) then
+               Resolve (Expr, Typ);
+            end if;
+
             Convert_Aggr_In_Object_Decl (N);
 
          --  Ada 2005 (AI-318-02): If the initialization expression is a call
@@ -7022,7 +7032,7 @@ package body Exp_Ch3 is
                --  Given that the type is limited we cannot perform a copy. If
                --  Expr_Q is the reference to a variable we mark the variable
                --  as OK_To_Rename to expand this declaration into a renaming
-               --  declaration (see bellow).
+               --  declaration (see below).
 
                if Is_Entity_Name (Expr_Q) then
                   Set_OK_To_Rename (Entity (Expr_Q));
index fae1d5dc66a1b7c8546c7d808674568f1bbe006a..f7ba4dcadc66c6968f617a97878c42b1e8b83e98 100644 (file)
@@ -4283,6 +4283,14 @@ package body Sem_Ch3 is
          then
             Set_Etype (E, T);
 
+            --  If the aggregate is limited it will be built in place,
+            --  and its expansion is deferred until the object declaration
+            --  is expanded.
+
+            if Is_Limited_Type (T) then
+               Set_Expansion_Delayed (E);
+            end if;
+
          else
 
             --  If the expression is a formal that is a "subprogram pointer"
index 2103f49b4e8698bdc8467bf50acc0aeab772100b..6c45c142312afe5be4fbbd5de5b674c4b440c027 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-14  Ed Schonberg  <schonberg@adacore.com>
+
+       * gnat.dg/limited_aggr.adb, gnat.dg/limited_aggr.ads: New
+       testcase.
+
 2018-11-14  Justin Squirek  <squirek@adacore.com>
 
        * gnat.dg/enum5.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/limited_aggr.adb b/gcc/testsuite/gnat.dg/limited_aggr.adb
new file mode 100644 (file)
index 0000000..21f84ef
--- /dev/null
@@ -0,0 +1,5 @@
+--  { dg-do compile }
+
+package body Limited_Aggr is
+   procedure Dummy is null;
+end Limited_Aggr;
diff --git a/gcc/testsuite/gnat.dg/limited_aggr.ads b/gcc/testsuite/gnat.dg/limited_aggr.ads
new file mode 100644 (file)
index 0000000..49b7e8d
--- /dev/null
@@ -0,0 +1,10 @@
+package Limited_Aggr is
+   type R is limited record
+      F1, F2 : Integer;
+   end record;
+   X : array (1..2) of integer;
+   Y : R := (-111, -222);
+   for Y'Address use X'Address;
+
+   procedure Dummy;
+end Limited_Aggr;