[Ada] Spurious error on Old attribute reference in delta aggregate
authorEd Schonberg <schonberg@adacore.com>
Thu, 10 Sep 2020 19:57:06 +0000 (15:57 -0400)
committerPierre-Marie de Rodat <derodat@adacore.com>
Mon, 26 Oct 2020 08:59:00 +0000 (04:59 -0400)
gcc/ada/

* sem_aggr.adb (Resolve_Delta_Array_Aggregate): For an
association that is an iterated component association, attach
the copy of the expression to the tree prior to analysis, in
order to preserve its context. This is needed when verifying
static semantic rules that depend on context, for example that a
use of 'Old appears only within a postcondition.

gcc/ada/sem_aggr.adb

index c75c10f9028c77b8156c64c80131a6c5896cce01..35c53bdfbe271f5060708126dcdf2bad38a86f37 100644 (file)
@@ -3026,6 +3026,7 @@ package body Sem_Aggr is
 
       Assoc  : Node_Id;
       Choice : Node_Id;
+      Expr   : Node_Id;
 
    begin
       Assoc := First (Deltas);
@@ -3062,8 +3063,12 @@ package body Sem_Aggr is
                end if;
                Enter_Name (Id);
 
-               Analyze_And_Resolve
-                 (New_Copy_Tree (Expression (Assoc)), Component_Type (Typ));
+               --  Resolve a copy of the expression, after setting
+               --  its parent properly to preserve its context.
+
+               Expr := New_Copy_Tree (Expression (Assoc));
+               Set_Parent (Expr, Assoc);
+               Analyze_And_Resolve (Expr, Component_Type (Typ));
                End_Scope;
             end;