This patch adds cross-reference information to the formals of an Access_To_
Subprogram type. Previously these formals were classified as objects; now
they are references as (in, out, in-out) parameters.
Here is an example of the new output of the cross-reference utility;
gcc -c params_pkg.adb
gnatxref params_pkg.ali
-----
Param_1 parameter integer object
Decl: params_pkg.ads 3:23
Param_1 parameter integer object
Decl: params_pkg.ads 6:19
Body: params_pkg.adb 2:19
Param_2 parameter float object
Decl: params_pkg.ads 4:23
Param_2 parameter float object
Decl: params_pkg.ads 7:19
Body: params_pkg.adb 3:19
Params_Pkg package
Decl: params_pkg.ads 1:9
Body: params_pkg.adb 1:14
Proc procedure
Decl: params_pkg.ads 6:13
Body: params_pkg.adb 2:13
Proc_Access_Type access type
Decl: params_pkg.ads 2:8
---
package Params_Pkg is
type Proc_Access_Type is
access procedure (Param_1 : in Integer;
Param_2 : out Float);
procedure Proc (Param_1 : in Integer;
Param_2 : out Float);
end Params_Pkg;
---
package body Params_Pkg is
procedure Proc (Param_1 : in Integer;
Param_2 : out Float) is
begin
null;
end;
end Params_Pkg;
Tested on x86_64-pc-linux-gnu, committed on trunk
2013-07-05 Ed Schonberg <[email protected]>
* sem_ch3.adb (Access_Subprogram_Declaration): Use
Generate_Reference_To_Formals.
* lib-xref.adb (Generate_Reference_To_Formals): In the case of
access to subprograms, the formals are found in the designated
subprogram type.
Index: sem_ch3.adb
===================================================================
--- sem_ch3.adb (revision 200688)
+++ sem_ch3.adb (working copy)
@@ -1283,6 +1283,8 @@
Init_Size_Align (T_Name);
Set_Directly_Designated_Type (T_Name, Desig_Type);
+ Generate_Reference_To_Formals (T_Name);
+
-- Ada 2005 (AI-231): Propagate the null-excluding attribute
Set_Can_Never_Be_Null (T_Name, Null_Exclusion_Present (T_Def));
Index: lib-xref.adb
===================================================================
--- lib-xref.adb (revision 200688)
+++ lib-xref.adb (working copy)
@@ -1079,6 +1079,9 @@
Next_Entity (Formal);
end loop;
+ elsif Ekind (E) in Access_Subprogram_Kind then
+ Formal := First_Formal (Designated_Type (E));
+
else
Formal := First_Formal (E);
end if;
Index: lib-xref.ads
===================================================================
--- lib-xref.ads (revision 200688)
+++ lib-xref.ads (working copy)
@@ -718,7 +718,7 @@
procedure Generate_Reference_To_Formals (E : Entity_Id);
-- Add a reference to the definition of each formal on the line for
- -- a subprogram.
+ -- a subprogram or an access_to_subprogram type.
procedure Generate_Reference_To_Generic_Formals (E : Entity_Id);
-- Add a reference to the definition of each generic formal on the line