+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
-- 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
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);
-- 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);