aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHristian Kirtchev <kirtchev@adacore.com>2018-07-17 08:11:28 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-07-17 08:11:28 +0000
commit9cc97ad523d17ce6ae643030e5f99fe5acb68bea (patch)
tree23ba3b31f1558c7507493b0c189898086dd8d135
parent03b4b15ec70e28f945fab896d4574e3953fa2272 (diff)
downloadgcc-9cc97ad523d17ce6ae643030e5f99fe5acb68bea.zip
gcc-9cc97ad523d17ce6ae643030e5f99fe5acb68bea.tar.gz
gcc-9cc97ad523d17ce6ae643030e5f99fe5acb68bea.tar.bz2
[Ada] Configuration state not observed for instance bodies
This patch ensures that the processing of instantiated and inlined bodies uses the proper configuration context available at the point of the instantiation or inlining. Previously configuration pragmas which appear prior to the context items of a unit would lose their effect when a body is instantiated or inlined. 2018-07-17 Hristian Kirtchev <kirtchev@adacore.com> gcc/ada/ * frontend.adb (Frontend): Update the call to Register_Config_Switches. * inline.ads: Add new component Config_Switches to record Pending_Body_Info which captures the configuration state of the pending body. Remove components Version, Version_Pragma, SPARK_Mode, and SPARK_Mode_Pragma from record Pending_Body_Info because they are already captured in component Config_Switches. * opt.adb (Register_Opt_Config_Switches): Rename to Register_Config_Switches. (Restore_Opt_Config_Switches): Rename to Restore_Config_Switches. (Save_Opt_Config_Switches): Rename to Save_Config_Switches. This routine is now a function, and returns the saved configuration state as an aggregate to avoid missing an attribute. (Set_Opt_Config_Switches): Rename to Set_Config_Switches. * opt.ads (Register_Opt_Config_Switches): Rename to Register_Config_Switches. (Restore_Opt_Config_Switches): Rename to Restore_Config_Switches. (Save_Opt_Config_Switches): Rename to Save_Config_Switches. This routine is now a function. (Set_Opt_Config_Switches): Rename to Set_Config_Switches. * par.adb (Par): Update the calls to configuration switch-related subprograms. * sem.adb (Semantics): Update the calls to configuration switch-related subprograms. * sem_ch10.adb (Analyze_Package_Body_Stub): Update the calls to configuration switch-related subprograms. (Analyze_Protected_Body_Stub): Update the calls to configuration switch-related subprograms. (Analyze_Subprogram_Body_Stub): Update calls to configuration switch-related subprograms. * sem_ch12.adb (Add_Pending_Instantiation): Update the capture of pending instantiation attributes. (Inline_Instance_Body): Update the capture of pending instantiation attributes. It is no longer needed to explicitly manipulate the SPARK mode. (Instantiate_Package_Body): Update the restoration of the context attributes. (Instantiate_Subprogram_Body): Update the restoration of context attributes. (Load_Parent_Of_Generic): Update the capture of pending instantiation attributes. (Set_Instance_Env): Update the way relevant configuration attributes are saved and restored. gcc/testsuite/ * gnat.dg/config_pragma1.adb, gnat.dg/config_pragma1_pkg.ads: New testcase. From-SVN: r262794
-rw-r--r--gcc/ada/ChangeLog45
-rw-r--r--gcc/ada/frontend.adb2
-rw-r--r--gcc/ada/inline.ads28
-rw-r--r--gcc/ada/opt.adb98
-rw-r--r--gcc/ada/opt.ads27
-rw-r--r--gcc/ada/par.adb26
-rw-r--r--gcc/ada/sem.adb8
-rw-r--r--gcc/ada/sem_ch10.adb12
-rw-r--r--gcc/ada/sem_ch12.adb151
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/config_pragma1.adb21
-rw-r--r--gcc/testsuite/gnat.dg/config_pragma1_pkg.ads21
12 files changed, 249 insertions, 194 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index ae2ab5d..9fe7a3b 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,48 @@
+2018-07-17 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * frontend.adb (Frontend): Update the call to Register_Config_Switches.
+ * inline.ads: Add new component Config_Switches to record
+ Pending_Body_Info which captures the configuration state of the pending
+ body. Remove components Version, Version_Pragma, SPARK_Mode, and
+ SPARK_Mode_Pragma from record Pending_Body_Info because they are
+ already captured in component Config_Switches.
+ * opt.adb (Register_Opt_Config_Switches): Rename to
+ Register_Config_Switches.
+ (Restore_Opt_Config_Switches): Rename to Restore_Config_Switches.
+ (Save_Opt_Config_Switches): Rename to Save_Config_Switches. This
+ routine is now a function, and returns the saved configuration state as
+ an aggregate to avoid missing an attribute.
+ (Set_Opt_Config_Switches): Rename to Set_Config_Switches.
+ * opt.ads (Register_Opt_Config_Switches): Rename to
+ Register_Config_Switches.
+ (Restore_Opt_Config_Switches): Rename to Restore_Config_Switches.
+ (Save_Opt_Config_Switches): Rename to Save_Config_Switches. This
+ routine is now a function.
+ (Set_Opt_Config_Switches): Rename to Set_Config_Switches.
+ * par.adb (Par): Update the calls to configuration switch-related
+ subprograms.
+ * sem.adb (Semantics): Update the calls to configuration switch-related
+ subprograms.
+ * sem_ch10.adb (Analyze_Package_Body_Stub): Update the calls to
+ configuration switch-related subprograms.
+ (Analyze_Protected_Body_Stub): Update the calls to configuration
+ switch-related subprograms.
+ (Analyze_Subprogram_Body_Stub): Update calls to configuration
+ switch-related subprograms.
+ * sem_ch12.adb (Add_Pending_Instantiation): Update the capture of
+ pending instantiation attributes.
+ (Inline_Instance_Body): Update the capture of pending instantiation
+ attributes. It is no longer needed to explicitly manipulate the SPARK
+ mode.
+ (Instantiate_Package_Body): Update the restoration of the context
+ attributes.
+ (Instantiate_Subprogram_Body): Update the restoration of context
+ attributes.
+ (Load_Parent_Of_Generic): Update the capture of pending instantiation
+ attributes.
+ (Set_Instance_Env): Update the way relevant configuration attributes
+ are saved and restored.
+
2018-07-17 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: Deal with
diff --git a/gcc/ada/frontend.adb b/gcc/ada/frontend.adb
index 48a5d81..1af5587 100644
--- a/gcc/ada/frontend.adb
+++ b/gcc/ada/frontend.adb
@@ -303,7 +303,7 @@ begin
-- capture the values of the configuration switches (see Opt for further
-- details).
- Opt.Register_Opt_Config_Switches;
+ Register_Config_Switches;
-- Check for file which contains No_Body pragma
diff --git a/gcc/ada/inline.ads b/gcc/ada/inline.ads
index 0bda097..81f1e29 100644
--- a/gcc/ada/inline.ads
+++ b/gcc/ada/inline.ads
@@ -63,21 +63,24 @@ package Inline is
-- See full description in body of Sem_Ch12 for more details
type Pending_Body_Info is record
- Inst_Node : Node_Id;
- -- Node for instantiation that requires the body
-
Act_Decl : Node_Id;
-- Declaration for package or subprogram spec for instantiation
- Expander_Status : Boolean;
- -- If the body is instantiated only for semantic checking, expansion
- -- must be inhibited.
+ Config_Switches : Config_Switches_Type;
+ -- Capture the values of configuration switches
Current_Sem_Unit : Unit_Number_Type;
-- The semantic unit within which the instantiation is found. Must be
-- restored when compiling the body, to insure that internal entities
-- use the same counter and are unique over spec and body.
+ Expander_Status : Boolean;
+ -- If the body is instantiated only for semantic checking, expansion
+ -- must be inhibited.
+
+ Inst_Node : Node_Id;
+ -- Node for instantiation that requires the body
+
Scope_Suppress : Suppress_Record;
Local_Suppress_Stack_Top : Suppress_Stack_Entry_Ptr;
-- Save suppress information at the point of instantiation. Used to
@@ -93,21 +96,8 @@ package Inline is
-- This means we have to capture this information from the current scope
-- at the point of instantiation.
- Version : Ada_Version_Type;
- -- The body must be compiled with the same language version as the
- -- spec. The version may be set by a configuration pragma in a separate
- -- file or in the current file, and may differ from body to body.
-
- Version_Pragma : Node_Id;
- -- This is linked with the Version value
-
Warnings : Warning_Record;
-- Capture values of warning flags
-
- SPARK_Mode : SPARK_Mode_Type;
- SPARK_Mode_Pragma : Node_Id;
- -- SPARK_Mode for an instance is the one applicable at the point of
- -- instantiation. SPARK_Mode_Pragma is the related active pragma.
end record;
package Pending_Instantiations is new Table.Table (
diff --git a/gcc/ada/opt.adb b/gcc/ada/opt.adb
index 54f9123..1f12889 100644
--- a/gcc/ada/opt.adb
+++ b/gcc/ada/opt.adb
@@ -80,11 +80,11 @@ package body Opt is
return Exception_Mechanism = Back_End_ZCX;
end ZCX_Exceptions;
- ----------------------------------
- -- Register_Opt_Config_Switches --
- ----------------------------------
+ ------------------------------
+ -- Register_Config_Switches --
+ ------------------------------
- procedure Register_Opt_Config_Switches is
+ procedure Register_Config_Switches is
begin
Ada_Version_Config := Ada_Version;
Ada_Version_Pragma_Config := Ada_Version_Pragma;
@@ -118,13 +118,13 @@ package body Opt is
-- but that's not a local setting.
Optimize_Alignment_Local := False;
- end Register_Opt_Config_Switches;
+ end Register_Config_Switches;
- ---------------------------------
- -- Restore_Opt_Config_Switches --
- ---------------------------------
+ -----------------------------
+ -- Restore_Config_Switches --
+ -----------------------------
- procedure Restore_Opt_Config_Switches (Save : Config_Switches_Type) is
+ procedure Restore_Config_Switches (Save : Config_Switches_Type) is
begin
Ada_Version := Save.Ada_Version;
Ada_Version_Pragma := Save.Ada_Version_Pragma;
@@ -160,48 +160,50 @@ package body Opt is
-- Normalize_Scalars then it forces that value for all with'ed units.
Init_Or_Norm_Scalars := Initialize_Scalars or Normalize_Scalars;
- end Restore_Opt_Config_Switches;
+ end Restore_Config_Switches;
- ------------------------------
- -- Save_Opt_Config_Switches --
- ------------------------------
+ --------------------------
+ -- Save_Config_Switches --
+ --------------------------
- procedure Save_Opt_Config_Switches (Save : out Config_Switches_Type) is
+ function Save_Config_Switches return Config_Switches_Type is
begin
- Save.Ada_Version := Ada_Version;
- Save.Ada_Version_Pragma := Ada_Version_Pragma;
- Save.Ada_Version_Explicit := Ada_Version_Explicit;
- Save.Assertions_Enabled := Assertions_Enabled;
- Save.Assume_No_Invalid_Values := Assume_No_Invalid_Values;
- Save.Check_Float_Overflow := Check_Float_Overflow;
- Save.Check_Policy_List := Check_Policy_List;
- Save.Default_Pool := Default_Pool;
- Save.Default_SSO := Default_SSO;
- Save.Dynamic_Elaboration_Checks := Dynamic_Elaboration_Checks;
- Save.Exception_Locations_Suppressed := Exception_Locations_Suppressed;
- Save.Extensions_Allowed := Extensions_Allowed;
- Save.External_Name_Exp_Casing := External_Name_Exp_Casing;
- Save.External_Name_Imp_Casing := External_Name_Imp_Casing;
- Save.Fast_Math := Fast_Math;
- Save.Initialize_Scalars := Initialize_Scalars;
- Save.No_Component_Reordering := No_Component_Reordering;
- Save.Optimize_Alignment := Optimize_Alignment;
- Save.Optimize_Alignment_Local := Optimize_Alignment_Local;
- Save.Persistent_BSS_Mode := Persistent_BSS_Mode;
- Save.Polling_Required := Polling_Required;
- Save.Prefix_Exception_Messages := Prefix_Exception_Messages;
- Save.SPARK_Mode := SPARK_Mode;
- Save.SPARK_Mode_Pragma := SPARK_Mode_Pragma;
- Save.Uneval_Old := Uneval_Old;
- Save.Use_VADS_Size := Use_VADS_Size;
- Save.Warnings_As_Errors_Count := Warnings_As_Errors_Count;
- end Save_Opt_Config_Switches;
+ return
+ (Ada_Version => Ada_Version,
+ Ada_Version_Pragma => Ada_Version_Pragma,
+ Ada_Version_Explicit => Ada_Version_Explicit,
+ Assertions_Enabled => Assertions_Enabled,
+ Assume_No_Invalid_Values => Assume_No_Invalid_Values,
+ Check_Float_Overflow => Check_Float_Overflow,
+ Check_Policy_List => Check_Policy_List,
+ Default_Pool => Default_Pool,
+ Default_SSO => Default_SSO,
+ Dynamic_Elaboration_Checks => Dynamic_Elaboration_Checks,
+ Exception_Locations_Suppressed => Exception_Locations_Suppressed,
+ Extensions_Allowed => Extensions_Allowed,
+ External_Name_Exp_Casing => External_Name_Exp_Casing,
+ External_Name_Imp_Casing => External_Name_Imp_Casing,
+ Fast_Math => Fast_Math,
+ Initialize_Scalars => Initialize_Scalars,
+ No_Component_Reordering => No_Component_Reordering,
+ Normalize_Scalars => Normalize_Scalars,
+ Optimize_Alignment => Optimize_Alignment,
+ Optimize_Alignment_Local => Optimize_Alignment_Local,
+ Persistent_BSS_Mode => Persistent_BSS_Mode,
+ Polling_Required => Polling_Required,
+ Prefix_Exception_Messages => Prefix_Exception_Messages,
+ SPARK_Mode => SPARK_Mode,
+ SPARK_Mode_Pragma => SPARK_Mode_Pragma,
+ Uneval_Old => Uneval_Old,
+ Use_VADS_Size => Use_VADS_Size,
+ Warnings_As_Errors_Count => Warnings_As_Errors_Count);
+ end Save_Config_Switches;
- -----------------------------
- -- Set_Opt_Config_Switches --
- -----------------------------
+ -------------------------
+ -- Set_Config_Switches --
+ -------------------------
- procedure Set_Opt_Config_Switches
+ procedure Set_Config_Switches
(Internal_Unit : Boolean;
Main_Unit : Boolean)
is
@@ -244,12 +246,14 @@ package body Opt is
Check_Policy_List := Check_Policy_List_Config;
SPARK_Mode := SPARK_Mode_Config;
SPARK_Mode_Pragma := SPARK_Mode_Pragma_Config;
+
else
if GNAT_Mode_Config then
Assertions_Enabled := Assertions_Enabled_Config;
else
Assertions_Enabled := False;
end if;
+
Assume_No_Invalid_Values := False;
Check_Policy_List := Empty;
SPARK_Mode := None;
@@ -299,7 +303,7 @@ package body Opt is
Exception_Locations_Suppressed := Exception_Locations_Suppressed_Config;
Fast_Math := Fast_Math_Config;
Polling_Required := Polling_Required_Config;
- end Set_Opt_Config_Switches;
+ end Set_Config_Switches;
---------------
-- Tree_Read --
diff --git a/gcc/ada/opt.ads b/gcc/ada/opt.ads
index 7e23d1d..fd45984 100644
--- a/gcc/ada/opt.ads
+++ b/gcc/ada/opt.ads
@@ -2148,11 +2148,20 @@ package Opt is
type Config_Switches_Type is private;
-- Type used to save values of the switches set from Config values
- procedure Save_Opt_Config_Switches (Save : out Config_Switches_Type);
- -- This procedure saves the current values of the switches which are
- -- initialized from the above Config values.
+ procedure Register_Config_Switches;
+ -- This procedure is called after processing the gnat.adc file and other
+ -- configuration pragma files to record the values of the Config switches,
+ -- as possibly modified by the use of command line switches and pragmas
+ -- appearing in these files.
+
+ procedure Restore_Config_Switches (Save : Config_Switches_Type);
+ -- This procedure restores a set of switch values previously saved by a
+ -- call to Save_Config_Switches.
+
+ function Save_Config_Switches return Config_Switches_Type;
+ -- Return the current state of all configuration-related attributes
- procedure Set_Opt_Config_Switches
+ procedure Set_Config_Switches
(Internal_Unit : Boolean;
Main_Unit : Boolean);
-- This procedure sets the switches to the appropriate initial values. The
@@ -2164,16 +2173,6 @@ package Opt is
-- internal unit is the main unit, in which case we use the command line
-- settings.
- procedure Restore_Opt_Config_Switches (Save : Config_Switches_Type);
- -- This procedure restores a set of switch values previously saved by a
- -- call to Save_Opt_Config_Switches (Save).
-
- procedure Register_Opt_Config_Switches;
- -- This procedure is called after processing the gnat.adc file and other
- -- configuration pragma files to record the values of the Config switches,
- -- as possibly modified by the use of command line switches and pragmas
- -- appearing in these files.
-
------------------------
-- Other Global Flags --
------------------------
diff --git a/gcc/ada/par.adb b/gcc/ada/par.adb
index 070dd6d..dd6c9b6 100644
--- a/gcc/ada/par.adb
+++ b/gcc/ada/par.adb
@@ -57,22 +57,22 @@ with Tbuild; use Tbuild;
function Par (Configuration_Pragmas : Boolean) return List_Id is
+ Inside_Record_Definition : Boolean := False;
+ -- True within a record definition. Used to control warning for
+ -- redefinition of standard entities (not issued for field names).
+
+ Loop_Block_Count : Nat := 0;
+ -- Counter used for constructing loop/block names (see the routine
+ -- Par.Ch5.Get_Loop_Block_Name).
+
Num_Library_Units : Natural := 0;
-- Count number of units parsed (relevant only in syntax check only mode,
-- since in semantics check mode only a single unit is permitted anyway).
- Save_Config_Switches : Config_Switches_Type;
+ Save_Config_Attrs : Config_Switches_Type;
-- Variable used to save values of config switches while we parse the
-- new unit, to be restored on exit for proper recursive behavior.
- Loop_Block_Count : Nat := 0;
- -- Counter used for constructing loop/block names (see the routine
- -- Par.Ch5.Get_Loop_Block_Name).
-
- Inside_Record_Definition : Boolean := False;
- -- True within a record definition. Used to control warning for
- -- redefinition of standard entities (not issued for field names).
-
--------------------
-- Error Recovery --
--------------------
@@ -1517,7 +1517,7 @@ begin
-- Normal case of compilation unit
else
- Save_Opt_Config_Switches (Save_Config_Switches);
+ Save_Config_Attrs := Save_Config_Switches;
-- The following loop runs more than once in syntax check mode
-- where we allow multiple compilation units in the same file
@@ -1525,7 +1525,7 @@ begin
-- we get to the unit we want.
for Ucount in Pos loop
- Set_Opt_Config_Switches
+ Set_Config_Switches
(Is_Internal_Unit (Current_Source_Unit),
Main_Unit => Current_Source_Unit = Main_Unit);
@@ -1661,7 +1661,7 @@ begin
end if;
- Restore_Opt_Config_Switches (Save_Config_Switches);
+ Restore_Config_Switches (Save_Config_Attrs);
end loop;
-- Now that we have completely parsed the source file, we can complete
@@ -1690,7 +1690,7 @@ begin
-- Restore settings of switches saved on entry
- Restore_Opt_Config_Switches (Save_Config_Switches);
+ Restore_Config_Switches (Save_Config_Attrs);
Set_Comes_From_Source_Default (False);
end if;
diff --git a/gcc/ada/sem.adb b/gcc/ada/sem.adb
index 7fbf7bd..799d66d 100644
--- a/gcc/ada/sem.adb
+++ b/gcc/ada/sem.adb
@@ -1438,7 +1438,7 @@ package body Sem is
In_Extended_Main_Source_Unit (Comp_Unit);
-- Determine if unit is in extended main source unit
- Save_Config_Switches : Config_Switches_Type;
+ Save_Config_Attrs : Config_Switches_Type;
-- Variable used to save values of config switches while we analyze the
-- new unit, to be restored on exit for proper recursive behavior.
@@ -1518,8 +1518,8 @@ package body Sem is
-- Save current config switches and reset then appropriately
- Save_Opt_Config_Switches (Save_Config_Switches);
- Set_Opt_Config_Switches
+ Save_Config_Attrs := Save_Config_Switches;
+ Set_Config_Switches
(Is_Internal_Unit (Current_Sem_Unit),
Is_Main_Unit_Or_Main_Unit_Spec);
@@ -1602,7 +1602,7 @@ package body Sem is
Outer_Generic_Scope := S_Outer_Gen_Scope;
Style_Check := S_Style_Check;
- Restore_Opt_Config_Switches (Save_Config_Switches);
+ Restore_Config_Switches (Save_Config_Attrs);
-- Deal with restore of restrictions
diff --git a/gcc/ada/sem_ch10.adb b/gcc/ada/sem_ch10.adb
index 357fbde..39ed046 100644
--- a/gcc/ada/sem_ch10.adb
+++ b/gcc/ada/sem_ch10.adb
@@ -1624,7 +1624,7 @@ package body Sem_Ch10 is
-- Retain and restore the configuration options of the enclosing
-- context as the proper body may introduce a set of its own.
- Save_Opt_Config_Switches (Opts);
+ Opts := Save_Config_Switches;
-- Indicate that the body of the package exists. If we are doing
-- only semantic analysis, the stub stands for the body. If we are
@@ -1644,7 +1644,7 @@ package body Sem_Ch10 is
Generate_Reference (Nam, Id, 'b');
Analyze_Proper_Body (N, Nam);
- Restore_Opt_Config_Switches (Opts);
+ Restore_Config_Switches (Opts);
end if;
end Analyze_Package_Body_Stub;
@@ -1985,7 +1985,7 @@ package body Sem_Ch10 is
-- Retain and restore the configuration options of the enclosing
-- context as the proper body may introduce a set of its own.
- Save_Opt_Config_Switches (Opts);
+ Opts := Save_Config_Switches;
Set_Scope (Id, Current_Scope);
Set_Ekind (Id, E_Protected_Body);
@@ -2000,7 +2000,7 @@ package body Sem_Ch10 is
Generate_Reference (Nam, Id, 'b');
Analyze_Proper_Body (N, Etype (Nam));
- Restore_Opt_Config_Switches (Opts);
+ Restore_Config_Switches (Opts);
end if;
end Analyze_Protected_Body_Stub;
@@ -2045,7 +2045,7 @@ package body Sem_Ch10 is
-- Retain and restore the configuration options of the enclosing context
-- as the proper body may introduce a set of its own.
- Save_Opt_Config_Switches (Opts);
+ Opts := Save_Config_Switches;
-- Treat stub as a body, which checks conformance if there is a previous
-- declaration, or else introduces entity and its signature.
@@ -2053,7 +2053,7 @@ package body Sem_Ch10 is
Analyze_Subprogram_Body (N);
Analyze_Proper_Body (N, Empty);
- Restore_Opt_Config_Switches (Opts);
+ Restore_Config_Switches (Opts);
end Analyze_Subprogram_Body_Stub;
---------------------
diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index 98c646d..391d1e3 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -1031,23 +1031,18 @@ package body Sem_Ch12 is
procedure Add_Pending_Instantiation (Inst : Node_Id; Act_Decl : Node_Id) is
begin
-
- -- Add to the instantiation node and the corresponding unit declaration
- -- the current values of global flags to be used when analyzing the
- -- instance body.
+ -- Capture the body of the generic instantiation along with its context
+ -- for later processing by Instantiate_Bodies.
Pending_Instantiations.Append
- ((Inst_Node => Inst,
- Act_Decl => Act_Decl,
- Expander_Status => Expander_Active,
+ ((Act_Decl => Act_Decl,
+ Config_Switches => Save_Config_Switches,
Current_Sem_Unit => Current_Sem_Unit,
- Scope_Suppress => Scope_Suppress,
+ Expander_Status => Expander_Active,
+ Inst_Node => Inst,
Local_Suppress_Stack_Top => Local_Suppress_Stack_Top,
- Version => Ada_Version,
- Version_Pragma => Ada_Version_Pragma,
- Warnings => Save_Warnings,
- SPARK_Mode => SPARK_Mode,
- SPARK_Mode_Pragma => SPARK_Mode_Pragma));
+ Scope_Suppress => Scope_Suppress,
+ Warnings => Save_Warnings));
end Add_Pending_Instantiation;
----------------------------------
@@ -4782,17 +4777,13 @@ package body Sem_Ch12 is
Gen_Unit : Entity_Id;
Act_Decl : Node_Id)
is
+ Config_Attrs : constant Config_Switches_Type := Save_Config_Switches;
+
Curr_Comp : constant Node_Id := Cunit (Current_Sem_Unit);
Curr_Unit : constant Entity_Id := Cunit_Entity (Current_Sem_Unit);
Gen_Comp : constant Entity_Id :=
Cunit_Entity (Get_Source_Unit (Gen_Unit));
- Saved_SM : constant SPARK_Mode_Type := SPARK_Mode;
- Saved_SMP : constant Node_Id := SPARK_Mode_Pragma;
- -- Save the SPARK mode-related data to restore on exit. Removing
- -- enclosing scopes to provide a clean environment for analysis of
- -- the inlined body will eliminate any previously set SPARK_Mode.
-
Scope_Stack_Depth : constant Pos :=
Scope_Stack.Last - Scope_Stack.First + 1;
@@ -4934,25 +4925,25 @@ package body Sem_Ch12 is
pragma Assert (Num_Inner < Num_Scopes);
- -- The inlined package body must be analyzed with the SPARK_Mode of
- -- the enclosing context, otherwise the body may cause bogus errors
- -- if a configuration SPARK_Mode pragma in in effect.
-
Push_Scope (Standard_Standard);
Scope_Stack.Table (Scope_Stack.Last).Is_Active_Stack_Base := True;
+
+ -- The inlined package body is analyzed with the configuration state
+ -- of the context prior to the scope manipulations performed above.
+
+ -- ??? shouldn't this also use the warning state of the context prior
+ -- to the scope manipulations?
+
Instantiate_Package_Body
(Body_Info =>
- ((Inst_Node => N,
- Act_Decl => Act_Decl,
- Expander_Status => Expander_Active,
+ ((Act_Decl => Act_Decl,
+ Config_Switches => Config_Attrs,
Current_Sem_Unit => Current_Sem_Unit,
- Scope_Suppress => Scope_Suppress,
+ Expander_Status => Expander_Active,
+ Inst_Node => N,
Local_Suppress_Stack_Top => Local_Suppress_Stack_Top,
- Version => Ada_Version,
- Version_Pragma => Ada_Version_Pragma,
- Warnings => Save_Warnings,
- SPARK_Mode => Saved_SM,
- SPARK_Mode_Pragma => Saved_SMP)),
+ Scope_Suppress => Scope_Suppress,
+ Warnings => Save_Warnings)),
Inlined_Body => True);
Pop_Scope;
@@ -5059,17 +5050,14 @@ package body Sem_Ch12 is
else
Instantiate_Package_Body
(Body_Info =>
- ((Inst_Node => N,
- Act_Decl => Act_Decl,
- Expander_Status => Expander_Active,
+ ((Act_Decl => Act_Decl,
+ Config_Switches => Save_Config_Switches,
Current_Sem_Unit => Current_Sem_Unit,
- Scope_Suppress => Scope_Suppress,
+ Expander_Status => Expander_Active,
+ Inst_Node => N,
Local_Suppress_Stack_Top => Local_Suppress_Stack_Top,
- Version => Ada_Version,
- Version_Pragma => Ada_Version_Pragma,
- Warnings => Save_Warnings,
- SPARK_Mode => SPARK_Mode,
- SPARK_Mode_Pragma => SPARK_Mode_Pragma)),
+ Scope_Suppress => Scope_Suppress,
+ Warnings => Save_Warnings)),
Inlined_Body => True);
end if;
end Inline_Instance_Body;
@@ -8994,7 +8982,7 @@ package body Sem_Ch12 is
-- Save configuration switches. These may be reset if the unit is a
-- predefined unit, and the current mode is not Ada 2005.
- Save_Opt_Config_Switches (Saved.Switches);
+ Saved.Switches := Save_Config_Switches;
Instance_Envs.Append (Saved);
@@ -11334,13 +11322,9 @@ package body Sem_Ch12 is
Local_Suppress_Stack_Top := Body_Info.Local_Suppress_Stack_Top;
Scope_Suppress := Body_Info.Scope_Suppress;
- Opt.Ada_Version := Body_Info.Version;
- Opt.Ada_Version_Pragma := Body_Info.Version_Pragma;
- Restore_Warnings (Body_Info.Warnings);
-
- -- Install the SPARK mode which applies to the package body
- Install_SPARK_Mode (Body_Info.SPARK_Mode, Body_Info.SPARK_Mode_Pragma);
+ Restore_Config_Switches (Body_Info.Config_Switches);
+ Restore_Warnings (Body_Info.Warnings);
if No (Gen_Body_Id) then
@@ -11694,15 +11678,9 @@ package body Sem_Ch12 is
Local_Suppress_Stack_Top := Body_Info.Local_Suppress_Stack_Top;
Scope_Suppress := Body_Info.Scope_Suppress;
- Opt.Ada_Version := Body_Info.Version;
- Opt.Ada_Version_Pragma := Body_Info.Version_Pragma;
- Restore_Warnings (Body_Info.Warnings);
- -- Install the SPARK mode which applies to the subprogram body from the
- -- instantiation context. This may be refined further if an explicit
- -- SPARK_Mode pragma applies to the generic body.
-
- Install_SPARK_Mode (Body_Info.SPARK_Mode, Body_Info.SPARK_Mode_Pragma);
+ Restore_Config_Switches (Body_Info.Config_Switches);
+ Restore_Warnings (Body_Info.Warnings);
if No (Gen_Body_Id) then
@@ -13735,20 +13713,17 @@ package body Sem_Ch12 is
Decl := First_Elmt (Previous_Instances);
while Present (Decl) loop
Info :=
- (Inst_Node => Node (Decl),
- Act_Decl =>
+ (Act_Decl =>
Instance_Spec (Node (Decl)),
- Expander_Status => Exp_Status,
+ Config_Switches => Save_Config_Switches,
Current_Sem_Unit =>
Get_Code_Unit (Sloc (Node (Decl))),
- Scope_Suppress => Scope_Suppress,
+ Expander_Status => Exp_Status,
+ Inst_Node => Node (Decl),
Local_Suppress_Stack_Top =>
Local_Suppress_Stack_Top,
- Version => Ada_Version,
- Version_Pragma => Ada_Version_Pragma,
- Warnings => Save_Warnings,
- SPARK_Mode => SPARK_Mode,
- SPARK_Mode_Pragma => SPARK_Mode_Pragma);
+ Scope_Suppress => Scope_Suppress,
+ Warnings => Save_Warnings);
-- Package instance
@@ -13798,18 +13773,15 @@ package body Sem_Ch12 is
Instantiate_Package_Body
(Body_Info =>
- ((Inst_Node => Inst_Node,
- Act_Decl => True_Parent,
+ ((Act_Decl => True_Parent,
+ Config_Switches => Save_Config_Switches,
+ Current_Sem_Unit =>
+ Get_Code_Unit (Sloc (Inst_Node)),
Expander_Status => Exp_Status,
- Current_Sem_Unit => Get_Code_Unit
- (Sloc (Inst_Node)),
- Scope_Suppress => Scope_Suppress,
+ Inst_Node => Inst_Node,
Local_Suppress_Stack_Top => Local_Suppress_Stack_Top,
- Version => Ada_Version,
- Version_Pragma => Ada_Version_Pragma,
- Warnings => Save_Warnings,
- SPARK_Mode => SPARK_Mode,
- SPARK_Mode_Pragma => SPARK_Mode_Pragma)),
+ Scope_Suppress => Scope_Suppress,
+ Warnings => Save_Warnings)),
Body_Optional => Body_Optional);
end;
end if;
@@ -14405,7 +14377,7 @@ package body Sem_Ch12 is
Parent_Unit_Visible := Saved.Parent_Unit_Visible;
Instance_Parent_Unit := Saved.Instance_Parent_Unit;
- Restore_Opt_Config_Switches (Saved.Switches);
+ Restore_Config_Switches (Saved.Switches);
Instance_Envs.Decrement_Last;
end Restore_Env;
@@ -15980,11 +15952,10 @@ package body Sem_Ch12 is
Act_Unit : Entity_Id)
is
Saved_AE : constant Boolean := Assertions_Enabled;
+ Saved_CPL : constant Node_Id := Check_Policy_List;
+ Saved_DEC : constant Boolean := Dynamic_Elaboration_Checks;
Saved_SM : constant SPARK_Mode_Type := SPARK_Mode;
Saved_SMP : constant Node_Id := SPARK_Mode_Pragma;
- -- Save the SPARK mode-related data because utilizing the configuration
- -- values of pragmas and switches will eliminate any previously set
- -- SPARK_Mode.
begin
-- Regardless of the current mode, predefined units are analyzed in the
@@ -15993,20 +15964,20 @@ package body Sem_Ch12 is
-- These are always analyzed in the current mode.
if In_Internal_Unit (Gen_Unit) then
- Set_Opt_Config_Switches (True, Current_Sem_Unit = Main_Unit);
- -- In Ada2012 we may want to enable assertions in an instance of a
- -- predefined unit, in which case we need to preserve the current
- -- setting for the Assertions_Enabled flag. This will become more
- -- critical when pre/postconditions are added to predefined units,
- -- as is already the case for some numeric libraries.
+ -- The following call resets all configuration attributes to default
+ -- or the xxx_Config versions of the attributes when the current sem
+ -- unit is the main unit. At the same time, internal units must also
+ -- inherit certain configuration attributes from their context. It
+ -- is unclear what these two sets are.
- if Ada_Version >= Ada_2012 then
- Assertions_Enabled := Saved_AE;
- end if;
+ Set_Config_Switches (True, Current_Sem_Unit = Main_Unit);
+
+ -- Reinstall relevant configuration attributes of the context
- -- Reinstall the SPARK_Mode which was in effect at the point of
- -- instantiation.
+ Assertions_Enabled := Saved_AE;
+ Check_Policy_List := Saved_CPL;
+ Dynamic_Elaboration_Checks := Saved_DEC;
Install_SPARK_Mode (Saved_SM, Saved_SMP);
end if;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2c2f1e3..50cc08f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-07-17 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * gnat.dg/config_pragma1.adb, gnat.dg/config_pragma1_pkg.ads: New testcase.
+
2018-07-17 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/equal3.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/config_pragma1.adb b/gcc/testsuite/gnat.dg/config_pragma1.adb
new file mode 100644
index 0000000..bae42d2
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/config_pragma1.adb
@@ -0,0 +1,21 @@
+-- { dg-do run }
+-- { dg-options "-gnata" }
+
+with Ada.Strings.Fixed; use Ada.Strings.Fixed;
+with Config_Pragma1_Pkg; use Config_Pragma1_Pkg;
+
+procedure Config_Pragma1 is
+ Target : String10;
+
+begin
+ for I in Positive10 loop
+ Move
+ (Source => Positive10'Image(I),
+ Target => Target);
+
+ FHM.Include
+ (Container => FHMM,
+ Key => Target,
+ New_Item => I);
+ end loop;
+end Config_Pragma1;
diff --git a/gcc/testsuite/gnat.dg/config_pragma1_pkg.ads b/gcc/testsuite/gnat.dg/config_pragma1_pkg.ads
new file mode 100644
index 0000000..1715068
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/config_pragma1_pkg.ads
@@ -0,0 +1,21 @@
+pragma Assertion_Policy (Ignore);
+
+with Ada.Containers; use Ada.Containers;
+with Ada.Containers.Formal_Hashed_Maps;
+with Ada.Strings; use Ada.Strings;
+with Ada.Strings.Hash;
+
+package Config_Pragma1_Pkg is
+ subtype Positive10 is Positive range 1 .. 1000;
+ subtype String10 is String (Positive10);
+
+ package FHM is new Formal_Hashed_Maps
+ (Key_Type => String10,
+ Element_Type => Positive10,
+ Hash => Hash,
+ Equivalent_Keys => "=");
+
+ FHMM : FHM.Map
+ (Capacity => 1_000_000,
+ Modulus => FHM.Default_Modulus (Count_Type (1_000_000)));
+end Config_Pragma1_Pkg;