From: Eric Botcazou <[email protected]>
It is already set on the anonymous access type of function results and will
prevent return objects from being treated as Ada 2012's stand-alone objects,
thus make it easier to enforce the RM 3.10.2(13.2) rule.
gcc/ada/ChangeLog:
* einfo.ads (Is_Local_Anonymous_Access): Mention return objects.
* accessibility.adb (Type_Access_Level): Call Enclosing_Subprogram.
* sem_ch3.adb (Find_Type_Of_Object): Set Is_Local_Anonymous_Access
on the anonymous access type of return objects.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/accessibility.adb | 24 ++++++------------------
gcc/ada/einfo.ads | 11 ++++++-----
gcc/ada/sem_ch3.adb | 5 +++--
3 files changed, 15 insertions(+), 25 deletions(-)
diff --git a/gcc/ada/accessibility.adb b/gcc/ada/accessibility.adb
index 635b162a5d7..a1472fab919 100644
--- a/gcc/ada/accessibility.adb
+++ b/gcc/ada/accessibility.adb
@@ -2708,25 +2708,13 @@ package body Accessibility is
(Is_Itype (Btyp)
and then Nkind (Associated_Node_For_Itype (Btyp)) =
N_Object_Declaration
- and then Is_Return_Object
- (Defining_Identifier
- (Associated_Node_For_Itype (Btyp))))
+ and then
+ Is_Return_Object
+ (Defining_Identifier (Associated_Node_For_Itype (Btyp))))
then
- declare
- Scop : Entity_Id;
-
- begin
- Scop := Scope (Scope (Btyp));
- while Present (Scop) loop
- exit when Ekind (Scop) = E_Function;
- Scop := Scope (Scop);
- end loop;
-
- -- Treat the return object's type as having the level of the
- -- function's result subtype (as per RM05-6.5(5.3/2)).
-
- return Type_Access_Level (Etype (Scop), Allow_Alt_Model);
- end;
+ return
+ Type_Access_Level
+ (Etype (Enclosing_Subprogram (Btyp)), Allow_Alt_Model);
end if;
end if;
diff --git a/gcc/ada/einfo.ads b/gcc/ada/einfo.ads
index e22762e90a4..abd7398562f 100644
--- a/gcc/ada/einfo.ads
+++ b/gcc/ada/einfo.ads
@@ -3073,11 +3073,12 @@ package Einfo is
-- Is_Local_Anonymous_Access
-- Defined in access types. Set for an anonymous access type to indicate
-- that the type is created for an array or record component with access
--- definition, an access result, or (pre-Ada 2012) a standalone object.
--- Such anonymous types have an accessibility level equal to that of the
--- declaration in which they appear, unlike the anonymous access types
--- that are created for access parameters, access discriminants, and
--- (as of Ada 2012) stand-alone objects.
+-- definition, an access result, a return object, or (before Ada 2012) a
+-- stand-alone object. Such anonymous types have an accessibility level
+-- equal to that of the declaration in which they appear (or something
+-- equivalent), unlike the anonymous access types that are created for
+-- access parameters, access discriminants, and (in Ada 2012 and later
+-- versions of the language) stand-alone objects.
-- Is_Loop_Parameter
-- Applies to all entities. Certain loops, in particular "for ... of"
diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb
index 337c99c0324..ca9826ddf8d 100644
--- a/gcc/ada/sem_ch3.adb
+++ b/gcc/ada/sem_ch3.adb
@@ -19251,8 +19251,9 @@ package body Sem_Ch3 is
Set_Is_Local_Anonymous_Access
(T, Ada_Version < Ada_2012
- or else Nkind (P) /= N_Object_Declaration
- or else Is_Library_Level_Entity (Defining_Identifier (P)));
+ or else Nkind (P) /= N_Object_Declaration
+ or else Is_Return_Object (Defining_Identifier (P))
+ or else Is_Library_Level_Entity (Defining_Identifier (P)));
-- Otherwise, either the object definition is just a subtype_mark or we
-- are analyzing a component declaration.
--
2.53.0