From: Ed Schonberg Date: Thu, 10 Sep 2020 19:57:06 +0000 (-0400) Subject: [Ada] Spurious error on Old attribute reference in delta aggregate X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cfc3a1db82cb6a11e9bdfc903f71fb116c9b6706;p=gcc.git [Ada] Spurious error on Old attribute reference in delta aggregate 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. --- diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb index c75c10f9028..35c53bdfbe2 100644 --- a/gcc/ada/sem_aggr.adb +++ b/gcc/ada/sem_aggr.adb @@ -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;