From b682fcf0d9c3c221c4adfdd0b077504c6ac0a8fc Mon Sep 17 00:00:00 2001 From: Olivier Hainque Date: Wed, 23 May 2018 10:23:09 +0000 Subject: [PATCH] [Ada] Add a Is_Foreign_Exception predicate to GNAT.Exception_Actions Useful to check if an occurrence caught by a "when others" choice originates from a foreign language, e.g. C++. 2018-05-23 Olivier Hainque gcc/ada/ * libgnat/g-excact.ads (Is_Foreign_Exception): New predicate. * libgnat/g-excact.adb: Implement. From-SVN: r260588 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/libgnat/g-excact.adb | 13 +++++++++++++ gcc/ada/libgnat/g-excact.ads | 10 ++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e101c99efc8..92bfea2d0d6 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2018-05-23 Olivier Hainque + + * libgnat/g-excact.ads (Is_Foreign_Exception): New predicate. + * libgnat/g-excact.adb: Implement. + 2018-05-23 Ed Schonberg * sem_ch5.adb (Analyze_Iterator_Specification): If a subtype indication diff --git a/gcc/ada/libgnat/g-excact.adb b/gcc/ada/libgnat/g-excact.adb index 3fd738c6770..c70ecab7537 100644 --- a/gcc/ada/libgnat/g-excact.adb +++ b/gcc/ada/libgnat/g-excact.adb @@ -91,6 +91,19 @@ package body GNAT.Exception_Actions is procedure Core_Dump (Occurrence : Exception_Occurrence) is separate; + -------------------------- + -- Is_Foreign_Exception -- + -------------------------- + + function Is_Foreign_Exception (E : Exception_Occurrence) return Boolean is + Foreign_Exception : aliased Exception_Data; + pragma Import + (Ada, Foreign_Exception, "system__exceptions__foreign_exception"); + begin + return (To_Data (Exception_Identity (E)) + = Foreign_Exception'Unchecked_Access); + end Is_Foreign_Exception; + ---------------- -- Name_To_Id -- ---------------- diff --git a/gcc/ada/libgnat/g-excact.ads b/gcc/ada/libgnat/g-excact.ads index 3c21c154898..dd75bb91503 100644 --- a/gcc/ada/libgnat/g-excact.ads +++ b/gcc/ada/libgnat/g-excact.ads @@ -29,9 +29,11 @@ -- -- ------------------------------------------------------------------------------ --- This package provides support for callbacks on exceptions +-- This package provides support for callbacks on exceptions as well as +-- exception-related utility subprograms of possible interest together with +-- exception actions or more generally. --- These callbacks are called immediately when either a specific exception, +-- The callbacks are called immediately when either a specific exception, -- or any exception, is raised, before any other actions taken by raise, in -- particular before any unwinding of the stack occurs. @@ -85,6 +87,10 @@ package GNAT.Exception_Actions is -- Note: All non-predefined exceptions will return Null_Id for programs -- compiled with pragma Restriction (No_Exception_Registration) + function Is_Foreign_Exception (E : Exception_Occurrence) return Boolean; + -- Tell whether the exception occurrence E represents a foreign exception, + -- such as one raised in C++ and caught by a when others choice in Ada. + function Registered_Exceptions_Count return Natural; -- Return the number of exceptions that have been registered so far. -- Exceptions declared locally will not appear in this list until their -- 2.30.2