From: Bob Duff Date: Wed, 10 Feb 2021 23:04:42 +0000 (-0500) Subject: [Ada] Reinitialize Private_Dependents when it is vanishing X-Git-Tag: upstream/12.2.0~8089 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9fd8b9fa38ea47692abaf886ba2c30053e71623c;p=platform%2Fupstream%2Fgcc.git [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. --- diff --git a/gcc/ada/atree.adb b/gcc/ada/atree.adb index cb58e66..8f2c625 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 6b97153..448a7ad 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