From: Viljar Indus <[email protected]>

gcc/ada/ChangeLog:

        * ghost.adb (Check_Valid_Ghost_Policy): Remove function.
        (Ghost_Policy_In_Effect): Force the ghost policy to be always be
        ignore inside ignored regions.
        (Mark_And_Set_Ghost_Declaration): Likewise.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/ghost.adb | 44 ++++++++++++++++++--------------------------
 1 file changed, 18 insertions(+), 26 deletions(-)

diff --git a/gcc/ada/ghost.adb b/gcc/ada/ghost.adb
index d49d94df246..5604bfec92a 100644
--- a/gcc/ada/ghost.adb
+++ b/gcc/ada/ghost.adb
@@ -112,6 +112,11 @@ package body Ghost is
    --  applicable to the enclosing declaration, statement, assertion pragma
    --  or specification aspect.
    --
+   --  If the declaration occurs inside a ghost declaration, ghost statement,
+   --  assertion pragma or specification aspect and the assertion policy
+   --  applicable to this scope is Ignore, then the assertion policy applicable
+   --  to the declaration is also Ignore.
+   --
    --  Otherwise, the assertion policy applicable to an object declaration
    --  comes either from its assertion level if any, or from the ghost
    --  policy at the point of declaration.
@@ -1031,10 +1036,6 @@ package body Ghost is
       --  Check that the the assertion level of the declared entity is
       --  compatible with assertion level of the ghost region.
 
-      procedure Check_Valid_Ghost_Policy (Id : Entity_Id; Ref : Node_Id);
-      --  Check that the declared identifier does not have a Checked assertion
-      --  policy while being declared inside an ignored ghost region.
-
       ---------------------------------
       -- Check_Valid_Assertion_Level --
       ---------------------------------
@@ -1063,24 +1064,6 @@ package body Ghost is
          end if;
       end Check_Valid_Assertion_Level;
 
-      ------------------------------
-      -- Check_Valid_Ghost_Policy --
-      ------------------------------
-
-      procedure Check_Valid_Ghost_Policy (Id : Entity_Id; Ref : Node_Id) is
-         Policy : constant Name_Id := Ghost_Policy_In_Effect (Id);
-      begin
-         if Ghost_Config.Ghost_Mode = Ignore and then Policy = Name_Check
-         then
-            Error_Msg_Sloc := Sloc (Ref);
-
-            Error_Msg_N (Ghost_Policy_Error_Msg, Ref);
-            Error_Msg_NE ("\& has ghost policy `Check`", Ref, Id);
-            Error_Msg_NE
-              ("\& is declared # within ghost policy `Ignore`", Ref, Id);
-         end if;
-      end Check_Valid_Ghost_Policy;
-
       --  Local variables
 
       Id : constant Entity_Id := Defining_Entity (N);
@@ -1092,7 +1075,6 @@ package body Ghost is
          return;
       end if;
 
-      Check_Valid_Ghost_Policy (Id, N);
       Check_Valid_Assertion_Level (Id, N);
    end Check_Valid_Ghost_Declaration;
 
@@ -1568,7 +1550,9 @@ package body Ghost is
       Level_Nam : constant Name_Id :=
         (if No (Level) then No_Name else Chars (Level));
    begin
-      if Ghost_Config.Is_Inside_Statement_Or_Pragma
+      if Present (Ghost_Config.Ignored_Ghost_Region) then
+         return Name_Ignore;
+      elsif Ghost_Config.Is_Inside_Statement_Or_Pragma
         and then Is_Implicit_Ghost (Id)
       then
          case Ghost_Config.Ghost_Mode is
@@ -2126,8 +2110,16 @@ package body Ghost is
       --  the region.
 
       if Present (Level) then
-         Policy :=
-           Policy_In_Effect (Name_Ghost, Assertion_Level_To_Name (Level));
+         --  Default to the Ignore policy inside ignored ghost regions.
+         --  Similarly to how we do it in Ghost_Policy_In_Effect.
+         --  SPARK RM 6.9 (3)
+
+         if Present (Ghost_Config.Ignored_Ghost_Region) then
+            Policy := Name_Ignore;
+         else
+            Policy :=
+              Policy_In_Effect (Name_Ghost, Assertion_Level_To_Name (Level));
+         end if;
 
       --  A declaration elaborated in a Ghost region is automatically Ghost
       --  (SPARK RM 6.9(2)).
-- 
2.51.0

Reply via email to