exp_ch3.adb (Expand_N_Full_Type_Declaration): Do not capture, set and restore the...
authorHristian Kirtchev <kirtchev@adacore.com>
Fri, 16 Oct 2015 10:54:13 +0000 (10:54 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 16 Oct 2015 10:54:13 +0000 (12:54 +0200)
2015-10-16  Hristian Kirtchev  <kirtchev@adacore.com>

* exp_ch3.adb (Expand_N_Full_Type_Declaration): Do not capture,
set and restore the Ghost mode.
(Expand_N_Object_Declaration): Do not capture, set and restore the
Ghost mode.
(Freeze_Type): Redo the capture and restore of the Ghost mode.
(Restore_Globals): Removed.
* exp_ch5.adb (Expand_N_Assignment_Statement): Redo the capture
and restore of the Ghost mode.
(Restore_Globals): Removed.
* exp_ch6.adb (Expand_N_Procedure_Call_Statement):
Redo the capture and restore of the Ghost mode.
(Expand_N_Subprogram_Body): Redo the capture, set and restore
of the Ghost mode.
(Expand_N_Subprogram_Declaration): Do not
capture, set and restore the Ghost mode.
(Restore_Globals): Removed.
* exp_ch7.adb (Expand_N_Package_Body): Redo the capture, set
and restore of the Ghost mode.
(Expand_N_Package_Declaration): Do not capture, set and restore the
Ghost mode.
* exp_ch8.adb (Expand_N_Exception_Renaming_Declaration):
Redo the capture and restore of the Ghost mode.
(Expand_N_Object_Renaming_Declaration): Redo
the capture and restore of the Ghost mode.
(Expand_N_Package_Renaming_Declaration):
Redo the capture and restore of the Ghost mode.
(Expand_N_Subprogram_Renaming_Declaration): Redo the capture
and restore of the Ghost mode.
* exp_ch11.adb Remove with and use clauses for Ghost.
(Expand_N_Exception_Declaration): Do not capture, set and restore
the Ghost mode.
* exp_disp.adb (Make_DT): Redo the capture and restore of the
Ghost mode.
(Restore_Globals): Removed.
* exp_prag.adb (Expand_Pragma_Check): Do not capture, set
and restore the Ghost mode.
(Expand_Pragma_Contract_Cases):
Redo the capture and restore of the Ghost mode.  Preserve the
original context of contract cases by setting / resetting the
In_Assertion_Expr counter.
(Expand_Pragma_Initial_Condition):
Redo the capture and restore of the Ghost mode.
(Expand_Pragma_Loop_Variant): Redo the capture and restore of
the Ghost mode.
(Restore_Globals): Removed.
* exp_util.adb (Make_Predicate_Call): Redo the capture and
restore of the Ghost mode.
(Restore_Globals): Removed.
* freeze.adb (Freeze_Entity): Redo the capture and restore of
the Ghost mode.
(Restore_Globals): Removed.
* ghost.adb (Check_Ghost_Context): Remove the RM reference from
the error message.
(Is_OK_Statement): Account for statements
that appear in assertion expressions.
(Is_Subject_To_Ghost):
Moved from spec.
* ghost.ads (Is_Subject_To_Ghost): Moved to body.
* rtsfind.ads (Load_RTU): Redo the capture and restore of the
Ghost mode.
* sem.adb Add with and use clauses for Ghost.
(Analyze): Redo
the capture and restore of the Ghost mode. Set the Ghost mode
when analyzing a declaration.
(Do_Analyze): Redo the capture
and restore of the Ghost mode.
* sem_ch3.adb (Analyze_Full_Type_Declaration): Do not capture, set
and restore the Ghost mode.
(Analyze_Incomplete_Type_Decl):
Do not capture, set and restore the Ghost mode.
(Analyze_Number_Declaration): Do not capture, set and restore the
Ghost mode.
(Analyze_Object_Declaration): Do not capture, set and
restore the Ghost mode.
(Analyze_Private_Extension_Declaration):
Do not capture, set and restore the Ghost mode.
(Analyze_Subtype_Declaration): Do not capture, set and restore
the Ghost mode.
(Restore_Globals): Removed.
* sem_ch5.adb (Analyze_Assignment): Redo the capture and restore
of the Ghost mode.
(Restore_Globals): Removed.
* sem_ch6.adb (Analyze_Abstract_Subprogram_Declaration):
Do not capture, set and restore the Ghost mode.
(Analyze_Procedure_Call): Redo the capture and restore of the
Ghost mode.
(Analyze_Subprogram_Body_Helper): Redo the capture
and restore of the Ghost mode. (Analyze_Subprogram_Declaration):
Do not capture, set and restore the Ghost mode.
(Restore_Globals): Removed.
* sem_ch7.adb (Analyze_Package_Body_Helper): Redo the capture and
restore of the Ghost mode.
(Analyze_Package_Declaration):
Do not capture, set and restore the Ghost mode.
(Analyze_Private_Type_Declaration): Do not capture, set and
restore the Ghost mode.
(Restore_Globals): Removed.
* sem_ch8.adb (Analyze_Exception_Renaming): Do not capture,
set and restore the Ghost mode.
(Analyze_Generic_Renaming): Do not capture, set and restore the Ghost
mode.
(Analyze_Object_Renaming): Do not capture, set and restore the
Ghost mode.
(Analyze_Package_Renaming): Do not capture, set and restore the Ghost
mode.
(Analyze_Subprogram_Renaming): Do not capture, set and restore the
Ghost mode.
(Restore_Globals): Removed.
* sem_ch11.adb (Analyze_Exception_Declaration): Do not capture,
set and restore the Ghost mode.
* sem_ch12.adb (Analyze_Generic_Package_Declaration):
Do not capture, set and restore the Ghost mode.
(Analyze_Generic_Subprogram_Declaration): Do not capture, set
and restore the Ghost mode.
* sem_ch13.adb (Build_Invariant_Procedure_Declaration): Redo
the capture and restore of the Ghost mode.
* sem_prag.adb (Analyze_Contract_Cases_In_Decl_Part):
Redo the capture and restore of the Ghost mode.
(Analyze_External_Property_In_Decl_Part):
Redo the capture and restore of the Ghost mode.
(Analyze_Initial_Condition_In_Decl_Part): Redo the
capture and restore of the Ghost mode. (Analyze_Pragma):
Do not capture, set and restore the Ghost mode for Assert.
Redo the capture and restore of the Ghost mode for Check. Do
not capture and restore the Ghost mode for Invariant.
(Analyze_Pre_Post_Condition_In_Decl_Part): Redo the capture and
restore of the Ghost mode.
* sem_res.adb (Resolve): Capture, set and restore the Ghost mode
when resolving a declaration.
* sem_util.adb (Build_Default_Init_Cond_Procedure_Body):
Redo the capture and restore of the Ghost mode.
(Build_Default_Init_Cond_Procedure_Declaration): Redo the capture
and restore of the Ghost mode.

From-SVN: r228871

26 files changed:
gcc/ada/ChangeLog
gcc/ada/exp_ch11.adb
gcc/ada/exp_ch3.adb
gcc/ada/exp_ch5.adb
gcc/ada/exp_ch6.adb
gcc/ada/exp_ch7.adb
gcc/ada/exp_ch8.adb
gcc/ada/exp_disp.adb
gcc/ada/exp_prag.adb
gcc/ada/exp_util.adb
gcc/ada/freeze.adb
gcc/ada/ghost.adb
gcc/ada/ghost.ads
gcc/ada/rtsfind.adb
gcc/ada/sem.adb
gcc/ada/sem_ch11.adb
gcc/ada/sem_ch12.adb
gcc/ada/sem_ch13.adb
gcc/ada/sem_ch3.adb
gcc/ada/sem_ch5.adb
gcc/ada/sem_ch6.adb
gcc/ada/sem_ch7.adb
gcc/ada/sem_ch8.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_res.adb
gcc/ada/sem_util.adb

index 302c4e7657ed9ab133fa89e9d78526131a2af403..050a304ea7353d73e5484d3fb4e5b356354381e4 100644 (file)
@@ -1,3 +1,139 @@
+2015-10-16  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * exp_ch3.adb (Expand_N_Full_Type_Declaration): Do not capture,
+       set and restore the Ghost mode.
+       (Expand_N_Object_Declaration): Do not capture, set and restore the
+       Ghost mode.
+       (Freeze_Type): Redo the capture and restore of the Ghost mode.
+       (Restore_Globals): Removed.
+       * exp_ch5.adb (Expand_N_Assignment_Statement): Redo the capture
+       and restore of the Ghost mode.
+       (Restore_Globals): Removed.
+       * exp_ch6.adb (Expand_N_Procedure_Call_Statement):
+       Redo the capture and restore of the Ghost mode.
+       (Expand_N_Subprogram_Body): Redo the capture, set and restore
+       of the Ghost mode.
+       (Expand_N_Subprogram_Declaration): Do not
+       capture, set and restore the Ghost mode.
+       (Restore_Globals): Removed.
+       * exp_ch7.adb (Expand_N_Package_Body): Redo the capture, set
+       and restore of the Ghost mode.
+       (Expand_N_Package_Declaration): Do not capture, set and restore the
+       Ghost mode.
+       * exp_ch8.adb (Expand_N_Exception_Renaming_Declaration):
+       Redo the capture and restore of the Ghost mode.
+       (Expand_N_Object_Renaming_Declaration): Redo
+       the capture and restore of the Ghost mode.
+       (Expand_N_Package_Renaming_Declaration):
+       Redo the capture and restore of the Ghost mode.
+       (Expand_N_Subprogram_Renaming_Declaration): Redo the capture
+       and restore of the Ghost mode.
+       * exp_ch11.adb Remove with and use clauses for Ghost.
+       (Expand_N_Exception_Declaration): Do not capture, set and restore
+       the Ghost mode.
+       * exp_disp.adb (Make_DT): Redo the capture and restore of the
+       Ghost mode.
+       (Restore_Globals): Removed.
+       * exp_prag.adb (Expand_Pragma_Check): Do not capture, set
+       and restore the Ghost mode.
+       (Expand_Pragma_Contract_Cases):
+       Redo the capture and restore of the Ghost mode.  Preserve the
+       original context of contract cases by setting / resetting the
+       In_Assertion_Expr counter.
+       (Expand_Pragma_Initial_Condition):
+       Redo the capture and restore of the Ghost mode.
+       (Expand_Pragma_Loop_Variant): Redo the capture and restore of
+       the Ghost mode.
+       (Restore_Globals): Removed.
+       * exp_util.adb (Make_Predicate_Call): Redo the capture and
+       restore of the Ghost mode.
+       (Restore_Globals): Removed.
+       * freeze.adb (Freeze_Entity): Redo the capture and restore of
+       the Ghost mode.
+       (Restore_Globals): Removed.
+       * ghost.adb (Check_Ghost_Context): Remove the RM reference from
+       the error message.
+       (Is_OK_Statement): Account for statements
+       that appear in assertion expressions.
+       (Is_Subject_To_Ghost):
+       Moved from spec.
+       * ghost.ads (Is_Subject_To_Ghost): Moved to body.
+       * rtsfind.ads (Load_RTU): Redo the capture and restore of the
+       Ghost mode.
+       * sem.adb Add with and use clauses for Ghost.
+       (Analyze): Redo
+       the capture and restore of the Ghost mode. Set the Ghost mode
+       when analyzing a declaration.
+       (Do_Analyze): Redo the capture
+       and restore of the Ghost mode.
+       * sem_ch3.adb (Analyze_Full_Type_Declaration): Do not capture, set
+       and restore the Ghost mode.
+       (Analyze_Incomplete_Type_Decl):
+       Do not capture, set and restore the Ghost mode.
+       (Analyze_Number_Declaration): Do not capture, set and restore the
+       Ghost mode.
+       (Analyze_Object_Declaration): Do not capture, set and
+       restore the Ghost mode.
+       (Analyze_Private_Extension_Declaration):
+       Do not capture, set and restore the Ghost mode.
+       (Analyze_Subtype_Declaration): Do not capture, set and restore
+       the Ghost mode.
+       (Restore_Globals): Removed.
+       * sem_ch5.adb (Analyze_Assignment): Redo the capture and restore
+       of the Ghost mode.
+       (Restore_Globals): Removed.
+       * sem_ch6.adb (Analyze_Abstract_Subprogram_Declaration):
+       Do not capture, set and restore the Ghost mode.
+       (Analyze_Procedure_Call): Redo the capture and restore of the
+       Ghost mode.
+       (Analyze_Subprogram_Body_Helper): Redo the capture
+       and restore of the Ghost mode.  (Analyze_Subprogram_Declaration):
+       Do not capture, set and restore the Ghost mode.
+       (Restore_Globals): Removed.
+       * sem_ch7.adb (Analyze_Package_Body_Helper): Redo the capture and
+       restore of the Ghost mode.
+       (Analyze_Package_Declaration):
+       Do not capture, set and restore the Ghost mode.
+       (Analyze_Private_Type_Declaration): Do not capture, set and
+       restore the Ghost mode.
+       (Restore_Globals): Removed.
+       * sem_ch8.adb (Analyze_Exception_Renaming): Do not capture,
+       set and restore the Ghost mode.
+       (Analyze_Generic_Renaming): Do not capture, set and restore the Ghost
+       mode.
+       (Analyze_Object_Renaming): Do not capture, set and restore the
+       Ghost mode.
+       (Analyze_Package_Renaming): Do not capture, set and restore the Ghost
+       mode.
+       (Analyze_Subprogram_Renaming): Do not capture, set and restore the
+       Ghost mode.
+       (Restore_Globals): Removed.
+       * sem_ch11.adb (Analyze_Exception_Declaration): Do not capture,
+       set and restore the Ghost mode.
+       * sem_ch12.adb (Analyze_Generic_Package_Declaration):
+       Do not capture, set and restore the Ghost mode.
+       (Analyze_Generic_Subprogram_Declaration): Do not capture, set
+       and restore the Ghost mode.
+       * sem_ch13.adb (Build_Invariant_Procedure_Declaration): Redo
+       the capture and restore of the Ghost mode.
+       * sem_prag.adb (Analyze_Contract_Cases_In_Decl_Part):
+       Redo the capture and restore of the Ghost mode.
+       (Analyze_External_Property_In_Decl_Part):
+       Redo the capture and restore of the Ghost mode.
+       (Analyze_Initial_Condition_In_Decl_Part): Redo the
+       capture and restore of the Ghost mode.  (Analyze_Pragma):
+       Do not capture, set and restore the Ghost mode for Assert.
+       Redo the capture and restore of the Ghost mode for Check. Do
+       not capture and restore the Ghost mode for Invariant.
+       (Analyze_Pre_Post_Condition_In_Decl_Part): Redo the capture and
+       restore of the Ghost mode.
+       * sem_res.adb (Resolve): Capture, set and restore the Ghost mode
+       when resolving a declaration.
+       * sem_util.adb (Build_Default_Init_Cond_Procedure_Body):
+       Redo the capture and restore of the Ghost mode.
+       (Build_Default_Init_Cond_Procedure_Declaration): Redo the capture
+       and restore of the Ghost mode.
+
 2015-10-16  Bob Duff  <duff@adacore.com>
 
        * debug.adb: Document -gnatdQ switch.
index 47c373081b3c1d5d89ec2431900c9288bbc809aa..6ffc8a02f5068c564812cf646a772e9c41586bbc 100644 (file)
@@ -31,7 +31,6 @@ with Errout;   use Errout;
 with Exp_Ch7;  use Exp_Ch7;
 with Exp_Intr; use Exp_Intr;
 with Exp_Util; use Exp_Util;
-with Ghost;    use Ghost;
 with Namet;    use Namet;
 with Nlists;   use Nlists;
 with Nmake;    use Nmake;
@@ -1190,9 +1189,8 @@ package body Exp_Ch11 is
    --     end if;
 
    procedure Expand_N_Exception_Declaration (N : Node_Id) is
-      GM      : constant Ghost_Mode_Type := Ghost_Mode;
-      Id      : constant Entity_Id       := Defining_Identifier (N);
-      Loc     : constant Source_Ptr      := Sloc (N);
+      Id      : constant Entity_Id  := Defining_Identifier (N);
+      Loc     : constant Source_Ptr := Sloc (N);
       Ex_Id   : Entity_Id;
       Flag_Id : Entity_Id;
       L       : List_Id;
@@ -1279,12 +1277,6 @@ package body Exp_Ch11 is
          return;
       end if;
 
-      --  The exception declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       --  Definition of the external name: nam : constant String := "A.B.NAME";
 
       Ex_Id :=
@@ -1391,11 +1383,6 @@ package body Exp_Ch11 is
             Insert_List_After_And_Analyze (N, L);
          end if;
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Expand_N_Exception_Declaration;
 
    ---------------------------------------------
index 885e63a4ae9d80387d37fa8d2186933de76ff84f..8574ba0fd46bc60320e2de64867d201447e8a8e2 100644 (file)
@@ -4786,21 +4786,14 @@ package body Exp_Ch3 is
 
       --  Local declarations
 
-      Def_Id : constant Entity_Id       := Defining_Identifier (N);
-      B_Id   : constant Entity_Id       := Base_Type (Def_Id);
-      GM     : constant Ghost_Mode_Type := Ghost_Mode;
+      Def_Id : constant Entity_Id := Defining_Identifier (N);
+      B_Id   : constant Entity_Id := Base_Type (Def_Id);
       FN     : Node_Id;
       Par_Id : Entity_Id;
 
    --  Start of processing for Expand_N_Full_Type_Declaration
 
    begin
-      --  The type declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       if Is_Access_Type (Def_Id) then
          Build_Master (Def_Id);
 
@@ -4924,11 +4917,6 @@ package body Exp_Ch3 is
             end if;
          end;
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Expand_N_Full_Type_Declaration;
 
    ---------------------------------
@@ -4936,13 +4924,12 @@ package body Exp_Ch3 is
    ---------------------------------
 
    procedure Expand_N_Object_Declaration (N : Node_Id) is
-      Loc      : constant Source_Ptr      := Sloc (N);
-      Def_Id   : constant Entity_Id       := Defining_Identifier (N);
-      Expr     : constant Node_Id         := Expression (N);
-      GM       : constant Ghost_Mode_Type := Ghost_Mode;
-      Obj_Def  : constant Node_Id         := Object_Definition (N);
-      Typ      : constant Entity_Id       := Etype (Def_Id);
-      Base_Typ : constant Entity_Id       := Base_Type (Typ);
+      Loc      : constant Source_Ptr := Sloc (N);
+      Def_Id   : constant Entity_Id  := Defining_Identifier (N);
+      Expr     : constant Node_Id    := Expression (N);
+      Obj_Def  : constant Node_Id    := Object_Definition (N);
+      Typ      : constant Entity_Id  := Etype (Def_Id);
+      Base_Typ : constant Entity_Id  := Base_Type (Typ);
       Expr_Q   : Node_Id;
 
       function Build_Equivalent_Aggregate return Boolean;
@@ -4954,9 +4941,6 @@ package body Exp_Ch3 is
       --  Generate all default initialization actions for object Def_Id. Any
       --  new code is inserted after node After.
 
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
       function Rewrite_As_Renaming return Boolean;
       --  Indicate whether to rewrite a declaration with initialization into an
       --  object renaming declaration (see below).
@@ -5387,15 +5371,6 @@ package body Exp_Ch3 is
          end if;
       end Default_Initialize_Object;
 
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
       -------------------------
       -- Rewrite_As_Renaming --
       -------------------------
@@ -5439,12 +5414,6 @@ package body Exp_Ch3 is
          return;
       end if;
 
-      --  The object declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       --  First we do special processing for objects of a tagged type where
       --  this is the point at which the type is frozen. The creation of the
       --  dispatch table and the initialization procedure have to be deferred
@@ -5613,7 +5582,6 @@ package body Exp_Ch3 is
            and then Is_Build_In_Place_Function_Call (Expr_Q)
          then
             Make_Build_In_Place_Call_In_Object_Declaration (N, Expr_Q);
-            Restore_Globals;
 
             --  The previous call expands the expression initializing the
             --  built-in-place object into further code that will be analyzed
@@ -5858,7 +5826,6 @@ package body Exp_Ch3 is
                end;
             end if;
 
-            Restore_Globals;
             return;
 
          --  Common case of explicit object initialization
@@ -5974,7 +5941,6 @@ package body Exp_Ch3 is
                --  to avoid its management in the backend
 
                Set_Expression (N, Empty);
-               Restore_Globals;
                return;
 
             --  Handle initialization of limited tagged types
@@ -6196,13 +6162,10 @@ package body Exp_Ch3 is
          end;
       end if;
 
-      Restore_Globals;
-
    --  Exception on library entity not available
 
    exception
       when RE_Not_Available =>
-         Restore_Globals;
          return;
    end Expand_N_Object_Declaration;
 
@@ -7523,10 +7486,6 @@ package body Exp_Ch3 is
    --  node using Append_Freeze_Actions.
 
    function Freeze_Type (N : Node_Id) return Boolean is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-      --  Save the current Ghost mode in effect in case the type being frozen
-      --  sets a different mode.
-
       procedure Process_RACW_Types (Typ : Entity_Id);
       --  Validate and generate stubs for all RACW types associated with type
       --  Typ.
@@ -7535,9 +7494,6 @@ package body Exp_Ch3 is
       --  Associate type Typ's Finalize_Address primitive with the finalization
       --  masters of pending access-to-Typ types.
 
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
       ------------------------
       -- Process_RACW_Types --
       ------------------------
@@ -7618,26 +7574,19 @@ package body Exp_Ch3 is
          end if;
       end Process_Pending_Access_Types;
 
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
       --  Local variables
 
       Def_Id : constant Entity_Id := Entity (N);
       Result : Boolean := False;
 
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
    --  Start of processing for Freeze_Type
 
    begin
-      --  The type being frozen may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  freezing are properly flagged as ignored Ghost.
+      --  The type being frozen may be subject to pragma Ghost. Set the mode
+      --  now to ensure that any nodes generated during freezing are properly
+      --  marked as Ghost.
 
       Set_Ghost_Mode (N, Def_Id);
 
@@ -7954,12 +7903,12 @@ package body Exp_Ch3 is
       Process_Pending_Access_Types (Def_Id);
       Freeze_Stream_Operations (N, Def_Id);
 
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
       return Result;
 
    exception
       when RE_Not_Available =>
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return False;
    end Freeze_Type;
 
index 8cb77332636b5bfb5249790b59fd65f860d98842..3584202a6dcd3e597d6a727599b956bd51064757 100644 (file)
@@ -1627,22 +1627,6 @@ package body Exp_Ch5 is
    --  cannot just be passed on to the back end in untransformed state.
 
    procedure Expand_N_Assignment_Statement (N : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
-      --  Local variables
-
       Crep : constant Boolean    := Change_Of_Representation (N);
       Lhs  : constant Node_Id    := Name (N);
       Loc  : constant Source_Ptr := Sloc (N);
@@ -1650,12 +1634,12 @@ package body Exp_Ch5 is
       Typ  : constant Entity_Id  := Underlying_Type (Etype (Lhs));
       Exp  : Node_Id;
 
-   --  Start of processing for Expand_N_Assignment_Statement
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    begin
-      --  The assignment statement may be Ghost if the left hand side is Ghost.
+      --  The assignment statement is Ghost when the left hand side is Ghost.
       --  Set the mode now to ensure that any nodes generated during expansion
-      --  are properly flagged as ignored Ghost.
+      --  are properly marked as Ghost.
 
       Set_Ghost_Mode (N);
 
@@ -1668,7 +1652,7 @@ package body Exp_Ch5 is
 
       if Componentwise_Assignment (N) then
          Expand_Assign_Record (N);
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
       end if;
 
@@ -1763,7 +1747,7 @@ package body Exp_Ch5 is
                Rewrite (N, Call);
                Analyze (N);
 
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return;
             end if;
          end;
@@ -1914,7 +1898,7 @@ package body Exp_Ch5 is
          Rewrite (N, Make_Null_Statement (Loc));
          Analyze (N);
 
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
       end if;
 
@@ -2134,7 +2118,7 @@ package body Exp_Ch5 is
 
          if not Crep then
             Expand_Bit_Packed_Element_Set (N);
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return;
 
          --  Change of representation case
@@ -2186,7 +2170,7 @@ package body Exp_Ch5 is
          --  Nothing to do for valuetypes
          --  ??? Set_Scope_Is_Transient (False);
 
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
 
       elsif Is_Tagged_Type (Typ)
@@ -2242,7 +2226,7 @@ package body Exp_Ch5 is
                   --  expansion, since they would be missed in -gnatc mode ???
 
                   Error_Msg_N ("assignment not available on limited type", N);
-                  Restore_Globals;
+                  Ghost_Mode := Save_Ghost_Mode;
                   return;
                end if;
 
@@ -2413,7 +2397,7 @@ package body Exp_Ch5 is
             --  it with all checks suppressed.
 
             Analyze (N, Suppress => All_Checks);
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return;
          end Tagged_Case;
 
@@ -2431,7 +2415,7 @@ package body Exp_Ch5 is
             end loop;
 
             Expand_Assign_Array (N, Actual_Rhs);
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return;
          end;
 
@@ -2439,7 +2423,7 @@ package body Exp_Ch5 is
 
       elsif Is_Record_Type (Typ) then
          Expand_Assign_Record (N);
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
 
       --  Scalar types. This is where we perform the processing related to the
@@ -2552,11 +2536,11 @@ package body Exp_Ch5 is
          end if;
       end if;
 
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
 
    exception
       when RE_Not_Available =>
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
    end Expand_N_Assignment_Statement;
 
index 67caf2f2787556e421e148894ae42b55f14c5d70..e6efc3ab80f013e0e3664159b747b95773d595fa 100644 (file)
@@ -4917,20 +4917,17 @@ package body Exp_Ch6 is
    ---------------------------------------
 
    procedure Expand_N_Procedure_Call_Statement (N : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    begin
-      --  The procedure call may be Ghost if the name is Ghost. Set the mode
-      --  now to ensure that any nodes generated during expansion are properly
-      --  flagged as ignored Ghost.
+      --  The procedure call is Ghost when the name is Ghost. Set the mode now
+      --  to ensure that any nodes generated during expansion are properly set
+      --  as Ghost.
 
       Set_Ghost_Mode (N);
-      Expand_Call (N);
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
 
-      Ghost_Mode := GM;
+      Expand_Call (N);
+      Ghost_Mode := Save_Ghost_Mode;
    end Expand_N_Procedure_Call_Statement;
 
    --------------------------------------
@@ -5005,10 +5002,9 @@ package body Exp_Ch6 is
    --  Wrap thread body
 
    procedure Expand_N_Subprogram_Body (N : Node_Id) is
-      GM       : constant Ghost_Mode_Type := Ghost_Mode;
-      Loc      : constant Source_Ptr      := Sloc (N);
-      HSS      : constant Node_Id         := Handled_Statement_Sequence (N);
-      Body_Id  : Entity_Id;
+      Body_Id  : constant Entity_Id  := Defining_Entity (N);
+      HSS      : constant Node_Id    := Handled_Statement_Sequence (N);
+      Loc      : constant Source_Ptr := Sloc (N);
       Except_H : Node_Id;
       L        : List_Id;
       Spec_Id  : Entity_Id;
@@ -5019,9 +5015,6 @@ package body Exp_Ch6 is
       --  the latter test is not critical, it does not matter if we add a few
       --  extra returns, since they get eliminated anyway later on.
 
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
       ----------------
       -- Add_Return --
       ----------------
@@ -5094,23 +5087,25 @@ package body Exp_Ch6 is
          end if;
       end Add_Return;
 
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
+      --  Local varaibles
 
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    --  Start of processing for Expand_N_Subprogram_Body
 
    begin
-      --  The subprogram body may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  expansion are flagged as ignored Ghost.
+      if Present (Corresponding_Spec (N)) then
+         Spec_Id := Corresponding_Spec (N);
+      else
+         Spec_Id := Body_Id;
+      end if;
 
-      Set_Ghost_Mode (N);
+      --  The subprogram body is Ghost when it is stand alone and subject to
+      --  pragma Ghost or the corresponding spec is Ghost. To accomodate both
+      --  cases, set the mode now to ensure that any nodes generated during
+      --  expansion are marked as Ghost.
+
+      Set_Ghost_Mode (N, Spec_Id);
 
       --  Set L to either the list of declarations if present, or to the list
       --  of statements if no declarations are present. This is used to insert
@@ -5164,16 +5159,6 @@ package body Exp_Ch6 is
          end;
       end if;
 
-      --  Find entity for subprogram
-
-      Body_Id := Defining_Entity (N);
-
-      if Present (Corresponding_Spec (N)) then
-         Spec_Id := Corresponding_Spec (N);
-      else
-         Spec_Id := Body_Id;
-      end if;
-
       --  Need poll on entry to subprogram if polling enabled. We only do this
       --  for non-empty subprograms, since it does not seem necessary to poll
       --  for a dummy null subprogram.
@@ -5288,7 +5273,7 @@ package body Exp_Ch6 is
               Make_Handled_Sequence_Of_Statements (Loc,
                 Statements => New_List (Make_Null_Statement (Loc))));
 
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return;
          end if;
       end if;
@@ -5424,7 +5409,7 @@ package body Exp_Ch6 is
          Unest_Bodies.Append ((Spec_Id, N));
       end if;
 
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
    end Expand_N_Subprogram_Body;
 
    -----------------------------------
@@ -5451,21 +5436,14 @@ package body Exp_Ch6 is
    --  If the declaration is for a null procedure, emit null body
 
    procedure Expand_N_Subprogram_Declaration (N : Node_Id) is
-      Loc       : constant Source_Ptr      := Sloc (N);
-      GM        : constant Ghost_Mode_Type := Ghost_Mode;
-      Subp      : constant Entity_Id       := Defining_Entity (N);
-      Scop      : constant Entity_Id       := Scope (Subp);
+      Loc       : constant Source_Ptr := Sloc (N);
+      Subp      : constant Entity_Id  := Defining_Entity (N);
+      Scop      : constant Entity_Id  := Scope (Subp);
       Prot_Bod  : Node_Id;
       Prot_Decl : Node_Id;
       Prot_Id   : Entity_Id;
 
    begin
-      --  The subprogram declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  expansion are flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       --  In SPARK, subprogram declarations are only allowed in package
       --  specifications.
 
@@ -5566,11 +5544,6 @@ package body Exp_Ch6 is
             Set_Is_Inlined (Subp, False);
          end;
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Expand_N_Subprogram_Declaration;
 
    --------------------------------
index 23d97d502e8807da89d2aa5c4bd9637b55468fe6..a45b911d1ae17279220abae499f82d6b01eef078 100644 (file)
@@ -4177,26 +4177,27 @@ package body Exp_Ch7 is
    --  Encode entity names in package body
 
    procedure Expand_N_Package_Body (N : Node_Id) is
-      GM       : constant Ghost_Mode_Type := Ghost_Mode;
-      Spec_Ent : constant Entity_Id := Corresponding_Spec (N);
-      Fin_Id   : Entity_Id;
+      Spec_Id : constant Entity_Id := Corresponding_Spec (N);
+      Fin_Id  : Entity_Id;
+
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    begin
-      --  The package body may be subject to pragma Ghost with policy Ignore.
-      --  Set the mode now to ensure that any nodes generated during expansion
-      --  are properly flagged as ignored Ghost.
+      --  The package body is Ghost when the corresponding spec is Ghost. Set
+      --  the mode now to ensure that any nodes generated during expansion are
+      --  properly marked as Ghost.
 
-      Set_Ghost_Mode (N);
+      Set_Ghost_Mode (N, Spec_Id);
 
       --  This is done only for non-generic packages
 
-      if Ekind (Spec_Ent) = E_Package then
+      if Ekind (Spec_Id) = E_Package then
          Push_Scope (Corresponding_Spec (N));
 
          --  Build dispatch tables of library level tagged types
 
          if Tagged_Type_Expansion
-           and then Is_Library_Level_Entity (Spec_Ent)
+           and then Is_Library_Level_Entity (Spec_Id)
          then
             Build_Static_Dispatch_Tables (N);
          end if;
@@ -4207,7 +4208,7 @@ package body Exp_Ch7 is
          --  assertion expression must be verified at the end of the body
          --  statements.
 
-         if Present (Get_Pragma (Spec_Ent, Pragma_Initial_Condition)) then
+         if Present (Get_Pragma (Spec_Id, Pragma_Initial_Condition)) then
             Expand_Pragma_Initial_Condition (N);
          end if;
 
@@ -4215,13 +4216,13 @@ package body Exp_Ch7 is
       end if;
 
       Set_Elaboration_Flag (N, Corresponding_Spec (N));
-      Set_In_Package_Body (Spec_Ent, False);
+      Set_In_Package_Body (Spec_Id, False);
 
       --  Set to encode entity names in package body before gigi is called
 
       Qualify_Entity_Names (N);
 
-      if Ekind (Spec_Ent) /= E_Generic_Package then
+      if Ekind (Spec_Id) /= E_Generic_Package then
          Build_Finalizer
            (N           => N,
             Clean_Stmts => No_List,
@@ -4244,10 +4245,7 @@ package body Exp_Ch7 is
          end if;
       end if;
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Expand_N_Package_Body;
 
    ----------------------------------
@@ -4260,7 +4258,6 @@ package body Exp_Ch7 is
    --  appear.
 
    procedure Expand_N_Package_Declaration (N : Node_Id) is
-      GM     : constant Ghost_Mode_Type := Ghost_Mode;
       Id     : constant Entity_Id := Defining_Entity (N);
       Spec   : constant Node_Id   := Specification (N);
       Decls  : List_Id;
@@ -4304,12 +4301,6 @@ package body Exp_Ch7 is
          return;
       end if;
 
-      --  The package declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       --  For a package declaration that implies no associated body, generate
       --  task activation call and RACW supporting bodies now (since we won't
       --  have a specific separate compilation unit for that).
@@ -4383,11 +4374,6 @@ package body Exp_Ch7 is
 
          Set_Finalizer (Id, Fin_Id);
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Expand_N_Package_Declaration;
 
    -----------------------------
index 2c47b7f2894018b7a18ba30235e2f2f680e909ee..dfd1796ac77a6453ef34dae7fe70b553e74c62d7 100644 (file)
@@ -50,13 +50,15 @@ package body Exp_Ch8 is
    ---------------------------------------------
 
    procedure Expand_N_Exception_Renaming_Declaration (N : Node_Id) is
-      GM   : constant Ghost_Mode_Type := Ghost_Mode;
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
       Decl : Node_Id;
 
    begin
-      --  The exception renaming declaration may be subject to pragma Ghost
-      --  with policy Ignore. Set the mode now to ensure that any nodes
-      --  generated during expansion are properly flagged as ignored Ghost.
+      --  The exception renaming declaration is Ghost when it is subject to
+      --  pragma Ghost or renames a Ghost entity. To accomodate both cases, set
+      --  the mode now to ensure that any nodes generated during expansion are
+      --  properly marked as Ghost.
 
       Set_Ghost_Mode (N);
 
@@ -66,10 +68,7 @@ package body Exp_Ch8 is
          Insert_Action (N, Decl);
       end if;
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Expand_N_Exception_Renaming_Declaration;
 
    ------------------------------------------
@@ -159,14 +158,15 @@ package body Exp_Ch8 is
 
       --  Local variables
 
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    --  Start of processing for Expand_N_Object_Renaming_Declaration
 
    begin
-      --  The object renaming declaration may be subject to pragma Ghost with
-      --  policy Ignore. Set the mode now to ensure that any nodes generated
-      --  during expansion are properly flagged as ignored Ghost.
+      --  The object renaming declaration is Ghost when it is subject to pragma
+      --  Ghost or renames a Ghost entity. To accomodate both cases, set the
+      --  mode now to ensure that any nodes generated during expansion are
+      --  properly marked as Ghost.
 
       Set_Ghost_Mode (N);
 
@@ -213,10 +213,7 @@ package body Exp_Ch8 is
          Insert_Action (N, Decl);
       end if;
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Expand_N_Object_Renaming_Declaration;
 
    -------------------------------------------
@@ -224,13 +221,15 @@ package body Exp_Ch8 is
    -------------------------------------------
 
    procedure Expand_N_Package_Renaming_Declaration (N : Node_Id) is
-      GM   : constant Ghost_Mode_Type := Ghost_Mode;
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
       Decl : Node_Id;
 
    begin
-      --  The package renaming declaration may be subject to pragma Ghost with
-      --  policy Ignore. Set the mode now to ensure that any nodes generated
-      --  during expansion are properly flagged as ignored Ghost.
+      --  The package renaming declaration is Ghost when it is subject to
+      --  pragma Ghost or renames a Ghost entity. To accomodate both cases,
+      --  set the mode now to ensure that any nodes generated during expansion
+      --  are properly marked as Ghost.
 
       Set_Ghost_Mode (N);
 
@@ -273,10 +272,7 @@ package body Exp_Ch8 is
          end if;
       end if;
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Expand_N_Package_Renaming_Declaration;
 
    ----------------------------------------------
@@ -326,15 +322,16 @@ package body Exp_Ch8 is
 
       --  Local variables
 
-      GM  : constant Ghost_Mode_Type := Ghost_Mode;
-      Nam : constant Node_Id := Name (N);
+      Nam             : constant Node_Id         := Name (N);
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    --  Start of processing for Expand_N_Subprogram_Renaming_Declaration
 
    begin
-      --  The subprogram renaming declaration may be subject to pragma Ghost
-      --  with policy Ignore. Set the mode now to ensure that any nodes created
-      --  during expansion are properly flagged as ignored Ghost.
+      --  The subprogram renaming declaration is Ghost when it is subject to
+      --  pragma Ghost or renames a Ghost entity. To accomodate both cases, set
+      --  the mode now to ensure that any nodes created during expansion are
+      --  properly flagged as ignored Ghost.
 
       Set_Ghost_Mode (N);
 
@@ -402,10 +399,7 @@ package body Exp_Ch8 is
          end;
       end if;
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Expand_N_Subprogram_Renaming_Declaration;
 
 end Exp_Ch8;
index f50899b3c6b6ce63dbecbcac41ca1765df63725e..88965c71f260c1133f0d8b1234da5ec352b53d37 100644 (file)
@@ -3645,10 +3645,6 @@ package body Exp_Disp is
    --     end;
 
    function Make_DT (Typ : Entity_Id; N : Node_Id := Empty) return List_Id is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-      --  Save the current Ghost mode in effect in case the tagged type sets a
-      --  different mode.
-
       Loc : constant Source_Ptr := Sloc (Typ);
 
       Max_Predef_Prims : constant Int :=
@@ -3711,9 +3707,6 @@ package body Exp_Disp is
       --  this secondary dispatch table by Make_Tags when its unique external
       --  name was generated.
 
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
       ------------------------------
       -- Check_Premature_Freezing --
       ------------------------------
@@ -4398,15 +4391,6 @@ package body Exp_Disp is
          Append_Elmt (Iface_DT, DT_Decl);
       end Make_Secondary_DT;
 
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
       --  Local variables
 
       Elab_Code          : constant List_Id := New_List;
@@ -4436,6 +4420,8 @@ package body Exp_Disp is
       TSD_Aggr_List      : List_Id;
       TSD_Tags_List      : List_Id;
 
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
       --  The following name entries are used by Make_DT to generate a number
       --  of entities related to a tagged type. These entities may be generated
       --  in a scope other than that of the tagged type declaration, and if
@@ -4477,9 +4463,9 @@ package body Exp_Disp is
    begin
       pragma Assert (Is_Frozen (Typ));
 
-      --  The tagged type being processed may be subject to pragma Ghost with
-      --  policy Ignore. Set the mode now to ensure that any nodes generated
-      --  during dispatch table creation are properly flagged as ignored Ghost.
+      --  The tagged type being processed may be subject to pragma Ghost. Set
+      --  the mode now to ensure that any nodes generated during dispatch table
+      --  creation are properly marked as Ghost.
 
       Set_Ghost_Mode (Declaration_Node (Typ), Typ);
 
@@ -4491,12 +4477,12 @@ package body Exp_Disp is
         or else Convention (Typ) = Convention_CIL
         or else Convention (Typ) = Convention_Java
       then
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return Result;
 
       elsif No_Run_Time_Mode then
          Error_Msg_CRT ("tagged types", Typ);
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return Result;
 
       elsif not RTE_Available (RE_Tag) then
@@ -4512,7 +4498,7 @@ package body Exp_Disp is
 
          Analyze_List (Result, Suppress => All_Checks);
          Error_Msg_CRT ("tagged types", Typ);
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return Result;
       end if;
 
@@ -4523,14 +4509,14 @@ package body Exp_Disp is
       if RTE_Available (RE_Interface_Data) then
          if Max_Predef_Prims /= 15 then
             Error_Msg_N ("run-time library configuration error", Typ);
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return Result;
          end if;
       else
          if Max_Predef_Prims /= 9 then
             Error_Msg_N ("run-time library configuration error", Typ);
             Error_Msg_CRT ("tagged types", Typ);
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return Result;
          end if;
       end if;
@@ -6264,7 +6250,7 @@ package body Exp_Disp is
 
       Register_CG_Node (Typ);
 
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
       return Result;
    end Make_DT;
 
index a797f230bbfec0fec94ae9b107dbbfc20c12a253..e80b5b90ecd1287fad33abedfb14ac6c44e9a997 100644 (file)
@@ -303,9 +303,8 @@ package body Exp_Prag is
    --------------------------
 
    procedure Expand_Pragma_Check (N : Node_Id) is
-      GM   : constant Ghost_Mode_Type := Ghost_Mode;
-      Cond : constant Node_Id         := Arg2 (N);
-      Nam  : constant Name_Id         := Chars (Arg1 (N));
+      Cond : constant Node_Id := Arg2 (N);
+      Nam  : constant Name_Id := Chars (Arg1 (N));
       Msg  : Node_Id;
 
       Loc : constant Source_Ptr := Sloc (First_Node (Cond));
@@ -329,16 +328,6 @@ package body Exp_Prag is
          return;
       end if;
 
-      --  Set the Ghost mode in effect from the pragma. In general both the
-      --  assertion policy and the Ghost policy of pragma Check must agree,
-      --  but there are cases where this can be circumvented. For instance,
-      --  a living subtype with an ignored predicate may be declared in one
-      --  packade, an ignored Ghost object in another and the compilation may
-      --  use -gnata to enable assertions.
-      --  ??? Ghost predicates are under redesign
-
-      Set_Ghost_Mode (N);
-
       --  Since this check is active, we rewrite the pragma into a
       --  corresponding if statement, and then analyze the statement.
 
@@ -502,11 +491,6 @@ package body Exp_Prag is
             Error_Msg_N ("?A?check will fail at run time", N);
          end if;
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Expand_Pragma_Check;
 
    ---------------------------------
@@ -992,7 +976,8 @@ package body Exp_Prag is
 
       Aggr : constant Node_Id :=
                Expression (First (Pragma_Argument_Associations (CCs)));
-      GM   : constant Ghost_Mode_Type := Ghost_Mode;
+
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
       Case_Guard    : Node_Id;
       CG_Checks     : Node_Id;
@@ -1027,12 +1012,20 @@ package body Exp_Prag is
          return;
       end if;
 
-      --  The contract cases may be subject to pragma Ghost with policy Ignore.
-      --  Set the mode now to ensure that any nodes generated during expansion
-      --  are properly flagged as ignored Ghost.
+      --  The contract cases is Ghost when it applies to a Ghost entity. Set
+      --  the mode now to ensure that any nodes generated during expansion are
+      --  properly flagged as Ghost.
 
       Set_Ghost_Mode (CCs);
 
+      --  The expansion of contract cases is quite distributed as it produces
+      --  various statements to evaluate the case guards and consequences. To
+      --  preserve the original context, set the Is_Assertion_Expr flag. This
+      --  aids the Ghost legality checks when verifying the placement of a
+      --  reference to a Ghost entity.
+
+      In_Assertion_Expr := In_Assertion_Expr + 1;
+
       Multiple_PCs := List_Length (Component_Associations (Aggr)) > 1;
 
       --  Create the counter which tracks the number of case guards that
@@ -1258,10 +1251,8 @@ package body Exp_Prag is
 
       Append_To (Stmts, Conseq_Checks);
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      In_Assertion_Expr := In_Assertion_Expr - 1;
+      Ghost_Mode := Save_Ghost_Mode;
    end Expand_Pragma_Contract_Cases;
 
    ---------------------------------------
@@ -1361,22 +1352,6 @@ package body Exp_Prag is
    -------------------------------------
 
    procedure Expand_Pragma_Initial_Condition (Spec_Or_Body : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
-      --  Local variables
-
       Loc       : constant Source_Ptr := Sloc (Spec_Or_Body);
       Check     : Node_Id;
       Expr      : Node_Id;
@@ -1384,7 +1359,7 @@ package body Exp_Prag is
       List      : List_Id;
       Pack_Id   : Entity_Id;
 
-   --  Start of processing for Expand_Pragma_Initial_Condition
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    begin
       if Nkind (Spec_Or_Body) = N_Package_Body then
@@ -1424,9 +1399,9 @@ package body Exp_Prag is
 
       Init_Cond := Get_Pragma (Pack_Id, Pragma_Initial_Condition);
 
-      --  The initial condition be subject to pragma Ghost with policy Ignore.
-      --  Set the mode now to ensure that any nodes generated during expansion
-      --  are properly flagged as ignored Ghost.
+      --  The initial condition is Ghost when it applies to a Ghost entity. Set
+      --  the mode now to ensure that any nodes generated during expansion are
+      --  properly flagged as Ghost.
 
       Set_Ghost_Mode (Init_Cond);
 
@@ -1442,7 +1417,7 @@ package body Exp_Prag is
       --  runtime check as it will repeat the illegality.
 
       if Error_Posted (Init_Cond) or else Error_Posted (Expr) then
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
       end if;
 
@@ -1461,7 +1436,7 @@ package body Exp_Prag is
       Append_To (List, Check);
       Analyze (Check);
 
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
    end Expand_Pragma_Initial_Condition;
 
    ------------------------------------
@@ -1811,7 +1786,7 @@ package body Exp_Prag is
 
       --  Local variables
 
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    --  Start of processing for Expand_Pragma_Loop_Variant
 
@@ -1825,9 +1800,9 @@ package body Exp_Prag is
          return;
       end if;
 
-      --  The loop variant may be subject to pragma Ghost with policy Ignore.
-      --  Set the mode now to ensure that any nodes generated during expansion
-      --  are properly flagged as ignored Ghost.
+      --  The loop variant is Ghost when it applies to a Ghost entity. Set
+      --  the mode now to ensure that any nodes generated during expansion
+      --  are properly flagged as Ghost.
 
       Set_Ghost_Mode (N);
 
@@ -1892,10 +1867,7 @@ package body Exp_Prag is
       --  corresponding declarations and statements. We leave it in the tree
       --  for documentation purposes. It will be ignored by the backend.
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Expand_Pragma_Loop_Variant;
 
    --------------------------------
index eec7149ebb285112be1784784cd998a262ab1333..4cbb20bcf0255f802b878dc1670078128a5ed023 100644 (file)
@@ -6424,34 +6424,17 @@ package body Exp_Util is
       Expr : Node_Id;
       Mem  : Boolean := False) return Node_Id
    is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
-      --  Local variables
-
       Loc  : constant Source_Ptr := Sloc (Expr);
       Call : Node_Id;
       PFM  : Entity_Id;
 
-   --  Start of processing for Make_Predicate_Call
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    begin
       pragma Assert (Present (Predicate_Function (Typ)));
 
-      --  The related type may be subject to pragma Ghost with policy Ignore.
-      --  Set the mode now to ensure that the call is properly flagged as
-      --  ignored Ghost.
+      --  The related type may be subject to pragma Ghost. Set the mode now to
+      --  ensure that the call is properly marked as Ghost.
 
       Set_Ghost_Mode_From_Entity (Typ);
 
@@ -6466,7 +6449,7 @@ package body Exp_Util is
                 Name                   => New_Occurrence_Of (PFM, Loc),
                 Parameter_Associations => New_List (Relocate_Node (Expr)));
 
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return Call;
          end if;
       end if;
@@ -6479,7 +6462,7 @@ package body Exp_Util is
             New_Occurrence_Of (Predicate_Function (Typ), Loc),
           Parameter_Associations => New_List (Relocate_Node (Expr)));
 
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
       return Call;
    end Make_Predicate_Call;
 
index c7ad86c1d41b5efda83caf425d9940b6567fc0ed..b2705672cd12d3f887c7a1700cb65e5db33a72e2 100644 (file)
@@ -1870,10 +1870,6 @@ package body Freeze is
    -------------------
 
    function Freeze_Entity (E : Entity_Id; N : Node_Id) return List_Id is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-      --  Save the current Ghost mode in effect in case the entity being frozen
-      --  sets a different mode.
-
       Loc    : constant Source_Ptr := Sloc (N);
       Atype  : Entity_Id;
       Comp   : Entity_Id;
@@ -1945,9 +1941,6 @@ package body Freeze is
       --  call, but rather must go in the package holding the function, so that
       --  the backend can process it in the proper context.
 
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
       procedure Wrap_Imported_Subprogram (E : Entity_Id);
       --  If E is an entity for an imported subprogram with pre/post-conditions
       --  then this procedure will create a wrapper to ensure that proper run-
@@ -4492,15 +4485,6 @@ package body Freeze is
          Append_List (Result, Decls);
       end Late_Freeze_Subprogram;
 
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
       ------------------------------
       -- Wrap_Imported_Subprogram --
       ------------------------------
@@ -4644,12 +4628,16 @@ package body Freeze is
          end if;
       end Wrap_Imported_Subprogram;
 
+      --  Local variables
+
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
    --  Start of processing for Freeze_Entity
 
    begin
-      --  The entity being frozen may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  freezing are properly flagged as ignored Ghost.
+      --  The entity being frozen may be subject to pragma Ghost. Set the mode
+      --  now to ensure that any nodes generated during freezing are properly
+      --  flagged as Ghost.
 
       Set_Ghost_Mode_From_Entity (E);
 
@@ -4668,7 +4656,7 @@ package body Freeze is
       --  Do not freeze if already frozen since we only need one freeze node
 
       if Is_Frozen (E) then
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return No_List;
 
       --  It is improper to freeze an external entity within a generic because
@@ -4683,7 +4671,7 @@ package body Freeze is
             Analyze_Aspects_At_Freeze_Point (E);
          end if;
 
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return No_List;
 
       --  AI05-0213: A formal incomplete type does not freeze the actual. In
@@ -4694,19 +4682,19 @@ package body Freeze is
         and then No (Full_View (Base_Type (E)))
         and then Ada_Version >= Ada_2012
       then
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return No_List;
 
       --  Formal subprograms are never frozen
 
       elsif Is_Formal_Subprogram (E) then
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return No_List;
 
       --  Generic types are never frozen as they lack delayed semantic checks
 
       elsif Is_Generic_Type (E) then
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return No_List;
 
       --  Do not freeze a global entity within an inner scope created during
@@ -4740,7 +4728,7 @@ package body Freeze is
                   then
                      exit;
                   else
-                     Restore_Globals;
+                     Ghost_Mode := Save_Ghost_Mode;
                      return No_List;
                   end if;
                end if;
@@ -4776,7 +4764,7 @@ package body Freeze is
             end loop;
 
             if No (S) then
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return No_List;
             end if;
          end;
@@ -4784,7 +4772,7 @@ package body Freeze is
       elsif Ekind (E) = E_Generic_Package then
          Result := Freeze_Generic_Entities (E);
 
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return Result;
       end if;
 
@@ -4867,7 +4855,7 @@ package body Freeze is
 
             if not Is_Internal (E) then
                if not Freeze_Profile (E) then
-                  Restore_Globals;
+                  Ghost_Mode := Save_Ghost_Mode;
                   return Result;
                end if;
             end if;
@@ -4892,7 +4880,7 @@ package body Freeze is
 
             if Late_Freezing then
                Late_Freeze_Subprogram (E);
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return No_List;
             end if;
 
@@ -5055,7 +5043,7 @@ package body Freeze is
                and then not Has_Delayed_Freeze (E))
          then
             Check_Compile_Time_Size (E);
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return No_List;
          end if;
 
