[Ada] Add a Is_Foreign_Exception predicate to GNAT.Exception_Actions
authorOlivier Hainque <hainque@adacore.com>
Wed, 23 May 2018 10:23:09 +0000 (10:23 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 23 May 2018 10:23:09 +0000 (10:23 +0000)
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  <hainque@adacore.com>

gcc/ada/

* libgnat/g-excact.ads (Is_Foreign_Exception): New predicate.
* libgnat/g-excact.adb: Implement.

From-SVN: r260588

gcc/ada/ChangeLog
gcc/ada/libgnat/g-excact.adb
gcc/ada/libgnat/g-excact.ads

index e101c99efc82266ed918e436faa0fd82aab0adf2..92bfea2d0d67c94da30c8ab48c6e1b23be55f5ba 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-23  Olivier Hainque  <hainque@adacore.com>
+
+       * libgnat/g-excact.ads (Is_Foreign_Exception): New predicate.
+       * libgnat/g-excact.adb: Implement.
+
 2018-05-23  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_ch5.adb (Analyze_Iterator_Specification): If a subtype indication
index 3fd738c6770cb07eeb3b226cac9b8a69a4ec10c4..c70ecab7537325bc3f7e694f9828eb59821666a1 100644 (file)
@@ -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 --
    ----------------
index 3c21c1548983be4817ce1eab92e7219b5e8027f1..dd75bb9150389ecfe6a3935f5c0f62097c8154cc 100644 (file)
 --                                                                          --
 ------------------------------------------------------------------------------
 
---  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