Commit 1b8b4638 by Robert Dewar Committed by Arnaud Charlet

sem_prag.adb (Set_Convention_From_Pragma): Check that convention Ghost can only apply to functions.

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
parent 42959b0c
2014-01-27 Robert Dewar <dewar@adacore.com> 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 * gnat_ugn.texi: Add Short_Enums to documentation of
-gnatet/-gnateT. -gnatet/-gnateT.
......
...@@ -6886,6 +6886,10 @@ package body Einfo is ...@@ -6886,6 +6886,10 @@ package body Einfo is
-- Is_Ghost_Entity -- -- 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 function Is_Ghost_Entity (Id : E) return B is
begin begin
if Present (Id) and then Ekind (Id) = E_Variable then if Present (Id) and then Ekind (Id) = E_Variable then
......
...@@ -2343,11 +2343,15 @@ package Einfo is ...@@ -2343,11 +2343,15 @@ package Einfo is
-- Is_Ghost_Entity (synthesized) -- Is_Ghost_Entity (synthesized)
-- Applies to all entities. Yields True for a subprogram or a whole -- 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) -- Is_Ghost_Subprogram (synthesized)
-- Applies to all entities. Yields True for a subprogram that has a Ghost -- 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) -- Is_Hidden (Flag57)
-- Defined in all entities. Set for all entities declared in the -- Defined in all entities. Set for all entities declared in the
......
...@@ -6029,7 +6029,8 @@ package body Sem_Prag is ...@@ -6029,7 +6029,8 @@ package body Sem_Prag is
-- Set convention in entity E, and also flag that the entity has a -- Set convention in entity E, and also flag that the entity has a
-- convention pragma. If entity is for a private or incomplete type, -- convention pragma. If entity is for a private or incomplete type,
-- also set convention and flag on underlying type. This procedure -- 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 -- -- Diagnose_Multiple_Pragmas --
...@@ -6191,6 +6192,16 @@ package body Sem_Prag is ...@@ -6191,6 +6192,16 @@ package body Sem_Prag is
procedure Set_Convention_From_Pragma (E : Entity_Id) is procedure Set_Convention_From_Pragma (E : Entity_Id) is
begin 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 -- Ada 2005 (AI-430): Check invalid attempt to change convention
-- for an overridden dispatching operation. Technically this is -- for an overridden dispatching operation. Technically this is
-- an amendment and should only be done in Ada 2005 mode. However, -- an amendment and should only be done in Ada 2005 mode. However,
...@@ -6201,11 +6212,11 @@ package body Sem_Prag is ...@@ -6201,11 +6212,11 @@ package body Sem_Prag is
and then Present (Overridden_Operation (E)) and then Present (Overridden_Operation (E))
and then C /= Convention (Overridden_Operation (E)) and then C /= Convention (Overridden_Operation (E))
then 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. -- appears as a mismatch in conventions.
if C = Convention_Ghost then if C = Convention_Ghost then
Error_Msg_N ("ghost subprogram & cannot be overriding", E); Error_Msg_N ("ghost function & cannot be overriding", E);
else else
Error_Pragma_Arg Error_Pragma_Arg
("cannot change convention for overridden dispatching " ("cannot change convention for overridden dispatching "
...@@ -6401,7 +6412,7 @@ package body Sem_Prag is ...@@ -6401,7 +6412,7 @@ package body Sem_Prag is
if Is_Ghost_Subprogram (E) if Is_Ghost_Subprogram (E)
and then Present (Overridden_Operation (E)) and then Present (Overridden_Operation (E))
then then
Error_Msg_N ("ghost subprogram & cannot be overriding", E); Error_Msg_N ("ghost function & cannot be overriding", E);
end if; end if;
-- Go to renamed subprogram if present, since convention applies to -- Go to renamed subprogram if present, since convention applies to
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment