From c13269965084ccb19233411164b52c7f187a5fb6 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Tue, 11 Dec 2018 11:12:21 +0000 Subject: [PATCH] [Ada] Unnesting: do not eliminate subprogram whose address is taken 2018-12-11 Ed Schonberg gcc/ada/ * exp_unst.adb (Register_Subprogram): A subprogram whose address is taken (through attribute Address or Access) is reachable and cannot be eliminated, even if there is no explicit call to it: the address may be used in an indirect call or in some address-related operation. From-SVN: r267014 --- gcc/ada/ChangeLog | 8 ++++++++ gcc/ada/exp_unst.adb | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 59d0a3f76aa..b16262327d8 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2018-12-11 Ed Schonberg + + * exp_unst.adb (Register_Subprogram): A subprogram whose address + is taken (through attribute Address or Access) is reachable and + cannot be eliminated, even if there is no explicit call to it: + the address may be used in an indirect call or in some + address-related operation. + 2018-12-11 Ed Schonberg * sem_util.adb (Get_Actual_Subtype): Function can return type diff --git a/gcc/ada/exp_unst.adb b/gcc/ada/exp_unst.adb index f8c8fd56be1..a004b49d9eb 100644 --- a/gcc/ada/exp_unst.adb +++ b/gcc/ada/exp_unst.adb @@ -770,7 +770,8 @@ package body Exp_Unst is ((Ent => E, Bod => Bod, Lev => L, - Reachable => In_Synchronized_Unit (E), + Reachable => In_Synchronized_Unit (E) + or else Address_Taken (E), Uplevel_Ref => L, Declares_AREC => False, Uents => No_Elist,