From f1722339efa953eed5c69ec8869fc62b41e72ee4 Mon Sep 17 00:00:00 2001 From: Javier Miranda Date: Thu, 6 Aug 2020 13:56:50 -0400 Subject: [PATCH] [Ada] Wrong detection of potentially blocking call in protected object gcc/ada/ * exp_ch9.adb (Build_Task_Activation_Call): Do not generate a call to activate tasks if we are within the scope of a protected type and pragma Detect_Blocking is active. --- gcc/ada/exp_ch9.adb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb index 26e7321ef88..f56b7463575 100644 --- a/gcc/ada/exp_ch9.adb +++ b/gcc/ada/exp_ch9.adb @@ -4960,6 +4960,18 @@ package body Exp_Ch9 is if No (Chain) or else Is_Ignored_Ghost_Entity (Chain) then return; + + -- The availability of the activation chain entity does not ensure + -- that we have tasks to activate because it may have been declared + -- by the frontend to pass a required extra formal to a build-in-place + -- subprogram call. If we are within the scope of a protected type and + -- pragma Detect_Blocking is active we can assume that no tasks will be + -- activated; if tasks are created in a protected object and this pragma + -- is active then the frontend emits a warning and Program_Error is + -- raised at runtime. + + elsif Detect_Blocking and then Within_Protected_Type (Current_Scope) then + return; end if; -- The location of the activation call must be as close as possible to -- 2.30.2