diff options
author | Hristian Kirtchev <kirtchev@adacore.com> | 2014-08-04 12:49:23 +0000 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2014-08-04 14:49:23 +0200 |
commit | df9107226f53d4ba405c2fb4c5d5c9ee2aaaec1f (patch) | |
tree | 58fef9c6eac0123c2f9470fbeb5811400f7203d6 | |
parent | 4ff2b6dcc98d42fb75c4491ab3871cef10857ebf (diff) | |
download | gcc-df9107226f53d4ba405c2fb4c5d5c9ee2aaaec1f.zip gcc-df9107226f53d4ba405c2fb4c5d5c9ee2aaaec1f.tar.gz gcc-df9107226f53d4ba405c2fb4c5d5c9ee2aaaec1f.tar.bz2 |
2014-08-04 Hristian Kirtchev <kirtchev@adacore.com>
* a-cfhama.adb, a-cfhase.adb, a-cforma.adb, a-cforse.adb Add
SPARK_Mode in the body.
* sem_ch7.adb (Analyze_Package_Body_Helper): Restore the original
way to verify the consistency of SPARK_Mode between a spec and
a body.
* sem_ch12.adb (Analyze_Package_Instantiation): Remove the call
to Set_Ignore_Pragma_SPARK_Mode. Set flag Ignore_Pragma_SPARK_Mode
manually.
(Analyze_Subprogram_Instantiation): Remove the call to
Set_Ignore_Pragma_SPARK_Mode. Set flag Ignore_Pragma_SPARK_Mode
manually.
* sem_prag.adb (Analyze_Pragma): Remove local variable
Inst_Id. SPARK_Mode can no longer be applied to a package or
subprogram instantiation.
* sem_util.adb, sem_util.ads (Set_Ignore_Pragma_SPARK_Mode):
Removed.
From-SVN: r213578
-rw-r--r-- | gcc/ada/ChangeLog | 19 | ||||
-rw-r--r-- | gcc/ada/a-cfhama.adb | 3 | ||||
-rw-r--r-- | gcc/ada/a-cfhase.adb | 3 | ||||
-rw-r--r-- | gcc/ada/a-cforma.adb | 3 | ||||
-rw-r--r-- | gcc/ada/a-cforse.adb | 3 | ||||
-rw-r--r-- | gcc/ada/sem_ch12.adb | 12 | ||||
-rw-r--r-- | gcc/ada/sem_ch7.adb | 4 | ||||
-rw-r--r-- | gcc/ada/sem_prag.adb | 127 | ||||
-rw-r--r-- | gcc/ada/sem_util.adb | 122 | ||||
-rw-r--r-- | gcc/ada/sem_util.ads | 5 |
10 files changed, 78 insertions, 223 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 6a25643..e2a5837 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,22 @@ +2014-08-04 Hristian Kirtchev <kirtchev@adacore.com> + + * a-cfhama.adb, a-cfhase.adb, a-cforma.adb, a-cforse.adb Add + SPARK_Mode in the body. + * sem_ch7.adb (Analyze_Package_Body_Helper): Restore the original + way to verify the consistency of SPARK_Mode between a spec and + a body. + * sem_ch12.adb (Analyze_Package_Instantiation): Remove the call + to Set_Ignore_Pragma_SPARK_Mode. Set flag Ignore_Pragma_SPARK_Mode + manually. + (Analyze_Subprogram_Instantiation): Remove the call to + Set_Ignore_Pragma_SPARK_Mode. Set flag Ignore_Pragma_SPARK_Mode + manually. + * sem_prag.adb (Analyze_Pragma): Remove local variable + Inst_Id. SPARK_Mode can no longer be applied to a package or + subprogram instantiation. + * sem_util.adb, sem_util.ads (Set_Ignore_Pragma_SPARK_Mode): + Removed. + 2014-08-04 Robert Dewar <dewar@adacore.com> * sem_prag.adb, osint.adb, osint.ads: Minor reformatting. diff --git a/gcc/ada/a-cfhama.adb b/gcc/ada/a-cfhama.adb index 858216f..1780bbb 100644 --- a/gcc/ada/a-cfhama.adb +++ b/gcc/ada/a-cfhama.adb @@ -33,9 +33,10 @@ pragma Elaborate_All (Ada.Containers.Hash_Tables.Generic_Bounded_Keys); with Ada.Containers.Prime_Numbers; use Ada.Containers.Prime_Numbers; -with System; use type System.Address; +with System; use type System.Address; package body Ada.Containers.Formal_Hashed_Maps is + pragma SPARK_Mode (Off); ----------------------- -- Local Subprograms -- diff --git a/gcc/ada/a-cfhase.adb b/gcc/ada/a-cfhase.adb index de09ce8..7c1f954 100644 --- a/gcc/ada/a-cfhase.adb +++ b/gcc/ada/a-cfhase.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2010-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 2010-2014, 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- -- @@ -36,6 +36,7 @@ with Ada.Containers.Prime_Numbers; use Ada.Containers.Prime_Numbers; with System; use type System.Address; package body Ada.Containers.Formal_Hashed_Sets is + pragma SPARK_Mode (Off); ----------------------- -- Local Subprograms -- diff --git a/gcc/ada/a-cforma.adb b/gcc/ada/a-cforma.adb index 69f2cc7..8a85cae 100644 --- a/gcc/ada/a-cforma.adb +++ b/gcc/ada/a-cforma.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2010-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 2010-2014, 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- -- @@ -35,6 +35,7 @@ pragma Elaborate_All (Ada.Containers.Red_Black_Trees.Generic_Bounded_Keys); with System; use type System.Address; package body Ada.Containers.Formal_Ordered_Maps is + pragma SPARK_Mode (Off); ----------------------------- -- Node Access Subprograms -- diff --git a/gcc/ada/a-cforse.adb b/gcc/ada/a-cforse.adb index d1e6b8c..966853a1 100644 --- a/gcc/ada/a-cforse.adb +++ b/gcc/ada/a-cforse.adb @@ -36,9 +36,10 @@ with Ada.Containers.Red_Black_Trees.Generic_Bounded_Set_Operations; pragma Elaborate_All (Ada.Containers.Red_Black_Trees.Generic_Bounded_Set_Operations); -with System; use type System.Address; +with System; use type System.Address; package body Ada.Containers.Formal_Ordered_Sets is + pragma SPARK_Mode (Off); ------------------------------ -- Access to Fields of Node -- diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb index a54b9aa..dd8badb 100644 --- a/gcc/ada/sem_ch12.adb +++ b/gcc/ada/sem_ch12.adb @@ -3739,11 +3739,13 @@ package body Sem_Ch12 is goto Leave; else - -- If the instance or its context is subject to SPARK_Mode "off", + -- If the context of the instance is subject to SPARK_Mode "off", -- set the global flag which signals Analyze_Pragma to ignore all -- SPARK_Mode pragmas within the instance. - Set_Ignore_Pragma_SPARK_Mode (N); + if SPARK_Mode = Off then + Ignore_Pragma_SPARK_Mode := True; + end if; Gen_Decl := Unit_Declaration_Node (Gen_Unit); @@ -4914,11 +4916,13 @@ package body Sem_Ch12 is Error_Msg_NE ("instantiation of & within itself", N, Gen_Unit); else - -- If the instance or its context is subject to SPARK_Mode "off", + -- If the context of the instance is subject to SPARK_Mode "off", -- set the global flag which signals Analyze_Pragma to ignore all -- SPARK_Mode pragmas within the instance. - Set_Ignore_Pragma_SPARK_Mode (N); + if SPARK_Mode = Off then + Ignore_Pragma_SPARK_Mode := True; + end if; Set_Entity (Gen_Id, Gen_Unit); Set_Is_Instantiated (Gen_Unit); diff --git a/gcc/ada/sem_ch7.adb b/gcc/ada/sem_ch7.adb index 4cda00c..4821db5 100644 --- a/gcc/ada/sem_ch7.adb +++ b/gcc/ada/sem_ch7.adb @@ -440,8 +440,8 @@ package body Sem_Ch7 is -- Verify that the SPARK_Mode of the body agrees with that of its spec if Present (SPARK_Pragma (Body_Id)) then - if Present (SPARK_Pragma (Spec_Id)) then - if Get_SPARK_Mode_From_Pragma (SPARK_Pragma (Spec_Id)) = Off + if Present (SPARK_Aux_Pragma (Spec_Id)) then + if Get_SPARK_Mode_From_Pragma (SPARK_Aux_Pragma (Spec_Id)) = Off and then Get_SPARK_Mode_From_Pragma (SPARK_Pragma (Body_Id)) = On then diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 40ce62f..8ef209d 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -19226,7 +19226,6 @@ package body Sem_Prag is Body_Id : Entity_Id; Context : Node_Id; - Inst_Id : Entity_Id; Mode : Name_Id; Mode_Id : SPARK_Mode_Type; Spec_Id : Entity_Id; @@ -19261,12 +19260,6 @@ package body Sem_Prag is Mode_Id := Get_SPARK_Mode_Type (Mode); Context := Parent (N); - -- Handle a compilation unit with configuration pragmas - - if Nkind (Context) = N_Compilation_Unit_Aux then - Context := Parent (Context); - end if; - -- The pragma appears in a configuration pragmas file if No (Context) then @@ -19281,59 +19274,17 @@ package body Sem_Prag is SPARK_Mode_Pragma := N; SPARK_Mode := Mode_Id; - -- The pragma applies to a compilation unit - - elsif Nkind (Context) = N_Compilation_Unit then - - -- The pragma acts as a configuration pragma - - -- pragma SPARK_Mode ...; - -- package Pack is ...; - - if List_Containing (N) = Context_Items (Context) then - Check_Valid_Configuration_Pragma; - SPARK_Mode_Pragma := N; - SPARK_Mode := Mode_Id; - - -- The pragma applies to a package instantiation that acts as a - -- compilation unit. - - -- package Inst is new Gen ...; - -- pragma SPARK_Mode ...; - - elsif Nkind (Unit (Context)) = N_Package_Instantiation then - Inst_Id := Defining_Entity (Instance_Spec (Unit (Context))); - Check_Library_Level_Entity (Inst_Id); - Check_Pragma_Conformance - (Context_Pragma => SPARK_Mode_Pragma, - Entity_Pragma => Empty, - Entity => Empty); - - Set_SPARK_Pragma (Inst_Id, N); - Set_SPARK_Pragma_Inherited (Inst_Id, False); - - -- Otherwise the pragma applies to a subprogram instantiation - -- that acts as a compilation unit. - - else - Spec_Id := Defining_Entity (Unit (Context)); - Check_Library_Level_Entity (Spec_Id); - Check_Pragma_Conformance - (Context_Pragma => SPARK_Mode_Pragma, - Entity_Pragma => Empty, - Entity => Empty); + -- The pragma acts as a configuration pragma in a compilation unit - Set_SPARK_Pragma (Spec_Id, N); - Set_SPARK_Pragma_Inherited (Spec_Id, False); + -- pragma SPARK_Mode ...; + -- package Pack is ...; - if Ekind (Spec_Id) = E_Package - and then Present (Related_Instance (Spec_Id)) - then - Inst_Id := Related_Instance (Spec_Id); - Set_SPARK_Pragma (Inst_Id, N); - Set_SPARK_Pragma_Inherited (Inst_Id, False); - end if; - end if; + elsif Nkind (Context) = N_Compilation_Unit + and then List_Containing (N) = Context_Items (Context) + then + Check_Valid_Configuration_Pragma; + SPARK_Mode_Pragma := N; + SPARK_Mode := Mode_Id; -- Otherwise the placement of the pragma within the tree dictates -- its associated construct. Inspect the declarative list where @@ -19353,37 +19304,11 @@ package body Sem_Prag is raise Pragma_Exit; end if; - -- Skip internally generated code, but consider subprogram - -- instantiations housed within their wrapper packages. + -- Skip internally generated code - elsif not Comes_From_Source (Stmt) - and then - (Nkind (Stmt) /= N_Subprogram_Declaration - or else No (Generic_Parent (Specification (Stmt)))) - then + elsif not Comes_From_Source (Stmt) then null; - -- The pragma is associated with a package or subprogram - -- instantiation that does not act as a compilation unit. - - -- package Inst is new Gen ...; - -- pragma SPARK_Mode ...; - - elsif Nkind_In (Stmt, N_Function_Instantiation, - N_Package_Instantiation, - N_Procedure_Instantiation) - then - Inst_Id := Defining_Entity (Instance_Spec (Stmt)); - Check_Library_Level_Entity (Inst_Id); - Check_Pragma_Conformance - (Context_Pragma => SPARK_Mode_Pragma, - Entity_Pragma => Empty, - Entity => Empty); - - Set_SPARK_Pragma (Inst_Id, N); - Set_SPARK_Pragma_Inherited (Inst_Id, False); - return; - -- The pragma applies to a [generic] subprogram declaration -- [generic] @@ -19416,6 +19341,16 @@ package body Sem_Prag is Prev (Stmt); end loop; + -- The pragma applies to a package or a subprogram that acts as + -- a compilation unit. + + -- procedure Proc ...; + -- pragma SPARK_Mode ...; + + if Nkind (Context) = N_Compilation_Unit_Aux then + Context := Unit (Parent (Context)); + end if; + -- The pragma appears within package declarations if Nkind (Context) = N_Package_Specification then @@ -19502,6 +19437,26 @@ package body Sem_Prag is Set_SPARK_Aux_Pragma (Body_Id, N); Set_SPARK_Aux_Pragma_Inherited (Body_Id, False); + -- The pragma appeared as an aspect of a [generic] subprogram + -- declaration that acts as a compilation unit. + + -- [generic] + -- procedure Proc ...; + -- pragma SPARK_Mode ...; + + elsif Nkind_In (Context, N_Generic_Subprogram_Declaration, + N_Subprogram_Declaration) + then + Spec_Id := Defining_Entity (Context); + Check_Library_Level_Entity (Spec_Id); + Check_Pragma_Conformance + (Context_Pragma => SPARK_Pragma (Spec_Id), + Entity_Pragma => Empty, + Entity => Empty); + + Set_SPARK_Pragma (Spec_Id, N); + Set_SPARK_Pragma_Inherited (Spec_Id, False); + -- The pragma appears at the top of subprogram body -- declarations. diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 107ce11..71a6429 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -16456,128 +16456,6 @@ package body Sem_Util is Set_Entity (N, Val); end Set_Entity_With_Checks; - ---------------------------------- - -- Set_Ignore_Pragma_SPARK_Mode -- - ---------------------------------- - - procedure Set_Ignore_Pragma_SPARK_Mode (N : Node_Id) is - procedure Set_SPARK_Mode (Expr : Node_Id); - -- Set flag Ignore_Pragma_SPARK_Mode based on the argument of aspect or - -- pragma SPARK_Mode denoted by Expr. - - -------------------- - -- Set_SPARK_Mode -- - -------------------- - - procedure Set_SPARK_Mode (Expr : Node_Id) is - begin - -- When pragma SPARK_Mode with argument "off" applies to an instance, - -- all SPARK_Mode pragmas within the instance are ignored. - - if Present (Expr) - and then Nkind (Expr) = N_Identifier - and then Chars (Expr) = Name_Off - then - Ignore_Pragma_SPARK_Mode := True; - end if; - end Set_SPARK_Mode; - - -- Local variables - - Aspects : constant List_Id := Aspect_Specifications (N); - Context : constant Node_Id := Parent (N); - Args : List_Id; - Aspect : Node_Id; - Decl : Node_Id; - - -- Start of processing for Set_Ignore_Pragma_SPARK_Mode - - begin - -- When the enclosing context of the instance has SPARK_Mode "off", all - -- SPARK_Mode pragmas within the instance are ignored. Note that there - -- is no point in checking whether the instantiation itself carries - -- aspect/pragma SPARK_Mode because it is either illegal ("on") or has - -- no effect ("off"). - - if SPARK_Mode = Off then - Ignore_Pragma_SPARK_Mode := True; - return; - end if; - - -- Inspect the aspects of the instantiation and locate SPARK_Mode. Note - -- that the aspect form of SPARK_Mode precedes a potentially duplicate - -- pragma. - - if Present (Aspects) then - Aspect := First (Aspects); - while Present (Aspect) loop - if Get_Aspect_Id (Aspect) = Aspect_SPARK_Mode then - Set_SPARK_Mode (Expression (Aspect)); - return; - end if; - - Next (Aspect); - end loop; - end if; - - -- Peek ahead of the instance and locate pragma SPARK_Mode. Even though - -- the pragma is analyzed after the instance, its mode must be known now - -- as it governs the legality of SPARK_Mode pragmas within the instance. - - Decl := Empty; - - -- The instance is a compilation unit, the pragma appears on the - -- Pragmas_After list. - - if Present (Context) - and then Nkind (Context) = N_Compilation_Unit - and then Present (Aux_Decls_Node (Context)) - and then Present (Pragmas_After (Aux_Decls_Node (Context))) - then - Decl := First (Pragmas_After (Aux_Decls_Node (Context))); - - -- The instance is part of a declarative list, the pragma appears after - -- the instance. - - elsif Is_List_Member (N) then - Decl := Next (N); - end if; - - -- Inspect all declarations following the instance - - while Present (Decl) loop - if Nkind (Decl) = N_Pragma then - if Get_Pragma_Id (Decl) = Pragma_SPARK_Mode then - Args := Pragma_Argument_Associations (Decl); - - -- The pragma argument dictates the mode - - if Present (Args) then - Set_SPARK_Mode (Get_Pragma_Arg (First (Args))); - end if; - - -- Only the first SPARK_Mode following the instance is - -- considered, any extra (illegal) pragmas are ignored. - - exit; - end if; - - -- Skip internally generated code - - elsif not Comes_From_Source (Decl) then - null; - - -- Otherwise a source construct exhaust the range where the pragma - -- may appear. - - else - exit; - end if; - - Next (Decl); - end loop; - end Set_Ignore_Pragma_SPARK_Mode; - ------------------------ -- Set_Name_Entity_Id -- ------------------------ diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads index 9ac981e..b567e43 100644 --- a/gcc/ada/sem_util.ads +++ b/gcc/ada/sem_util.ads @@ -1837,11 +1837,6 @@ package Sem_Util is -- If restriction No_Implementation_Identifiers is set, then it checks -- that the entity is not implementation defined. - procedure Set_Ignore_Pragma_SPARK_Mode (N : Node_Id); - -- Determine whether [the enclosing context of] package or subprogram N is - -- subject to pragma SPARK_Mode with mode "off". If this is the case, set - -- global flag Ignore_Pragma_SPARK_Mode to True. - procedure Set_Name_Entity_Id (Id : Name_Id; Val : Entity_Id); pragma Inline (Set_Name_Entity_Id); -- Sets the Entity_Id value associated with the given name, which is the |