From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1914) id DD2C63857365; Tue, 12 Jul 2022 12:25:05 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DD2C63857365 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Pierre-Marie de Rodat To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-1619] [Ada] Ignore exceptions in task termination handlers X-Act-Checkin: gcc X-Git-Author: Bob Duff X-Git-Refname: refs/heads/master X-Git-Oldrev: 1ef1ac768ff108a6a2c08e18eec3309e182df142 X-Git-Newrev: fe6f256d5ba85a588493a489af1bdbe8087e368a Message-Id: <20220712122505.DD2C63857365@sourceware.org> Date: Tue, 12 Jul 2022 12:25:05 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Jul 2022 12:25:06 -0000 https://gcc.gnu.org/g:fe6f256d5ba85a588493a489af1bdbe8087e368a commit r13-1619-gfe6f256d5ba85a588493a489af1bdbe8087e368a Author: Bob Duff Date: Mon Jun 20 13:59:03 2022 -0400 [Ada] Ignore exceptions in task termination handlers This patch fixes a bug in which if the environment task has a specific termination handler, and that handler raises an exception, the handler is called recursively, causing infinite recursion. The RM requires such exceptions to be ignored. gcc/ada/ * libgnarl/s-solita.adb (Task_Termination_Handler_T): Ignore all exceptions propagated by Specific_Handler. * libgnarl/s-tassta.adb, libgnarl/s-taskin.ads: Minor. Diff: --- gcc/ada/libgnarl/s-solita.adb | 9 ++++++++- gcc/ada/libgnarl/s-taskin.ads | 2 +- gcc/ada/libgnarl/s-tassta.adb | 4 +--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/gcc/ada/libgnarl/s-solita.adb b/gcc/ada/libgnarl/s-solita.adb index 5bd66562b1d..dc0ce37cc52 100644 --- a/gcc/ada/libgnarl/s-solita.adb +++ b/gcc/ada/libgnarl/s-solita.adb @@ -188,7 +188,14 @@ package body System.Soft_Links.Tasking is -- fall-back handler applies only to the dependent tasks of the task". if Self_Id.Common.Specific_Handler /= null then - Self_Id.Common.Specific_Handler.all (Cause, Self_Id, EO); + begin + Self_Id.Common.Specific_Handler.all (Cause, Self_Id, EO); + exception + -- RM-C.7.3(16) requires all exceptions raised here to be ignored + + when others => + null; + end; end if; end Task_Termination_Handler_T; diff --git a/gcc/ada/libgnarl/s-taskin.ads b/gcc/ada/libgnarl/s-taskin.ads index 2e6a0bb3bcf..b313b15391b 100644 --- a/gcc/ada/libgnarl/s-taskin.ads +++ b/gcc/ada/libgnarl/s-taskin.ads @@ -1168,7 +1168,7 @@ package System.Tasking is -- -- Protection: Self.L. Once a task has set Self.Stage to Completing, it -- has exclusive access to this field. - end record; + end record; -- Ada_Task_Control_Block -------------------- -- Initialization -- diff --git a/gcc/ada/libgnarl/s-tassta.adb b/gcc/ada/libgnarl/s-tassta.adb index d6ed99ce9ba..8ba852e6707 100644 --- a/gcc/ada/libgnarl/s-tassta.adb +++ b/gcc/ada/libgnarl/s-tassta.adb @@ -1307,10 +1307,8 @@ package body System.Tasking.Stages is if TH /= null then begin TH.all (Cause, Self_ID, EO); - exception - - -- RM-C.7.3 requires all exceptions raised here to be ignored + -- RM-C.7.3(16) requires all exceptions raised here to be ignored when others => null;