aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/restrict.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/restrict.adb')
-rw-r--r--gcc/ada/restrict.adb25
1 files changed, 22 insertions, 3 deletions
diff --git a/gcc/ada/restrict.adb b/gcc/ada/restrict.adb
index c13537d..03905ec 100644
--- a/gcc/ada/restrict.adb
+++ b/gcc/ada/restrict.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -30,7 +30,6 @@ with Errout; use Errout;
with Fname; use Fname;
with Fname.UF; use Fname.UF;
with Lib; use Lib;
-with Namet; use Namet;
with Opt; use Opt;
with Sinfo; use Sinfo;
with Sinput; use Sinput;
@@ -416,7 +415,10 @@ package body Restrict is
function No_Exception_Handlers_Set return Boolean is
begin
- return Restrictions.Set (No_Exception_Handlers);
+ return (No_Run_Time_Mode or else Configurable_Run_Time_Mode)
+ and then (Restrictions.Set (No_Exception_Handlers)
+ or else
+ Restrictions.Set (No_Exception_Propagation));
end No_Exception_Handlers_Set;
----------------------------------
@@ -625,6 +627,23 @@ package body Restrict is
N : Node_Id)
is
begin
+ -- Restriction No_Elaboration_Code must be enforced on a unit by unit
+ -- basis. Hence, we avoid setting the restriction when processing an
+ -- unit which is not the main one being compiled (or its corresponding
+ -- spec). It can happen, for example, when processing an inlined body
+ -- (the package containing the inlined subprogram is analyzed,
+ -- including its pragma Restrictions).
+
+ -- This seems like a very nasty kludge??? This is not the only per unit
+ -- restriction why is this treated specially ???
+
+ if R = No_Elaboration_Code
+ and then Current_Sem_Unit /= Main_Unit
+ and then Cunit (Current_Sem_Unit) /= Library_Unit (Cunit (Main_Unit))
+ then
+ return;
+ end if;
+
Restrictions.Set (R) := True;
if Restricted_Profile_Cached and Restricted_Profile_Result then