sem_prag.adb (Set_Convention_From_Pragma): Check that convention Ghost can only apply...
authorRobert Dewar <dewar@adacore.com>
Mon, 27 Jan 2014 16:28:28 +0000 (16:28 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 27 Jan 2014 16:28:28 +0000 (17:28 +0100)
2014-01-27  Robert Dewar  <dewar@adacore.com>

* sem_prag.adb (Set_Convention_From_Pragma): Check that
convention Ghost can only apply to functions.
* einfo.ads, einfo.adb (Is_Ghost_Subprogram): Add clarifying comment.

From-SVN: r207135

gcc/ada/ChangeLog
gcc/ada/einfo.adb
gcc/ada/einfo.ads
gcc/ada/sem_prag.adb

index 929297bbce33a859db0012c1162dcf4f3c034c39..64dc2e9e6a0e4d65445176e93b9e6505e59a91f4 100644 (file)
@@ -1,3 +1,9 @@
+2014-01-27  Robert Dewar  <dewar@adacore.com>
+
+       * sem_prag.adb (Set_Convention_From_Pragma): Check that
+       convention Ghost can only apply to functions.
+       * einfo.ads, einfo.adb (Is_Ghost_Subprogram): Add clarifying comment.
+
 2014-01-27  Robert Dewar  <dewar@adacore.com>
 
        * gnat_ugn.texi: Add Short_Enums to documentation of
index e0700595f841df147cfaeb8387eec24181326ed0..eb8b78dce5a8e54b3d292866f3c33ea861446f27 100644 (file)
@@ -6886,6 +6886,10 @@ package body Einfo is
    -- Is_Ghost_Entity --
    ---------------------
 
+   --  Note: coding below allows for ghost variables. They are not currently
+   --  implemented, so we will always get False for variables, but that is
+   --  expected to change in the future.
+
    function Is_Ghost_Entity (Id : E) return B is
    begin
       if Present (Id) and then Ekind (Id) = E_Variable then
index d7fc838daee4f9cad7acb79d9c3eb5f445da023a..808a4921569905a33ddc9d5cd7510d10b4485dc0 100644 (file)
@@ -2343,11 +2343,15 @@ package Einfo is
 
 --    Is_Ghost_Entity (synthesized)
 --       Applies to all entities. Yields True for a subprogram or a whole
---       object that has convention Ghost.
+--       object that has convention Ghost. For now only functions can have
+--       Ghost convention, so this will be false for other than functions,
+--       but we expect that to change in the future.
 
 --    Is_Ghost_Subprogram (synthesized)
 --       Applies to all entities. Yields True for a subprogram that has a Ghost
---       convention.
+--       convention. Note: for now, only ghost functions are allowed, so this
+--       will always be false for procedures, but that is expected to change in
+--       the future.
 
 --    Is_Hidden (Flag57)
 --       Defined in all entities. Set for all entities declared in the
index 70f90173a971a05c78d013fc64cd3aedbb8b9688..624bf4371a006d7c713473d021da55373ed3cb7c 100644 (file)
@@ -6029,7 +6029,8 @@ package body Sem_Prag is
          --  Set convention in entity E, and also flag that the entity has a
          --  convention pragma. If entity is for a private or incomplete type,
          --  also set convention and flag on underlying type. This procedure
-         --  also deals with the special case of C_Pass_By_Copy convention.
+         --  also deals with the special case of C_Pass_By_Copy convention,
+         --  and error checks for inappropriate convention specification.
 
          -------------------------------
          -- Diagnose_Multiple_Pragmas --
@@ -6191,6 +6192,16 @@ package body Sem_Prag is
 
          procedure Set_Convention_From_Pragma (E : Entity_Id) is
          begin
+            --  Ghost convention is allowed only for functions
+
+            if Ekind (E) /= E_Function and then C = Convention_Ghost then
+               Error_Msg_N
+                 ("& may not have Ghost convention", E);
+               Error_Msg_N
+                 ("\only functions are permitted to have Ghost convention", E);
+               return;
+            end if;
+
             --  Ada 2005 (AI-430): Check invalid attempt to change convention
             --  for an overridden dispatching operation. Technically this is
             --  an amendment and should only be done in Ada 2005 mode. However,
@@ -6201,11 +6212,11 @@ package body Sem_Prag is
               and then Present (Overridden_Operation (E))
               and then C /= Convention (Overridden_Operation (E))
             then
-               --  An attempt to override a subprogram with a ghost subprogram
+               --  An attempt to override a function with a ghost function
                --  appears as a mismatch in conventions.
 
                if C = Convention_Ghost then
-                  Error_Msg_N ("ghost subprogram & cannot be overriding", E);
+                  Error_Msg_N ("ghost function & cannot be overriding", E);
                else
                   Error_Pragma_Arg
                     ("cannot change convention for overridden dispatching "
@@ -6401,7 +6412,7 @@ package body Sem_Prag is
          if Is_Ghost_Subprogram (E)
            and then Present (Overridden_Operation (E))
          then
-            Error_Msg_N ("ghost subprogram & cannot be overriding", E);
+            Error_Msg_N ("ghost function & cannot be overriding", E);
          end if;
 
          --  Go to renamed subprogram if present, since convention applies to