exp_ch6.adb (Expand_Protected_Subprogram_Call): Add guard to better detect call within an entry_wrapper.

2017-01-06  Ed Schonberg  <schonberg@adacore.com>

	* exp_ch6.adb (Expand_Protected_Subprogram_Call): Add guard to
	better detect call within an entry_wrapper.
	* sem_res.adb (Resolve_Call): A protected call within an
	entity_wrapper is analyzed in the context of the protected
	object but corresponds to a pre-analysis and is not an access
	before elaboration.
	* sem_attr.adb: Minor reformatting.

From-SVN: r244139
This commit is contained in:
Ed Schonberg 2017-01-06 11:24:02 +00:00 committed by Arnaud Charlet
parent 5e127570e2
commit 9ca67d3f24
4 changed files with 28 additions and 10 deletions

View File

@ -1,3 +1,13 @@
2017-01-06 Ed Schonberg <schonberg@adacore.com>
* exp_ch6.adb (Expand_Protected_Subprogram_Call): Add guard to
better detect call within an entry_wrapper.
* sem_res.adb (Resolve_Call): A protected call within an
entity_wrapper is analyzed in the context of the protected
object but corresponds to a pre-analysis and is not an access
before elaboration.
* sem_attr.adb: Minor reformatting.
2017-01-06 Justin Squirek <squirek@adacore.com>
* sem_attr.adb (Analyze_Attribute): Modify semantic checks for

View File

@ -6006,6 +6006,7 @@ package body Exp_Ch6 is
-- case this must be handled as an inter-object call.
if not In_Open_Scopes (Scop)
or else Is_Entry_Wrapper (Current_Scope)
or else not Is_Entity_Name (Name (N))
then
if Nkind (Name (N)) = N_Selected_Component then

View File

@ -3840,24 +3840,29 @@ package body Sem_Attr is
when Attribute_Finalization_Size =>
Check_E0;
-- The prefix denotes an object
if Is_Object_Reference (P) then
Analyze_And_Resolve (P);
Check_Object_Reference (P);
-- Redundant type verification for accurate error output
-- Check the prefix is a type to avoid an error message stating the
-- prefix must exclusively denote one
elsif Is_Entity_Name (P) and then Is_Type (Entity (P)) then
elsif not Is_Entity_Name (P)
or else not Is_Type (Entity (P))
then
Error_Attr_P ("prefix of % attribute must be a definite type or" &
" an object");
else
Check_Type;
Check_Not_Incomplete_Type;
if Is_Class_Wide_Type (Etype (P)) then
Error_Attr_P ("prefix of % attribute cannot be applied to " &
"a class-wide type");
Error_Attr_P
("prefix of % attribute cannot denote a class-wide type");
end if;
-- The prefix does not denote an object or a type
else
Error_Attr_P
("prefix of % attribute must be a definite type or an object");
end if;
Set_Etype (N, Universal_Integer);

View File

@ -6287,12 +6287,14 @@ package body Sem_Res is
-- A protected function cannot be called within the definition of the
-- enclosing protected type, unless it is part of a pre/postcondition
-- on another protected operation.
-- on another protected operation. This may appear in the entry
-- wrapper created for an entry with preconditions.
if Is_Protected_Type (Scope (Nam))
and then In_Open_Scopes (Scope (Nam))
and then not Has_Completion (Scope (Nam))
and then not In_Spec_Expression
and then not Is_Entry_Wrapper (Current_Scope)
then
Error_Msg_NE
("& cannot be called before end of protected definition", N, Nam);