@@ -5330,7 +5318,7 @@ package body Freeze is
 
             if not Is_Frozen (Root_Type (E)) then
                Set_Is_Frozen (E, False);
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return Result;
             end if;
 
@@ -5466,7 +5454,7 @@ package body Freeze is
               and then not Present (Full_View (E))
             then
                Set_Is_Frozen (E, False);
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return Result;
 
             --  Case of full view present
@@ -5558,7 +5546,7 @@ package body Freeze is
                   Set_RM_Size   (E, RM_Size (Full_View (E)));
                end if;
 
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return Result;
 
             --  Case of underlying full view present
@@ -5588,7 +5576,7 @@ package body Freeze is
 
                Check_Debug_Info_Needed (E);
 
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return Result;
 
             --  Case of no full view present. If entity is derived or subtype,
@@ -5602,7 +5590,7 @@ package body Freeze is
 
             else
                Set_Is_Frozen (E, False);
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return No_List;
             end if;
 
@@ -5651,7 +5639,7 @@ package body Freeze is
          --  generic processing), so we never need freeze nodes for them.
 
          if Is_Generic_Type (E) then
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return Result;
          end if;
 
@@ -6267,7 +6255,7 @@ package body Freeze is
          end if;
       end if;
 
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
       return Result;
    end Freeze_Entity;
 
