From d7f696a040a0fd85ea58399836a77f903d6bf039 Mon Sep 17 00:00:00 2001 From: Gary Dismukes Date: Thu, 19 Dec 2019 17:00:27 -0500 Subject: [PATCH] [Ada] ICE during unnesting when nested subprograms have address taken 2020-06-02 Gary Dismukes gcc/ada/ * exp_unst.adb (Register_Subprogram): Test for Address_Taken (in addition to the existing test for In_Synchonized_Unit) when deciding whether to reset the Reachable flag on all subprograms enclosing the subprogram being registered. --- gcc/ada/exp_unst.adb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gcc/ada/exp_unst.adb b/gcc/ada/exp_unst.adb index 1460b641b19..b3ded138ee5 100644 --- a/gcc/ada/exp_unst.adb +++ b/gcc/ada/exp_unst.adb @@ -841,9 +841,13 @@ package body Exp_Unst is -- If we marked this reachable because it's in a synchronized -- unit, we have to mark all enclosing subprograms as reachable - -- as well. + -- as well. We do the same for subprograms with Address_Taken, + -- because otherwise we can run into problems with looking at + -- enclosing subprograms in Subps.Table due to their being + -- unreachable (the Subp_Index of unreachable subps is later + -- set to zero and their entry in Subps.Table is removed). - if In_Synchronized_Unit (E) then + if In_Synchronized_Unit (E) or else Address_Taken (E) then declare S : Entity_Id := E;