diff options
author | Bob Duff <duff@adacore.com> | 2021-02-10 18:04:42 -0500 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-05-07 05:29:18 -0400 |
commit | 9fd8b9fa38ea47692abaf886ba2c30053e71623c (patch) | |
tree | c458249a89ae5fb04f4951f6a680e694a9172c23 /gcc/ada | |
parent | 4c2629c28d731890e529237cb6751e803df202a8 (diff) | |
download | gcc-9fd8b9fa38ea47692abaf886ba2c30053e71623c.zip gcc-9fd8b9fa38ea47692abaf886ba2c30053e71623c.tar.gz gcc-9fd8b9fa38ea47692abaf886ba2c30053e71623c.tar.bz2 |
[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.
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/atree.adb | 16 | ||||
-rw-r--r-- | 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 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 |