index 05295a0e3c327f7a06f89ccfe9c603d04803055d..7380d9a90576757f6c0aeef7fa70727a315d9ffb 100644 (file)
@@ -67,6 +67,12 @@ package body Ghost is
    --  Subsidiary to Check_Ghost_Context and Set_Ghost_Mode. Find the entity of
    --  a reference to a Ghost entity. Return Empty if there is no such entity.
 
+   function Is_Subject_To_Ghost (N : Node_Id) return Boolean;
+   --  Subsidiary to routines Is_OK_xxx and Set_Ghost_Mode. Determine whether
+   --  declaration or body N is subject to aspect or pragma Ghost. Use this
+   --  routine in cases where [source] pragma Ghost has not been analyzed yet,
+   --  but the context needs to establish the "ghostness" of N.
+
    procedure Propagate_Ignored_Ghost_Code (N : Node_Id);
    --  Subsidiary to routines Mark_xxx_As_Ghost and Set_Ghost_Mode_From_xxx.
    --  Signal all enclosing scopes that they now contain ignored Ghost code.
@@ -407,15 +413,27 @@ package body Ghost is
 
             --  Special cases
 
-            --  An if statement is a suitable context for a Ghost entity if it
-            --  is the byproduct of assertion expression expansion.
+            elsif Nkind (Stmt) = N_If_Statement then
 
