sem_cat.adb (Validate_RACW_Primitives): Do not rely on Comes_From_Source to exclude primitives from being checked.
2008-03-26 Thomas Quinot <quinot@adacore.com> * sem_cat.adb (Validate_RACW_Primitives): Do not rely on Comes_From_Source to exclude primitives from being checked. We want to exclude predefined primitives only, so use the appropriate specific predicate. Also, flag a formal parameter of an anonymous access-to-subprogram type as illegal for a primitive operation of a remote access to class-wide type. From-SVN: r133572
This commit is contained in:
parent
e96db982d2
commit
2b2b679811
@ -6,7 +6,7 @@
|
|||||||
-- --
|
-- --
|
||||||
-- B o d y --
|
-- B o d y --
|
||||||
-- --
|
-- --
|
||||||
-- Copyright (C) 1992-2007, Free Software Foundation, Inc. --
|
-- Copyright (C) 1992-2008, Free Software Foundation, Inc. --
|
||||||
-- --
|
-- --
|
||||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||||
@ -28,6 +28,7 @@ with Debug; use Debug;
|
|||||||
with Einfo; use Einfo;
|
with Einfo; use Einfo;
|
||||||
with Elists; use Elists;
|
with Elists; use Elists;
|
||||||
with Errout; use Errout;
|
with Errout; use Errout;
|
||||||
|
with Exp_Util; use Exp_Util;
|
||||||
with Fname; use Fname;
|
with Fname; use Fname;
|
||||||
with Lib; use Lib;
|
with Lib; use Lib;
|
||||||
with Namet; use Namet;
|
with Namet; use Namet;
|
||||||
@ -214,11 +215,26 @@ package body Sem_Cat is
|
|||||||
-- Here we have an error
|
-- Here we have an error
|
||||||
|
|
||||||
else
|
else
|
||||||
if Is_Subunit then
|
-- Don't give error if main unit is not an internal unit, and the
|
||||||
|
-- unit generating the message is an internal unit. This is the
|
||||||
|
-- situation in which such messages would be ignored in any case,
|
||||||
|
-- so it is convenient not to generate them (since it causes
|
||||||
|
-- annoying inteference with debugging)
|
||||||
|
|
||||||
|
if Is_Internal_File_Name (Unit_File_Name (Current_Sem_Unit))
|
||||||
|
and then not Is_Internal_File_Name (Unit_File_Name (Main_Unit))
|
||||||
|
then
|
||||||
|
return;
|
||||||
|
|
||||||
|
-- Subunit case
|
||||||
|
|
||||||
|
elsif Is_Subunit then
|
||||||
Error_Msg_NE
|
Error_Msg_NE
|
||||||
("<subunit cannot depend on& " &
|
("<subunit cannot depend on& " &
|
||||||
"(parent has wrong categorization)", N, Depended_Entity);
|
"(parent has wrong categorization)", N, Depended_Entity);
|
||||||
|
|
||||||
|
-- Normal unit, not subunit
|
||||||
|
|
||||||
else
|
else
|
||||||
Error_Msg_NE
|
Error_Msg_NE
|
||||||
("<cannot depend on& " &
|
("<cannot depend on& " &
|
||||||
@ -660,8 +676,7 @@ package body Sem_Cat is
|
|||||||
-- previous analysis.
|
-- previous analysis.
|
||||||
|
|
||||||
if Nkind (PN) = N_Pragma then
|
if Nkind (PN) = N_Pragma then
|
||||||
|
case Get_Pragma_Id (PN) is
|
||||||
case Get_Pragma_Id (Chars (PN)) is
|
|
||||||
when Pragma_All_Calls_Remote |
|
when Pragma_All_Calls_Remote |
|
||||||
Pragma_Preelaborate |
|
Pragma_Preelaborate |
|
||||||
Pragma_Pure |
|
Pragma_Pure |
|
||||||
@ -1297,12 +1312,36 @@ package body Sem_Cat is
|
|||||||
Primitive_Subprograms : Elist_Id;
|
Primitive_Subprograms : Elist_Id;
|
||||||
Subprogram_Elmt : Elmt_Id;
|
Subprogram_Elmt : Elmt_Id;
|
||||||
Subprogram : Entity_Id;
|
Subprogram : Entity_Id;
|
||||||
Profile : List_Id;
|
|
||||||
Param_Spec : Node_Id;
|
Param_Spec : Node_Id;
|
||||||
Param : Entity_Id;
|
Param : Entity_Id;
|
||||||
Param_Type : Entity_Id;
|
Param_Type : Entity_Id;
|
||||||
Rtyp : Node_Id;
|
Rtyp : Node_Id;
|
||||||
|
|
||||||
|
procedure Illegal_RACW (Msg : String; N : Node_Id);
|
||||||
|
-- Diagnose that T is illegal because of the given reason, associated
|
||||||
|
-- with the location of node N.
|
||||||
|
|
||||||
|
Illegal_RACW_Message_Issued : Boolean := False;
|
||||||
|
-- Set True once Illegal_RACW has been called
|
||||||
|
|
||||||
|
------------------
|
||||||
|
-- Illegal_RACW --
|
||||||
|
------------------
|
||||||
|
|
||||||
|
procedure Illegal_RACW (Msg : String; N : Node_Id) is
|
||||||
|
begin
|
||||||
|
if not Illegal_RACW_Message_Issued then
|
||||||
|
Error_Msg_N
|
||||||
|
("illegal remote access to class-wide type&", T);
|
||||||
|
Illegal_RACW_Message_Issued := True;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
Error_Msg_Sloc := Sloc (N);
|
||||||
|
Error_Msg_N ("\\" & Msg & " in primitive#", T);
|
||||||
|
end Illegal_RACW;
|
||||||
|
|
||||||
|
-- Start of processing for Validate_RACW_Primitives
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Desig_Type := Etype (Designated_Type (T));
|
Desig_Type := Etype (Designated_Type (T));
|
||||||
|
|
||||||
@ -1312,7 +1351,9 @@ package body Sem_Cat is
|
|||||||
while Subprogram_Elmt /= No_Elmt loop
|
while Subprogram_Elmt /= No_Elmt loop
|
||||||
Subprogram := Node (Subprogram_Elmt);
|
Subprogram := Node (Subprogram_Elmt);
|
||||||
|
|
||||||
if not Comes_From_Source (Subprogram) then
|
if Is_Predefined_Dispatching_Operation (Subprogram)
|
||||||
|
or else Is_Hidden (Subprogram)
|
||||||
|
then
|
||||||
goto Next_Subprogram;
|
goto Next_Subprogram;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
@ -1325,15 +1366,14 @@ package body Sem_Cat is
|
|||||||
null;
|
null;
|
||||||
|
|
||||||
elsif Ekind (Rtyp) = E_Anonymous_Access_Type then
|
elsif Ekind (Rtyp) = E_Anonymous_Access_Type then
|
||||||
Error_Msg_N
|
Illegal_RACW ("anonymous access result", Rtyp);
|
||||||
("anonymous access result in remote object primitive", Rtyp);
|
|
||||||
|
|
||||||
elsif Is_Limited_Type (Rtyp) then
|
elsif Is_Limited_Type (Rtyp) then
|
||||||
if No (TSS (Rtyp, TSS_Stream_Read))
|
if No (TSS (Rtyp, TSS_Stream_Read))
|
||||||
or else
|
or else
|
||||||
No (TSS (Rtyp, TSS_Stream_Write))
|
No (TSS (Rtyp, TSS_Stream_Write))
|
||||||
then
|
then
|
||||||
Error_Msg_N
|
Illegal_RACW
|
||||||
("limited return type must have Read and Write attributes",
|
("limited return type must have Read and Write attributes",
|
||||||
Parent (Subprogram));
|
Parent (Subprogram));
|
||||||
Explain_Limited_Type (Rtyp, Parent (Subprogram));
|
Explain_Limited_Type (Rtyp, Parent (Subprogram));
|
||||||
@ -1342,16 +1382,12 @@ package body Sem_Cat is
|
|||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
Profile := Parameter_Specifications (Parent (Subprogram));
|
Param := First_Formal (Subprogram);
|
||||||
|
while Present (Param) loop
|
||||||
-- Profile must exist, otherwise not primitive operation
|
|
||||||
|
|
||||||
Param_Spec := First (Profile);
|
|
||||||
while Present (Param_Spec) loop
|
|
||||||
|
|
||||||
-- Now find out if this parameter is a controlling parameter
|
-- Now find out if this parameter is a controlling parameter
|
||||||
|
|
||||||
Param := Defining_Identifier (Param_Spec);
|
Param_Spec := Parent (Param);
|
||||||
Param_Type := Etype (Param);
|
Param_Type := Etype (Param);
|
||||||
|
|
||||||
if Is_Controlling_Formal (Param) then
|
if Is_Controlling_Formal (Param) then
|
||||||
@ -1361,13 +1397,13 @@ package body Sem_Cat is
|
|||||||
|
|
||||||
null;
|
null;
|
||||||
|
|
||||||
elsif Ekind (Param_Type) = E_Anonymous_Access_Type then
|
elsif Ekind (Param_Type) = E_Anonymous_Access_Type
|
||||||
|
or else Ekind (Param_Type) = E_Anonymous_Access_Subprogram_Type
|
||||||
|
then
|
||||||
-- From RM E.2.2(14), no access parameter other than
|
-- From RM E.2.2(14), no access parameter other than
|
||||||
-- controlling ones may be used.
|
-- controlling ones may be used.
|
||||||
|
|
||||||
Error_Msg_N
|
Illegal_RACW ("non-controlling access parameter", Param_Spec);
|
||||||
("non-controlling access parameter", Param_Spec);
|
|
||||||
|
|
||||||
elsif Is_Limited_Type (Param_Type) then
|
elsif Is_Limited_Type (Param_Type) then
|
||||||
|
|
||||||
@ -1378,7 +1414,7 @@ package body Sem_Cat is
|
|||||||
or else
|
or else
|
||||||
No (TSS (Param_Type, TSS_Stream_Write))
|
No (TSS (Param_Type, TSS_Stream_Write))
|
||||||
then
|
then
|
||||||
Error_Msg_N
|
Illegal_RACW
|
||||||
("limited formal must have Read and Write attributes",
|
("limited formal must have Read and Write attributes",
|
||||||
Param_Spec);
|
Param_Spec);
|
||||||
Explain_Limited_Type (Param_Type, Param_Spec);
|
Explain_Limited_Type (Param_Type, Param_Spec);
|
||||||
@ -1387,7 +1423,7 @@ package body Sem_Cat is
|
|||||||
|
|
||||||
-- Check next parameter in this subprogram
|
-- Check next parameter in this subprogram
|
||||||
|
|
||||||
Next (Param_Spec);
|
Next_Formal (Param);
|
||||||
end loop;
|
end loop;
|
||||||
|
|
||||||
<<Next_Subprogram>>
|
<<Next_Subprogram>>
|
||||||
@ -1654,7 +1690,7 @@ package body Sem_Cat is
|
|||||||
Error_Msg_N
|
Error_Msg_N
|
||||||
("error in designated type of remote access to class-wide type", T);
|
("error in designated type of remote access to class-wide type", T);
|
||||||
Error_Msg_N
|
Error_Msg_N
|
||||||
("\must be tagged limited private or private extension of type", T);
|
("\must be tagged limited private or private extension", T);
|
||||||
return;
|
return;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
@ -1788,7 +1824,7 @@ package body Sem_Cat is
|
|||||||
return;
|
return;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
Error_Msg_N ("incorrect remote type dereference", N);
|
Error_Msg_N ("incorrect dereference of remote type", N);
|
||||||
end if;
|
end if;
|
||||||
end Validate_Remote_Access_To_Class_Wide_Type;
|
end Validate_Remote_Access_To_Class_Wide_Type;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user