[Ada] Implement AI12-0032 fixes for 'Old attribute accessibility

2020-06-18  Steve Baird  <baird@adacore.com>

gcc/ada/

	* sem_util.adb (Object_Access_Level): Treat a 'Old attribute
	reference like an aggregate in determining its static
	accessibility level; after the evaluation of the relevant
	post-condition, the implicitly declared constant associated with
	an Old attribute reference ceases to exist. Similarly for
	Loop_Entry attribute.
	* exp_ch6.adb (Expand_Call_Helper): For an attribute reference
	that is expanded into a reference to an implicitly declared
	constant (e.g., a 'Old or 'Loop_Entry attribute), compute the
	dynamic accessibility level of that constant by looking at the
	declaration of the constant (as opposed to looking at the
	attribute reference).
This commit is contained in:
Steve Baird 2020-04-23 14:39:55 -07:00 committed by Pierre-Marie de Rodat
parent a6c467131b
commit 13175003d4
2 changed files with 27 additions and 0 deletions

View File

@ -3617,6 +3617,21 @@ package body Exp_Ch6 is
then
Prev_Orig := Prev;
-- If the actual is an attribute reference that was expanded
-- into a reference to an entity, then get accessibility level
-- from that entity. AARM 6.1.1(27.d) says "... the implicit
-- constant declaration defines the accessibility level of X'Old".
elsif Nkind (Prev_Orig) = N_Attribute_Reference
and then Nam_In (Attribute_Name (Prev_Orig),
Name_Old,
Name_Loop_Entry)
and then Is_Entity_Name (Prev)
and then Present (Entity (Prev))
and then Is_Object (Entity (Prev))
then
Prev_Orig := Prev;
elsif Nkind (Prev_Orig) = N_Type_Conversion then
Prev_Orig := Expression (Prev_Orig);
end if;

View File

@ -24237,6 +24237,18 @@ package body Sem_Util is
elsif Nkind (Orig_Obj) = N_Aggregate then
return Object_Access_Level (Current_Scope);
-- Treat an Old/Loop_Entry attribute reference like an aggregate.
-- AARM 6.1.1(27.d) says "... the implicit constant declaration
-- defines the accessibility level of X'Old", so that is what
-- we are trying to implement here.
elsif Nkind (Orig_Obj) = N_Attribute_Reference
and then Nam_In (Attribute_Name (Orig_Obj),
Name_Old,
Name_Loop_Entry)
then
return Object_Access_Level (Current_Scope);
-- Otherwise return the scope level of Standard. (If there are cases
-- that fall through to this point they will be treated as having
-- global accessibility for now. ???)