-            elsif Nkind (Stmt) = N_If_Statement
-              and then Nkind (Original_Node (Stmt)) = N_Pragma
-              and then Assertion_Expression_Pragma
-                         (Get_Pragma_Id (Original_Node (Stmt)))
-            then
-               return True;
+               --  An if statement is a suitable context for a Ghost entity if
+               --  it is the byproduct of assertion expression expansion. Note
+               --  that the assertion expression may not be related to a Ghost
+               --  entity, but it may still contain references to Ghost
+               --  entities.
+
+               if Nkind (Original_Node (Stmt)) = N_Pragma
+                 and then Assertion_Expression_Pragma
+                            (Get_Pragma_Id (Original_Node (Stmt)))
+               then
+                  return True;
+
+               --  The expansion of pragma Contract_Cases produces various if
+               --  statements to evaluate all case guards. This is a suitable
+               --  context as Contract_Cases is an assertion expression.
+
+               elsif In_Assertion_Expr > 0 then
+                  return True;
+               end if;
             end if;
 
             return False;
@@ -517,12 +535,10 @@ package body Ghost is
          Check_Ghost_Policy (Ghost_Id, Ghost_Ref);
 
       --  Otherwise the Ghost entity appears in a non-Ghost context and affects
-      --  its behavior or value.
+      --  its behavior or value (SPARK RM 6.9(11,12)).
 
       else
-         Error_Msg_N
-           ("ghost entity cannot appear in this context (SPARK RM 6.9(11))",
-            Ghost_Ref);
+         Error_Msg_N ("ghost entity cannot appear in this context", Ghost_Ref);
       end if;
    end Check_Ghost_Context;
 
@@ -701,8 +717,8 @@ package body Ghost is
             Expr := Get_Pragma_Arg (Expr);
          end if;
 
-         --  Determine whether the expression of the aspect is static and
-         --  denotes True.
+         --  Determine whether the expression of the aspect or pragma is static
+         --  and denotes True.
 
          if Present (Expr) then
             Preanalyze_And_Resolve (Expr);
index c267e70e0fcbec389a2126bdb1509b591037410a..c854629ba82684cf7eddb38567807f76d617a63c 100644 (file)
@@ -66,12 +66,6 @@ package Ghost is
    --  Determine whether entity Id is Ghost. To qualify as such, the entity
    --  must be subject to pragma Ghost.
 
-   function Is_Subject_To_Ghost (N : Node_Id) return Boolean;
-   --  Determine whether declarative node N is subject to aspect or pragma
-   --  Ghost. Use this routine in cases where [source] pragma Ghost has not
-   --  been analyzed yet, but the context needs to establish the "ghostness"
-   --  of N.
-
    procedure Lock;
    --  Lock internal tables before calling backend
 
index c96e708872e5c6a5b531fcefc85be6ed82dfc1e2..d6da171961209c0273d16bbe0087723efa37dda4 100644 (file)
@@ -925,9 +925,7 @@ package body Rtsfind is
 
       --  Local variables
 
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-      --  Save the current Ghost mode in effect to ensure a clean environment
-      --  when analyzing the unit.
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    --  Start of processing for Load_RTU
 
@@ -1043,9 +1041,7 @@ package body Rtsfind is
          Set_Is_Potentially_Use_Visible (U.Entity, True);
       end if;
 
-      --  Restore the original Ghost mode now that analysis has taken place
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Load_RTU;
 
    --------------------
index 0f8f173a5ff078e9fed645efd33bd63c135cbb19..a6f1be13b3b448128ded25662414b9eb699cc2be 100644 (file)
@@ -29,6 +29,7 @@ with Debug_A;  use Debug_A;
 with Elists;   use Elists;
 with Expander; use Expander;
 with Fname;    use Fname;
+with Ghost;    use Ghost;
 with Lib;      use Lib;
 with Lib.Load; use Lib.Load;
 with Nlists;   use Nlists;
@@ -95,9 +96,7 @@ package body Sem is
    -------------
 
    procedure Analyze (N : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-      --  Save the current Ghost mode in effect in case the construct sets a
-      --  different mode.
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    begin
       Debug_A_Entry ("analyzing  ", N);
@@ -109,6 +108,14 @@ package body Sem is
          return;
       end if;
 
+      --  A declaration may be subject to pragma Ghost. Set the mode now to
+      --  ensure that any nodes generated during analysis and expansion are
+      --  marked as Ghost.
+
+      if Is_Declaration (N) then
+         Set_Ghost_Mode (N);
+      end if;
+
       --  Otherwise processing depends on the node kind
 
       case Nkind (N) is
@@ -720,10 +727,7 @@ package body Sem is
          Expand (N);
       end if;
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Analyze;
 
    --  Version with check(s) suppressed
@@ -1310,9 +1314,7 @@ package body Sem is
       ----------------
 
       procedure Do_Analyze is
-         GM : constant Ghost_Mode_Type := Ghost_Mode;
-         --  Save the current Ghost mode in effect in case the compilation unit
-         --  is withed from a unit with a different Ghost mode.
+         Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
          List : Elist_Id;
 
@@ -1343,7 +1345,7 @@ package body Sem is
 
          Pop_Scope;
          Restore_Scope_Stack (List);
-         Ghost_Mode := GM;
+         Ghost_Mode := Save_Ghost_Mode;
       end Do_Analyze;
 
       --  Local variables
index 82b59e92d7fa59d54e0794a478c3c1316735ca7e..86285ee018bdb2f97d9213bdaf8061efd78bcb62 100644 (file)
@@ -55,17 +55,10 @@ package body Sem_Ch11 is
    -----------------------------------
 
    procedure Analyze_Exception_Declaration (N : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-      Id : constant Entity_Id       := Defining_Identifier (N);
-      PF : constant Boolean         := Is_Pure (Current_Scope);
+      Id : constant Entity_Id := Defining_Identifier (N);
+      PF : constant Boolean   := Is_Pure (Current_Scope);
 
    begin
-      --  The exception declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       Generate_Definition         (Id);
       Enter_Name                  (Id);
       Set_Ekind                   (Id, E_Exception);
@@ -83,11 +76,6 @@ package body Sem_Ch11 is
       if Has_Aspects (N) then
          Analyze_Aspect_Specifications (N, Id);
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Exception_Declaration;
 
    --------------------------------
index 481762534bfe70dd383f317791f5fb0e647b872d..e848307fdb8687e11f3bf9003d46a3b8c4a4bbd2 100644 (file)
@@ -3135,7 +3135,6 @@ package body Sem_Ch12 is
    ------------------------------------------
 
    procedure Analyze_Generic_Package_Declaration (N : Node_Id) is
-      GM          : constant Ghost_Mode_Type := Ghost_Mode;
       Loc         : constant Source_Ptr := Sloc (N);
       Decls       : constant List_Id :=
                       Visible_Declarations (Specification (N));
@@ -3146,11 +3145,6 @@ package body Sem_Ch12 is
       Save_Parent : Node_Id;
 
    begin
-      --  The generic package declaration may be subject to pragma Ghost with
-      --  policy Ignore. Set the mode now to ensure that any nodes generated
-      --  during analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
       Check_SPARK_05_Restriction ("generic is not allowed", N);
 
       --  We introduce a renaming of the enclosing package, to have a usable
@@ -3302,11 +3296,6 @@ package body Sem_Ch12 is
             end if;
          end;
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Generic_Package_Declaration;
 
    --------------------------------------------
@@ -3314,7 +3303,6 @@ package body Sem_Ch12 is
    --------------------------------------------
 
    procedure Analyze_Generic_Subprogram_Declaration (N : Node_Id) is
-      GM          : constant Ghost_Mode_Type := Ghost_Mode;
       Formals     : List_Id;
       Id          : Entity_Id;
       New_N       : Node_Id;
@@ -3324,12 +3312,6 @@ package body Sem_Ch12 is
       Typ         : Entity_Id;
 
    begin
-      --  The generic subprogram declaration may be subject to pragma Ghost
-      --  with policy Ignore. Set the mode now to ensure that any nodes
-      --  generated during analysis and expansion are properly flagged as
-      --  ignored Ghost.
-
-      Set_Ghost_Mode (N);
       Check_SPARK_05_Restriction ("generic is not allowed", N);
 
       --  Create copy of generic unit, and save for instantiation. If the unit
@@ -3478,11 +3460,6 @@ package body Sem_Ch12 is
       Generate_Reference_To_Formals (Id);
 
       List_Inherited_Pre_Post_Aspects (Id);
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Generic_Subprogram_Declaration;
 
    -----------------------------------
index f532595075bda2d52a32a0a042f5773897ee785b..f05ad7fdb79c83f524a81ed04c7dfd23d032dbdf 100644 (file)
@@ -7763,12 +7763,13 @@ package body Sem_Ch13 is
    function Build_Invariant_Procedure_Declaration
      (Typ : Entity_Id) return Node_Id
    is
-      Loc    : constant Source_Ptr      := Sloc (Typ);
-      GM     : constant Ghost_Mode_Type := Ghost_Mode;
+      Loc    : constant Source_Ptr := Sloc (Typ);
       Decl   : Node_Id;
       Obj_Id : Entity_Id;
       SId    : Entity_Id;
 
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
    begin
       --  Check for duplicate definitions
 
@@ -7776,9 +7777,8 @@ package body Sem_Ch13 is
          return Empty;
       end if;
 
-      --  The related type may be subject to pragma Ghost with policy Ignore.
-      --  Set the mode now to ensure that the predicate functions are properly
-      --  flagged as ignored Ghost.
+      --  The related type may be subject to pragma Ghost. Set the mode now to
+      --  ensure that the predicate functions are properly marked as Ghost.
 
       Set_Ghost_Mode_From_Entity (Typ);
 
@@ -7810,10 +7810,7 @@ package body Sem_Ch13 is
                 Defining_Identifier => Obj_Id,
                 Parameter_Type      => New_Occurrence_Of (Typ, Loc)))));
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
 
       return Decl;
    end Build_Invariant_Procedure_Declaration;
@@ -8563,7 +8560,7 @@ package body Sem_Ch13 is
 
       --  Local variables
 
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    --  Start of processing for Build_Predicate_Functions
 
@@ -8576,9 +8573,8 @@ package body Sem_Ch13 is
          return;
       end if;
 
-      --  The related type may be subject to pragma Ghost with policy Ignore.
-      --  Set the mode now to ensure that the predicate functions are properly
-      --  flagged as ignored Ghost.
+      --  The related type may be subject to pragma Ghost. Set the mode now to
+      --  ensure that the predicate functions are properly marked as Ghost.
 
       Set_Ghost_Mode_From_Entity (Typ);
 
@@ -8927,10 +8923,7 @@ package body Sem_Ch13 is
          end;
       end if;
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Build_Predicate_Functions;
 
    -----------------------------------------
index 62cc79105a148f546ab37a3e8f97ff00a4dbcbc3..9fec59564bfa51b7cdfe0ff20b4488adf9a96f8e 100644 (file)
@@ -2556,9 +2556,8 @@ package body Sem_Ch3 is
    -----------------------------------
 
    procedure Analyze_Full_Type_Declaration (N : Node_Id) is
-      Def    : constant Node_Id         := Type_Definition (N);
-      Def_Id : constant Entity_Id       := Defining_Identifier (N);
-      GM     : constant Ghost_Mode_Type := Ghost_Mode;
+      Def    : constant Node_Id   := Type_Definition (N);
+      Def_Id : constant Entity_Id := Defining_Identifier (N);
       T      : Entity_Id;
       Prev   : Entity_Id;
 
@@ -2576,9 +2575,6 @@ package body Sem_Ch3 is
       --  list later in Sem_Disp.Check_Operation_From_Incomplete_Type (which
       --  is called from Process_Incomplete_Dependents).
 
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
       ------------------------------------
       -- Check_Ops_From_Incomplete_Type --
       ------------------------------------
@@ -2616,26 +2612,11 @@ package body Sem_Ch3 is
          end if;
       end Check_Ops_From_Incomplete_Type;
 
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
    --  Start of processing for Analyze_Full_Type_Declaration
 
    begin
       Prev := Find_Type_Name (N);
 
-      --  The type declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N, Prev);
-
       --  The full view, if present, now points to the current type. If there
       --  is an incomplete partial view, set a link to it, to simplify the
       --  retrieval of primitive operations of the type.
@@ -2773,7 +2754,6 @@ package body Sem_Ch3 is
       end if;
 
       if Etype (T) = Any_Type then
-         Restore_Globals;
          return;
       end if;
 
@@ -2914,8 +2894,6 @@ package body Sem_Ch3 is
             Analyze_Aspect_Specifications (N, Def_Id);
          end if;
       end if;
-
-      Restore_Globals;
    end Analyze_Full_Type_Declaration;
 
    ----------------------------------
@@ -2923,18 +2901,12 @@ package body Sem_Ch3 is
    ----------------------------------
 
    procedure Analyze_Incomplete_Type_Decl (N : Node_Id) is
-      F  : constant Boolean         := Is_Pure (Current_Scope);
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-      T  : Entity_Id;
+      F : constant Boolean := Is_Pure (Current_Scope);
+      T : Entity_Id;
 
    begin
       Check_SPARK_05_Restriction ("incomplete type is not allowed", N);
 
-      --  The incomplete type declaration may be subject to pragma Ghost with
-      --  policy Ignore. Set the mode now to ensure that any nodes generated
-      --  during analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
       Generate_Definition (Defining_Identifier (N));
 
       --  Process an incomplete declaration. The identifier must not have been
@@ -2984,11 +2956,6 @@ package body Sem_Ch3 is
 
       Set_Private_Dependents (T, New_Elmt_List);
       Set_Is_Pure            (T, F);
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Incomplete_Type_Decl;
 
    -----------------------------------
