From 9fd8b9fa38ea47692abaf886ba2c30053e71623c Mon Sep 17 00:00:00 2001 From: Bob Duff Date: Wed, 10 Feb 2021 18:04:42 -0500 Subject: [PATCH] [Ada] Reinitialize Private_Dependents when it is vanishing gcc/ada/ * sem_ch3.adb (Process_Incomplete_Dependents): Reset Private_Dependents field to zero before calling Set_Ekind. Also move Set_Etype to after Set_Ekind, because it's always best to set the Ekind as early as possible. * atree.adb: Improve debugging facilities for vanishing fields. --- gcc/ada/atree.adb | 16 +++++++++++----- gcc/ada/sem_ch3.adb | 5 ++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/gcc/ada/atree.adb b/gcc/ada/atree.adb index cb58e665a441..8f2c625918dd 100644 --- a/gcc/ada/atree.adb +++ b/gcc/ada/atree.adb @@ -29,6 +29,8 @@ -- Checks and assertions in this package are too slow, and are mostly needed -- when working on this package itself, or on gen_il, so we disable them. +-- To debug low-level bugs in this area, comment out the following pragmas, +-- and run with -gnatd_v. pragma Suppress (All_Checks); pragma Assertion_Policy (Ignore); @@ -868,7 +870,9 @@ package body Atree is Old_Kind : constant Entity_Kind := Ekind (Old_N); -- If this fails, it means you need to call Reinit_Field_To_Zero before - -- calling Set_Ekind. + -- calling Set_Ekind. But we have many cases where vanishing fields are + -- expected to reappear after converting to/from E_Void. Other cases are + -- more problematic; set a breakpoint on "(non-E_Void case)" below. begin for J in Entity_Field_Table (Old_Kind)'Range loop @@ -882,12 +886,14 @@ package body Atree is Write_Str (New_Kind'Img); Write_Str (" Nonzero field "); Write_Str (F'Img); - Write_Str (" is vanishing"); + Write_Str (" is vanishing "); Write_Eol; - pragma Assert (New_Kind = E_Void or else Old_Kind = E_Void); - - raise Program_Error; + if New_Kind = E_Void or else Old_Kind = E_Void then + Write_Line (" (E_Void case)"); + else + Write_Line (" (non-E_Void case)"); + end if; end if; end if; end; diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 6b9715324ab5..448a7ada78b7 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -21299,8 +21299,11 @@ package body Sem_Ch3 is then Set_Subtype_Indication (Parent (Priv_Dep), New_Occurrence_Of (Full_T, Sloc (Priv_Dep))); - Set_Etype (Priv_Dep, Full_T); + Reinit_Field_To_Zero + (Priv_Dep, Private_Dependents, + Old_Ekind => E_Incomplete_Subtype); Set_Ekind (Priv_Dep, Subtype_Kind (Ekind (Full_T))); + Set_Etype (Priv_Dep, Full_T); Set_Analyzed (Parent (Priv_Dep), False); -- Reanalyze the declaration, suppressing the call to Enter_Name -- 2.47.2