From cfc3a1db82cb6a11e9bdfc903f71fb116c9b6706 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Thu, 10 Sep 2020 15:57:06 -0400 Subject: [PATCH] [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. --- gcc/ada/sem_aggr.adb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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; -- 2.30.2