@@ -3063,37 +3030,13 @@ package body Sem_Ch3 is
    --------------------------------
 
    procedure Analyze_Number_Declaration (N : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
-      --  Local variables
-
       E     : constant Node_Id   := Expression (N);
       Id    : constant Entity_Id := Defining_Identifier (N);
       Index : Interp_Index;
       It    : Interp;
       T     : Entity_Id;
 
-   --  Start of processing for Analyze_Number_Declaration
-
    begin
-      --  The number declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       Generate_Definition (Id);
       Enter_Name (Id);
 
@@ -3113,8 +3056,6 @@ package body Sem_Ch3 is
          Set_Etype     (Id, Universal_Integer);
          Set_Ekind     (Id, E_Named_Integer);
          Set_Is_Frozen (Id, True);
-
-         Restore_Globals;
          return;
       end if;
 
@@ -3216,8 +3157,6 @@ package body Sem_Ch3 is
          Set_Ekind               (Id, E_Constant);
          Set_Never_Set_In_Source (Id, True);
          Set_Is_True_Constant    (Id, True);
-
-         Restore_Globals;
          return;
       end if;
 
@@ -3231,8 +3170,6 @@ package body Sem_Ch3 is
          Rewrite (E, Make_Integer_Literal (Sloc (N), 1));
          Set_Etype (E, Any_Type);
       end if;
-
-      Restore_Globals;
    end Analyze_Number_Declaration;
 
    -----------------------------
@@ -3406,9 +3343,8 @@ package body Sem_Ch3 is
    --------------------------------
 
    procedure Analyze_Object_Declaration (N : Node_Id) is
-      Loc   : constant Source_Ptr      := Sloc (N);
-      GM    : constant Ghost_Mode_Type := Ghost_Mode;
-      Id    : constant Entity_Id       := Defining_Identifier (N);
+      Loc   : constant Source_Ptr := Sloc (N);
+      Id    : constant Entity_Id  := Defining_Identifier (N);
       Act_T : Entity_Id;
       T     : Entity_Id;
 
@@ -3437,9 +3373,6 @@ package body Sem_Ch3 is
 
       --  Any other relevant delayed aspects on object declarations ???
 
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
       -----------------
       -- Count_Tasks --
       -----------------
@@ -3518,14 +3451,9 @@ package body Sem_Ch3 is
          return False;
       end Delayed_Aspect_Present;
 
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
+      --  Local variables
 
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    --  Start of processing for Analyze_Object_Declaration
 
@@ -3580,9 +3508,10 @@ package body Sem_Ch3 is
          end if;
       end if;
 
-      --  The object declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  analysis and expansion are properly flagged as ignored Ghost.
+      --  The object declaration is Ghost when it is subject to pragma Ghost or
+      --  completes a deferred Ghost constant. Set the mode now to ensure that
+      --  any nodes generated during analysis and expansion are properly marked
+      --  as Ghost.
 
       Set_Ghost_Mode (N, Prev_Entity);
 
@@ -3866,7 +3795,7 @@ package body Sem_Ch3 is
            and then Analyzed (N)
            and then No (Expression (N))
          then
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return;
          end if;
 
@@ -4139,7 +4068,7 @@ package body Sem_Ch3 is
                Freeze_Before (N, T);
                Set_Is_Frozen (Id);
 
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return;
 
             else
@@ -4522,7 +4451,7 @@ package body Sem_Ch3 is
          Check_No_Hidden_State (Id);
       end if;
 
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
    end Analyze_Object_Declaration;
 
    ---------------------------
@@ -4543,19 +4472,12 @@ package body Sem_Ch3 is
    -------------------------------------------
 
    procedure Analyze_Private_Extension_Declaration (N : Node_Id) is
-      GM          : constant Ghost_Mode_Type := Ghost_Mode;
-      Indic       : constant Node_Id         := Subtype_Indication (N);
-      T           : constant Entity_Id       := Defining_Identifier (N);
+      Indic       : constant Node_Id   := Subtype_Indication (N);
+      T           : constant Entity_Id := Defining_Identifier (N);
       Parent_Base : Entity_Id;
       Parent_Type : Entity_Id;
 
    begin
-      --  The private extension declaration may be subject to pragma Ghost with
-      --  policy Ignore. Set the mode now to ensure that any nodes generated
-      --  during analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       --  Ada 2005 (AI-251): Decorate all names in list of ancestor interfaces
 
       if Is_Non_Empty_List (Interface_List (N)) then
@@ -4769,11 +4691,6 @@ package body Sem_Ch3 is
       if Has_Aspects (N) then
          Analyze_Aspect_Specifications (N, T);
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Private_Extension_Declaration;
 
    ---------------------------------
@@ -4784,18 +4701,11 @@ package body Sem_Ch3 is
      (N    : Node_Id;
       Skip : Boolean := False)
    is
-      GM       : constant Ghost_Mode_Type := Ghost_Mode;
       Id       : constant Entity_Id := Defining_Identifier (N);
       R_Checks : Check_Result;
       T        : Entity_Id;
 
    begin
-      --  The subtype declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       Generate_Definition (Id);
       Set_Is_Pure (Id, Is_Pure (Current_Scope));
       Init_Size_Align (Id);
@@ -5393,11 +5303,6 @@ package body Sem_Ch3 is
       end if;
 
       Analyze_Dimension (N);
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Subtype_Declaration;
 
    --------------------------------
index 2b2e918da3659c99ac8caa279fbfe46b41716eba..aaa1fcd1453d2581ffe51a27e646a7bd3ac2118f 100644 (file)
@@ -90,9 +90,8 @@ package body Sem_Ch5 is
    ------------------------
 
    procedure Analyze_Assignment (N : Node_Id) is
-      GM   : constant Ghost_Mode_Type := Ghost_Mode;
-      Lhs  : constant Node_Id         := Name (N);
-      Rhs  : constant Node_Id         := Expression (N);
+      Lhs  : constant Node_Id := Name (N);
+      Rhs  : constant Node_Id := Expression (N);
       T1   : Entity_Id;
       T2   : Entity_Id;
       Decl : Node_Id;
@@ -107,9 +106,6 @@ package body Sem_Ch5 is
       --  the assignment, and at the end of processing before setting any new
       --  current values in place.
 
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
       procedure Set_Assignment_Type
         (Opnd      : Node_Id;
          Opnd_Type : in out Entity_Id);
@@ -215,15 +211,6 @@ package body Sem_Ch5 is
          end if;
       end Kill_Lhs;
 
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
       -------------------------
       -- Set_Assignment_Type --
       -------------------------
@@ -282,6 +269,10 @@ package body Sem_Ch5 is
          end if;
       end Set_Assignment_Type;
 
+      --  Local variables
+
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
    --  Start of processing for Analyze_Assignment
 
    begin
@@ -293,10 +284,9 @@ package body Sem_Ch5 is
 
       Analyze (Lhs);
 
-      --  The left hand side of an assignment may reference an entity subject
-      --  to pragma Ghost with policy Ignore. Set the mode now to ensure that
-      --  any nodes generated during analysis and expansion are properly
-      --  flagged as ignored Ghost.
+      --  An assignment statement is Ghost when the left hand side denotes a
+      --  Ghost entity. Set the mode now to ensure that any nodes generated
+      --  during analysis and expansion are properly marked as Ghost.
 
       Set_Ghost_Mode (N);
       Analyze (Rhs);
@@ -391,7 +381,7 @@ package body Sem_Ch5 is
             Error_Msg_N
               ("no valid types for left-hand side for assignment", Lhs);
             Kill_Lhs;
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return;
          end if;
       end if;
@@ -467,14 +457,14 @@ package body Sem_Ch5 is
                                   "specified??", Lhs);
                   end if;
 
-                  Restore_Globals;
+                  Ghost_Mode := Save_Ghost_Mode;
                   return;
                end if;
             end if;
          end;
 
          Diagnose_Non_Variable_Lhs (Lhs);
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
 
       --  Error of assigning to limited type. We do however allow this in
@@ -495,7 +485,7 @@ package body Sem_Ch5 is
             Explain_Limited_Type (T1, Lhs);
          end if;
 
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
 
       --  Enforce RM 3.9.3 (8): the target of an assignment operation cannot be
@@ -534,7 +524,7 @@ package body Sem_Ch5 is
       then
          Error_Msg_N ("invalid use of incomplete type", Lhs);
          Kill_Lhs;
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
       end if;
 
@@ -552,7 +542,7 @@ package body Sem_Ch5 is
 
       if Rhs = Error then
          Kill_Lhs;
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
       end if;
 
@@ -561,7 +551,7 @@ package body Sem_Ch5 is
       if not Covers (T1, T2) then
          Wrong_Type (Rhs, Etype (Lhs));
          Kill_Lhs;
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
       end if;
 
@@ -589,7 +579,7 @@ package body Sem_Ch5 is
 
       if T1 = Any_Type or else T2 = Any_Type then
          Kill_Lhs;
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
       end if;
 
@@ -682,7 +672,7 @@ package body Sem_Ch5 is
             --  to reset Is_True_Constant, and desirable for xref purposes.
 
             Note_Possible_Modification (Lhs, Sure => True);
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return;
 
          --  If we know the right hand side is non-null, then we convert to the
@@ -889,7 +879,7 @@ package body Sem_Ch5 is
       end;
 
       Analyze_Dimension (N);
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
    end Analyze_Assignment;
 
    -----------------------------
index 4f6038e2d30dc94139c121fe270114eb122948ad..4ae437ec76d316a32e22f61e46ccae17cf4fa299 100644 (file)
@@ -209,18 +209,11 @@ package body Sem_Ch6 is
    ---------------------------------------------
 
    procedure Analyze_Abstract_Subprogram_Declaration (N : Node_Id) is
-      GM      : constant Ghost_Mode_Type := Ghost_Mode;
-      Scop    : constant Entity_Id       := Current_Scope;
-      Subp_Id : constant Entity_Id       :=
+      Scop    : constant Entity_Id := Current_Scope;
+      Subp_Id : constant Entity_Id :=
                   Analyze_Subprogram_Specification (Specification (N));
 
    begin
-      --  The abstract subprogram declaration may be subject to pragma Ghost
-      --  with policy Ignore. Set the mode now to ensure that any nodes
-      --  generated during analysis and expansion are properly flagged as
-      --  ignored Ghost.
-
-      Set_Ghost_Mode (N);
       Check_SPARK_05_Restriction ("abstract subprogram is not allowed", N);
 
       Generate_Definition (Subp_Id);
@@ -261,11 +254,6 @@ package body Sem_Ch6 is
       if Has_Aspects (N) then
          Analyze_Aspect_Specifications (N, Subp_Id);
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Abstract_Subprogram_Declaration;
 
    ---------------------------------
@@ -1547,15 +1535,10 @@ package body Sem_Ch6 is
    ----------------------------
 
    procedure Analyze_Procedure_Call (N : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-
       procedure Analyze_Call_And_Resolve;
       --  Do Analyze and Resolve calls for procedure call
       --  At end, check illegal order dependence.
 
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
       ------------------------------
       -- Analyze_Call_And_Resolve --
       ------------------------------
@@ -1570,15 +1553,6 @@ package body Sem_Ch6 is
          end if;
       end Analyze_Call_And_Resolve;
 
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
       --  Local variables
 
       Actuals : constant List_Id    := Parameter_Associations (N);
@@ -1587,6 +1561,8 @@ package body Sem_Ch6 is
       Actual  : Node_Id;
       New_N   : Node_Id;
 
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
    --  Start of processing for Analyze_Procedure_Call
 
    begin
@@ -1618,10 +1594,9 @@ package body Sem_Ch6 is
          return;
       end if;
 
-      --  The name of the procedure call may reference an entity subject to
-      --  pragma Ghost with policy Ignore. Set the mode now to ensure that any
-      --  nodes generated during analysis and expansion are properly flagged as
-      --  ignored Ghost.
+      --  A procedure call is Ghost when its name denotes a Ghost procedure.
+      --  Set the mode now to ensure that any nodes generated during analysis
+      --  and expansion are properly marked as Ghost.
 
       Set_Ghost_Mode (N);
 
@@ -1657,7 +1632,7 @@ package body Sem_Ch6 is
         and then Is_Record_Type (Etype (Entity (P)))
         and then Remote_AST_I_Dereference (P)
       then
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
 
       elsif Is_Entity_Name (P)
@@ -1794,7 +1769,7 @@ package body Sem_Ch6 is
          Error_Msg_N ("invalid procedure or entry call", N);
       end if;
 
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
    end Analyze_Procedure_Call;
 
    ------------------------------
@@ -2275,7 +2250,6 @@ package body Sem_Ch6 is
    --  the subprogram, or to perform conformance checks.
 
    procedure Analyze_Subprogram_Body_Helper (N : Node_Id) is
-      GM           : constant Ghost_Mode_Type := Ghost_Mode;
       Loc          : constant Source_Ptr := Sloc (N);
       Body_Spec    : Node_Id             := Specification (N);
       Body_Id      : Entity_Id           := Defining_Entity (Body_Spec);
@@ -2351,9 +2325,6 @@ package body Sem_Ch6 is
       --  Determine whether subprogram Subp_Id is a primitive of a concurrent
       --  type that implements an interface and has a private view.
 
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
       procedure Set_Trivial_Subprogram (N : Node_Id);
       --  Sets the Is_Trivial_Subprogram flag in both spec and body of the
       --  subprogram whose body is being analyzed. N is the statement node
@@ -2930,15 +2901,6 @@ package body Sem_Ch6 is
          return False;
       end Is_Private_Concurrent_Primitive;
 
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
       ----------------------------
       -- Set_Trivial_Subprogram --
       ----------------------------
@@ -3046,6 +3008,10 @@ package body Sem_Ch6 is
          end if;
       end Verify_Overriding_Indicator;
 
+      --  Local variables
+
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
    --  Start of processing for Analyze_Subprogram_Body_Helper
 
    begin
@@ -3065,10 +3031,10 @@ package body Sem_Ch6 is
          if Is_Generic_Subprogram (Prev_Id) then
             Spec_Id := Prev_Id;
 
-            --  The corresponding spec may be subject to pragma Ghost with
-            --  policy Ignore. Set the mode now to ensure that any nodes
-            --  generated during analysis and expansion are properly flagged
-            --  as ignored Ghost.
+            --  A subprogram body is Ghost when it is stand alone and subject
+            --  to pragma Ghost or when the corresponding spec is Ghost. Set
+            --  the mode now to ensure that any nodes generated during analysis
+            --  and expansion are properly marked as Ghost.
 
             Set_Ghost_Mode          (N, Spec_Id);
             Set_Is_Compilation_Unit (Body_Id, Is_Compilation_Unit (Spec_Id));
@@ -3081,7 +3047,7 @@ package body Sem_Ch6 is
                Check_Missing_Return;
             end if;
 
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return;
 
          else
@@ -3089,7 +3055,7 @@ package body Sem_Ch6 is
             --  enter name will post error.
 
             Enter_Name (Body_Id);
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return;
          end if;
 
@@ -3100,7 +3066,7 @@ package body Sem_Ch6 is
       --  analysis.
 
       elsif Prev_Id = Body_Id and then Has_Completion (Body_Id) then
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
 
       else
@@ -3112,20 +3078,20 @@ package body Sem_Ch6 is
             if Is_Private_Concurrent_Primitive (Body_Id) then
                Spec_Id := Disambiguate_Spec;
 
-               --  The corresponding spec may be subject to pragma Ghost with
-               --  policy Ignore. Set the mode now to ensure that any nodes
-               --  generated during analysis and expansion are properly flagged
-               --  as ignored Ghost.
+               --  A subprogram body is Ghost when it is stand alone and
+               --  subject to pragma Ghost or when the corresponding spec is
+               --  Ghost. Set the mode now to ensure that any nodes generated
+               --  during analysis and expansion are properly marked as Ghost.
 
                Set_Ghost_Mode (N, Spec_Id);
 
             else
                Spec_Id := Find_Corresponding_Spec (N);
 
-               --  The corresponding spec may be subject to pragma Ghost with
-               --  policy Ignore. Set the mode now to ensure that any nodes
-               --  generated during analysis and expansion are properly flagged
-               --  as ignored Ghost.
+               --  A subprogram body is Ghost when it is stand alone and
+               --  subject to pragma Ghost or when the corresponding spec is
+               --  Ghost. Set the mode now to ensure that any nodes generated
+               --  during analysis and expansion are properly marked as Ghost.
 
                Set_Ghost_Mode (N, Spec_Id);
 
@@ -3179,7 +3145,7 @@ package body Sem_Ch6 is
             --  If this is a duplicate body, no point in analyzing it
 
             if Error_Posted (N) then
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return;
             end if;
 
@@ -3212,10 +3178,10 @@ package body Sem_Ch6 is
          else
             Spec_Id := Corresponding_Spec (N);
 
-            --  The corresponding spec may be subject to pragma Ghost with
-            --  policy Ignore. Set the mode now to ensure that any nodes
-            --  generated during analysis and expansion are properly flagged
-            --  as ignored Ghost.
+            --  A subprogram body is Ghost when it is stand alone and subject
+            --  to pragma Ghost or when the corresponding spec is Ghost. Set
+            --  the mode now to ensure that any nodes generated during analysis
+            --  and expansion are properly marked as Ghost.
 
             Set_Ghost_Mode (N, Spec_Id);
          end if;
@@ -3292,7 +3258,7 @@ package body Sem_Ch6 is
 
          if Is_Abstract_Subprogram (Spec_Id) then
             Error_Msg_N ("an abstract subprogram cannot have a body", N);
-            Restore_Globals;
+            Ghost_Mode := Save_Ghost_Mode;
             return;
 
          else
@@ -3362,7 +3328,7 @@ package body Sem_Ch6 is
             if not Conformant
               and then not Mode_Conformant (Body_Id, Spec_Id)
             then
-               Restore_Globals;
+               Ghost_Mode := Save_Ghost_Mode;
                return;
             end if;
          end if;
@@ -3569,7 +3535,7 @@ package body Sem_Ch6 is
             Analyze_Aspect_Specifications_On_Body_Or_Stub (N);
          end if;
 
-         Restore_Globals;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
       end if;
 
@@ -4034,7 +4000,7 @@ package body Sem_Ch6 is
          end if;
       end;
 
-      Restore_Globals;
+      Ghost_Mode := Save_Ghost_Mode;
    end Analyze_Subprogram_Body_Helper;
 
    ---------------------------------
@@ -4139,37 +4105,13 @@ package body Sem_Ch6 is
    ------------------------------------
 
    procedure Analyze_Subprogram_Declaration (N : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
-      --  Local variables
-
       Scop       : constant Entity_Id := Current_Scope;
       Designator : Entity_Id;
 
       Is_Completion : Boolean;
       --  Indicates whether a null procedure declaration is a completion
 
-   --  Start of processing for Analyze_Subprogram_Declaration
-
    begin
-      --  The subprogram declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       --  Null procedures are not allowed in SPARK
 
       if Nkind (Specification (N)) = N_Procedure_Specification
@@ -4191,7 +4133,6 @@ package body Sem_Ch6 is
          --  The null procedure acts as a body, nothing further is needed
 
          if Is_Completion then
-            Restore_Globals;
             return;
          end if;
       end if;
@@ -4372,8 +4313,6 @@ package body Sem_Ch6 is
       if Has_Aspects (N) then
          Analyze_Aspect_Specifications (N, Designator);
       end if;
-
-      Restore_Globals;
    end Analyze_Subprogram_Declaration;
 
    --------------------------------------
index f39da2c0066b2a2808cdfa9709245919ed7fe7eb..00efbe0ea68b8c2e311ce499cb504ad3c7a12467 100644 (file)
@@ -571,7 +571,7 @@ package body Sem_Ch7 is
 
       --  Local variables
 
-      GM               : constant Ghost_Mode_Type := Ghost_Mode;
+      Save_Ghost_Mode  : constant Ghost_Mode_Type := Ghost_Mode;
       Body_Id          : Entity_Id;
       HSS              : Node_Id;
       Last_Spec_Entity : Entity_Id;
@@ -637,10 +637,9 @@ package body Sem_Ch7 is
          end if;
       end if;
 
-      --  The corresponding spec of the package body may be subject to pragma
-      --  Ghost with policy Ignore. Set the mode now to ensure that any nodes
-      --  generated during analysis and expansion are properly flagged as
-      --  ignored Ghost.
+      --  A package body is Ghost when the corresponding spec is Ghost. Set
+      --  the mode now to ensure that any nodes generated during analysis and
+      --  expansion are properly flagged as ignored Ghost.
 
       Set_Ghost_Mode (N, Spec_Id);
 
@@ -942,10 +941,7 @@ package body Sem_Ch7 is
          end if;
       end if;
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Analyze_Package_Body_Helper;
 
    ------------------------------
@@ -1021,22 +1017,6 @@ package body Sem_Ch7 is
    ---------------------------------
 
    procedure Analyze_Package_Declaration (N : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
-      --  Local variables
-
       Id : constant Node_Id := Defining_Entity (N);
 
       Body_Required : Boolean;
@@ -1048,8 +1028,6 @@ package body Sem_Ch7 is
       PF : Boolean;
       --  True when in the context of a declared pure library unit
 
-   --  Start of processing for Analyze_Package_Declaration
-
    begin
       if Debug_Flag_C then
          Write_Str ("==> package spec ");
@@ -1060,12 +1038,6 @@ package body Sem_Ch7 is
          Indent;
       end if;
 
-      --  The package declaration may be subject to pragma Ghost with policy
-      --  Ignore. Set the mode now to ensure that any nodes generated during
-      --  analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       Generate_Definition (Id);
       Enter_Name (Id);
       Set_Ekind  (Id, E_Package);
@@ -1102,7 +1074,6 @@ package body Sem_Ch7 is
       --     package Pkg is ...
 
       if From_Limited_With (Id) then
-         Restore_Globals;
          return;
       end if;
 
@@ -1163,8 +1134,6 @@ package body Sem_Ch7 is
          Write_Location (Sloc (N));
          Write_Eol;
       end if;
-
-      Restore_Globals;
    end Analyze_Package_Declaration;
 
    -----------------------------------
@@ -1851,17 +1820,10 @@ package body Sem_Ch7 is
    --------------------------------------
 
    procedure Analyze_Private_Type_Declaration (N : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
       Id : constant Entity_Id := Defining_Identifier (N);
       PF : constant Boolean   := Is_Pure (Enclosing_Lib_Unit_Entity);
 
    begin
-      --  The private type declaration may be subject to pragma Ghost with
-      --  policy Ignore. Set the mode now to ensure that any nodes generated
-      --  during analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       Generate_Definition (Id);
       Set_Is_Pure         (Id, PF);
       Init_Size_Align     (Id);
@@ -1885,11 +1847,6 @@ package body Sem_Ch7 is
       if Has_Aspects (N) then
          Analyze_Aspect_Specifications (N, Id);
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Private_Type_Declaration;
 
    ----------------------------------
index ee76eda0fced58a065fa4eed31f3df44f5382123..a12649e0cf165a85af5da649de0781a050c24c5d 100644 (file)
@@ -550,17 +550,10 @@ package body Sem_Ch8 is
    --  there is more than one element in the list.
 
    procedure Analyze_Exception_Renaming (N : Node_Id) is
-      GM  : constant Ghost_Mode_Type := Ghost_Mode;
-      Id  : constant Entity_Id       := Defining_Entity (N);
-      Nam : constant Node_Id         := Name (N);
+      Id  : constant Entity_Id := Defining_Entity (N);
+      Nam : constant Node_Id   := Name (N);
 
    begin
-      --  The exception renaming declaration may be subject to pragma Ghost
-      --  with policy Ignore. Set the mode now to ensure that any nodes
-      --  generated during analysis and expansion are properly flagged as
-      --  ignored Ghost.
-
-      Set_Ghost_Mode (N);
       Check_SPARK_05_Restriction ("exception renaming is not allowed", N);
 
       Enter_Name (Id);
@@ -595,11 +588,6 @@ package body Sem_Ch8 is
       if Has_Aspects (N) then
          Analyze_Aspect_Specifications (N, Id);
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Exception_Renaming;
 
    ---------------------------
@@ -669,8 +657,7 @@ package body Sem_Ch8 is
      (N : Node_Id;
       K : Entity_Kind)
    is
-      GM    : constant Ghost_Mode_Type := Ghost_Mode;
-      New_P : constant Entity_Id       := Defining_Entity (N);
+      New_P : constant Entity_Id := Defining_Entity (N);
       Old_P : Entity_Id;
 
       Inst  : Boolean := False;
@@ -681,11 +668,6 @@ package body Sem_Ch8 is
          return;
       end if;
 
-      --  The generic renaming declaration may be subject to pragma Ghost with
-      --  policy Ignore. Set the mode now to ensure that any nodes generated
-      --  during analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
       Check_SPARK_05_Restriction ("generic renaming is not allowed", N);
 
       Generate_Definition (New_P);
@@ -756,11 +738,6 @@ package body Sem_Ch8 is
       if Has_Aspects (N) then
          Analyze_Aspect_Specifications (N, New_P);
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Generic_Renaming;
 
    -----------------------------
@@ -867,10 +844,6 @@ package body Sem_Ch8 is
          return False;
       end In_Generic_Scope;
 
-      --  Local variables
-
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-
    --  Start of processing for Analyze_Object_Renaming
 
    begin
@@ -878,11 +851,6 @@ package body Sem_Ch8 is
          return;
       end if;
 
-      --  The object renaming declaration may be subject to pragma Ghost with
-      --  policy Ignore. Set the mode now to ensure that any nodes generated
-      --  during analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
       Check_SPARK_05_Restriction ("object renaming is not allowed", N);
 
       Set_Is_Pure (Id, Is_Pure (Current_Scope));
@@ -1394,11 +1362,6 @@ package body Sem_Ch8 is
       --  Deal with dimensions
 
       Analyze_Dimension (N);
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Object_Renaming;
 
    ------------------------------
@@ -1406,39 +1369,15 @@ package body Sem_Ch8 is
    ------------------------------
 
    procedure Analyze_Package_Renaming (N : Node_Id) is
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-
-      procedure Restore_Globals;
-      --  Restore the values of all saved global variables
-
-      ---------------------
-      -- Restore_Globals --
-      ---------------------
-
-      procedure Restore_Globals is
-      begin
-         Ghost_Mode := GM;
-      end Restore_Globals;
-
-      --  Local variables
-
       New_P : constant Entity_Id := Defining_Entity (N);
       Old_P : Entity_Id;
       Spec  : Node_Id;
 
-   --  Start of processing for Analyze_Package_Renaming
-
    begin
       if Name (N) = Error then
          return;
       end if;
 
-      --  The package renaming declaration may be subject to pragma Ghost with
-      --  policy Ignore. Set the mode now to ensure that any nodes generated
-      --  during analysis and expansion are properly flagged as ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       --  Check for Text_IO special unit (we may be renaming a Text_IO child)
 
       Check_Text_IO_Special_Unit (Name (N));
@@ -1538,7 +1477,6 @@ package body Sem_Ch8 is
          --  subtypes again, so they are compatible with types in their class.
 
          if not Is_Generic_Instance (Old_P) then
-            Restore_Globals;
             return;
          else
             Spec := Specification (Unit_Declaration_Node (Old_P));
@@ -1580,8 +1518,6 @@ package body Sem_Ch8 is
       if Has_Aspects (N) then
          Analyze_Aspect_Specifications (N, New_P);
       end if;
-
-      Restore_Globals;
    end Analyze_Package_Renaming;
 
    -------------------------------
@@ -2628,20 +2564,12 @@ package body Sem_Ch8 is
       --  defaulted formal subprogram when the actual for a related formal
       --  type is class-wide.
 
-      GM        : constant Ghost_Mode_Type := Ghost_Mode;
-      Inst_Node : Node_Id                  := Empty;
+      Inst_Node : Node_Id := Empty;
       New_S     : Entity_Id;
 
    --  Start of processing for Analyze_Subprogram_Renaming
 
    begin
-      --  The subprogram renaming declaration may be subject to pragma Ghost
-      --  with policy Ignore. Set the mode now to ensure that any nodes
-      --  generated during analysis and expansion are properly flagged as
-      --  ignored Ghost.
-
-      Set_Ghost_Mode (N);
-
       --  We must test for the attribute renaming case before the Analyze
       --  call because otherwise Sem_Attr will complain that the attribute
       --  is missing an argument when it is analyzed.
@@ -3559,11 +3487,6 @@ package body Sem_Ch8 is
             Analyze (N);
          end if;
       end if;
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
    end Analyze_Subprogram_Renaming;
 
    -------------------------
index c3f7618bb9b9ec530b0c659ab20d24675af1f2c3..04a160b9f1a7178e69dc170c61624f62a2a0821a 100644 (file)
@@ -390,12 +390,12 @@ package body Sem_Prag is
 
       --  Local variables
 
-      GM : constant Ghost_Mode_Type := Ghost_Mode;
-
       Subp_Decl : constant Node_Id   := Find_Related_Subprogram_Or_Body (N);
       Spec_Id   : constant Entity_Id := Corresponding_Spec_Of (Subp_Decl);
       CCases    : constant Node_Id   := Expression (Get_Argument (N, Spec_Id));
 
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
       CCase         : Node_Id;
       Restore_Scope : Boolean := False;
 
@@ -454,10 +454,7 @@ package body Sem_Prag is
          Error_Msg_N ("wrong syntax for constract cases", N);
       end if;
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Analyze_Contract_Cases_In_Decl_Part;
 
    ----------------------------------
@@ -1715,10 +1712,11 @@ package body Sem_Prag is
      (N        : Node_Id;
       Expr_Val : out Boolean)
    is
-      GM     : constant Ghost_Mode_Type := Ghost_Mode;
       Arg1   : constant Node_Id   := First (Pragma_Argument_Associations (N));
-      Obj_Id : constant Entity_Id := Entity (Get_Pragma_Arg (Arg1));
       Expr   : constant Node_Id   := Get_Pragma_Arg (Next (Arg1));
+      Obj_Id : constant Entity_Id := Entity (Get_Pragma_Arg (Arg1));
+
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
 
    begin
       --  Set the Ghost mode in effect from the pragma. Due to the delayed
@@ -1758,10 +1756,7 @@ package body Sem_Prag is
          end if;
       end if;
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Analyze_External_Property_In_Decl_Part;
 
    ---------------------------------
@@ -2264,11 +2259,12 @@ package body Sem_Prag is
    --------------------------------------------
 
    procedure Analyze_Initial_Condition_In_Decl_Part (N : Node_Id) is
-      GM        : constant Ghost_Mode_Type := Ghost_Mode;
       Pack_Decl : constant Node_Id   := Find_Related_Package_Or_Body (N);
       Pack_Id   : constant Entity_Id := Defining_Entity (Pack_Decl);
       Expr      : constant Node_Id   := Expression (Get_Argument (N, Pack_Id));
 
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
    begin
       --  Set the Ghost mode in effect from the pragma. Due to the delayed
       --  analysis of the pragma, the Ghost mode at point of declaration and
@@ -2283,11 +2279,7 @@ package body Sem_Prag is
       --  is not desired at this point.
 
       Preanalyze_Assert_Expression (Expr, Standard_Boolean);
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Analyze_Initial_Condition_In_Decl_Part;
 
    --------------------------------------
@@ -10808,18 +10800,12 @@ package body Sem_Prag is
 
             --  Local variables
 
-            GM       : constant Ghost_Mode_Type := Ghost_Mode;
             Expr     : Node_Id;
             New_Args : List_Id;
 
          --  Start of processing for Assert
 
          begin
-            --  Ensure that analysis and expansion produce Ghost nodes if the
-            --  pragma itself is Ghost.
-
-            Set_Ghost_Mode (N);
-
             --  Assert is an Ada 2005 RM-defined pragma
 
             if Prag_Id = Pragma_Assert then
@@ -10892,11 +10878,6 @@ package body Sem_Prag is
                 Pragma_Argument_Associations => New_Args));
 
             Analyze (N);
-
-            --  Restore the original Ghost mode once analysis and expansion
-            --  have taken place.
-
-            Ghost_Mode := GM;
          end Assert;
 
          ----------------------
@@ -11551,15 +11532,17 @@ package body Sem_Prag is
          --  allowed, since they have special meaning for Check_Policy.
 
          when Pragma_Check => Check : declare
-            GM    : constant Ghost_Mode_Type := Ghost_Mode;
             Cname : Name_Id;
             Eloc  : Source_Ptr;
             Expr  : Node_Id;
             Str   : Node_Id;
 
+            Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
          begin
-            --  Ensure that analysis and expansion produce Ghost nodes if the
-            --  pragma itself is Ghost.
+            --  Pragma Check is Ghost when it applies to a Ghost entity. Set
+            --  the mode now to ensure that any nodes generated during analysis
+            --  and expansion are marked as Ghost.
 
             Set_Ghost_Mode (N);
 
@@ -11758,10 +11741,7 @@ package body Sem_Prag is
                In_Assertion_Expr := In_Assertion_Expr - 1;
             end if;
 
-            --  Restore the original Ghost mode once analysis and expansion
-            --  have taken place.
-
-            Ghost_Mode := GM;
+            Ghost_Mode := Save_Ghost_Mode;
          end Check;
 
          --------------------------
@@ -15699,7 +15679,6 @@ package body Sem_Prag is
          --     [,[Message =>] String_Expression]);
 
          when Pragma_Invariant => Invariant : declare
-            GM      : constant Ghost_Mode_Type := Ghost_Mode;
             Discard : Boolean;
             Typ     : Entity_Id;
             Type_Id : Node_Id;
@@ -15793,11 +15772,6 @@ package body Sem_Prag is
             if Class_Present (N) then
                Set_Has_Inheritable_Invariants (Typ);
             end if;
-
-            --  Restore the original Ghost mode once analysis and expansion
-            --  have taken place.
-
-            Ghost_Mode := GM;
          end Invariant;
 
          ----------------------
@@ -22450,11 +22424,12 @@ package body Sem_Prag is
 
       --  Local variables
 
-      GM        : constant Ghost_Mode_Type := Ghost_Mode;
       Subp_Decl : constant Node_Id   := Find_Related_Subprogram_Or_Body (N);
       Spec_Id   : constant Entity_Id := Corresponding_Spec_Of (Subp_Decl);
       Expr      : constant Node_Id   := Expression (Get_Argument (N, Spec_Id));
 
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
       Restore_Scope : Boolean := False;
 
    --  Start of processing for Analyze_Pre_Post_Condition_In_Decl_Part
@@ -22500,11 +22475,7 @@ package body Sem_Prag is
       --  subprogram subject to pragma Inline_Always.
 
       Check_Postcondition_Use_In_Inlined_Subprogram (N, Spec_Id);
-
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Analyze_Pre_Post_Condition_In_Decl_Part;
 
    ------------------------------------------
index 9492fff6b0d354cca3f1d9a741cbb46156111783..01b912f459d8ccabf2e6dc1ed2523b73361137ed 100644 (file)
@@ -1990,6 +1990,10 @@ package body Sem_Res is
          return;
       end Resolution_Failed;
 
+      --  Local variables
+
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
    --  Start of processing for Resolve
 
    begin
@@ -1997,6 +2001,14 @@ package body Sem_Res is
          return;
       end if;
 
+      --  A declaration may be subject to pragma Ghost. Set the mode now to
+      --  ensure that any nodes generated during analysis and expansion are
+      --  marked as Ghost.
+
+      if Is_Declaration (N) then
+         Set_Ghost_Mode (N);
+      end if;
+
       --  Access attribute on remote subprogram cannot be used for a non-remote
       --  access-to-subprogram type.
 
@@ -2112,6 +2124,7 @@ package body Sem_Res is
       if Analyzed (N) then
          Debug_A_Exit ("resolving  ", N, "  (done, already analyzed)");
          Analyze_Dimension (N);
+         Ghost_Mode := Save_Ghost_Mode;
          return;
 
       --  Any case of Any_Type as the Etype value means that we had a
@@ -2119,6 +2132,7 @@ package body Sem_Res is
 
       elsif Etype (N) = Any_Type then
          Debug_A_Exit ("resolving  ", N, "  (done, Etype = Any_Type)");
+         Ghost_Mode := Save_Ghost_Mode;
          return;
       end if;
 
@@ -2550,6 +2564,7 @@ package body Sem_Res is
             then
                Resolve (N, Full_View (Typ));
                Set_Etype (N, Typ);
+               Ghost_Mode := Save_Ghost_Mode;
                return;
 
             --  Check for an aggregate. Sometimes we can get bogus aggregates
@@ -2658,6 +2673,7 @@ package body Sem_Res is
             if Address_Integer_Convert_OK (Typ, Etype (N)) then
                Rewrite (N, Unchecked_Convert_To (Typ, Relocate_Node (N)));
                Analyze_And_Resolve (N, Typ);
+               Ghost_Mode := Save_Ghost_Mode;
                return;
             end if;
 
@@ -2720,12 +2736,14 @@ package body Sem_Res is
          end if;
 
          Resolution_Failed;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
 
       --  Test if we have more than one interpretation for the context
 
       elsif Ambiguous then
          Resolution_Failed;
+         Ghost_Mode := Save_Ghost_Mode;
          return;
 
       --  Only one intepretation
@@ -2813,6 +2831,7 @@ package body Sem_Res is
                --  Rewrite_Renamed_Operator.
 
                if Analyzed (N) then
+                  Ghost_Mode := Save_Ghost_Mode;
                   return;
                end if;
             end if;
@@ -2962,6 +2981,7 @@ package body Sem_Res is
          if Nkind (N) not in N_Subexpr then
             Debug_A_Exit ("resolving  ", N, "  (done)");
             Expand (N);
+            Ghost_Mode := Save_Ghost_Mode;
             return;
          end if;
 
@@ -2996,6 +3016,8 @@ package body Sem_Res is
 
          Expand (N);
       end if;
+
+      Ghost_Mode := Save_Ghost_Mode;
    end Resolve;
 
    -------------
index 4903d3f4dae3806f05b28f9c2bd086e321d21530..2e7064b0ef0be4a238dc52646f379062cdecd152 100644 (file)
@@ -1314,7 +1314,6 @@ package body Sem_Util is
 
          --  Local variables
 
-         GM        : constant Ghost_Mode_Type := Ghost_Mode;
          Loc       : constant Source_Ptr := Sloc (Typ);
          Prag      : constant Node_Id    :=
                        Get_Pragma (Typ, Pragma_Default_Initial_Condition);
@@ -1324,6 +1323,8 @@ package body Sem_Util is
          Expr      : Node_Id;
          Stmt      : Node_Id;
 
+         Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
       --  Start of processing for Build_Default_Init_Cond_Procedure_Body
 
       begin
@@ -1341,8 +1342,8 @@ package body Sem_Util is
             return;
          end if;
 
-         --  Ensure that the analysis and expansion produce Ghost nodes if the
-         --  type itself is Ghost.
+         --  The related type may be subject to pragma Ghost. Set the mode now
+         --  to ensure that the analysis and expansion produce Ghost nodes.
 
          Set_Ghost_Mode_From_Entity (Typ);
 
@@ -1412,11 +1413,7 @@ package body Sem_Util is
          Set_Corresponding_Spec (Body_Decl, Proc_Id);
 
          Insert_After_And_Analyze (Declaration_Node (Typ), Body_Decl);
-
-         --  Restore the original Ghost mode once analysis and expansion have
-         --  taken place.
-
-         Ghost_Mode := GM;
+         Ghost_Mode := Save_Ghost_Mode;
       end Build_Default_Init_Cond_Procedure_Body;
 
       --  Local variables
@@ -1465,10 +1462,12 @@ package body Sem_Util is
    ---------------------------------------------------
 
    procedure Build_Default_Init_Cond_Procedure_Declaration (Typ : Entity_Id) is
-      GM      : constant Ghost_Mode_Type := Ghost_Mode;
-      Loc     : constant Source_Ptr := Sloc (Typ);
-      Prag    : constant Node_Id    :=
+      Loc  : constant Source_Ptr := Sloc (Typ);
+      Prag : constant Node_Id    :=
                   Get_Pragma (Typ, Pragma_Default_Initial_Condition);
+
+      Save_Ghost_Mode : constant Ghost_Mode_Type := Ghost_Mode;
+
       Proc_Id : Entity_Id;
 
    begin
@@ -1485,8 +1484,8 @@ package body Sem_Util is
          return;
       end if;
 
-      --  Ensure that the analysis and expansion produce Ghost nodes if the
-      --  type itself is Ghost.
+      --  The related type may be subject to pragma Ghost. Set the mode now to
+      --  ensure that the analysis and expansion produce Ghost nodes.
 
       Set_Ghost_Mode_From_Entity (Typ);
 
@@ -1520,10 +1519,7 @@ package body Sem_Util is
                   Defining_Identifier => Make_Temporary (Loc, 'I'),
                   Parameter_Type      => New_Occurrence_Of (Typ, Loc))))));
 
-      --  Restore the original Ghost mode once analysis and expansion have
-      --  taken place.
-
-      Ghost_Mode := GM;
+      Ghost_Mode := Save_Ghost_Mode;
    end Build_Default_Init_Cond_Procedure_Declaration;
 
    ---------------------------