Patchwork [Ada] References to formals of access_to_subprogram types

login
register
mail settings
Submitter Arnaud Charlet
Date July 5, 2013, 10:40 a.m.
Message ID <20130705104010.GA13823@adacore.com>
Download mbox | patch
Permalink /patch/257079/
State New
Headers show

Comments

Arnaud Charlet - July 5, 2013, 10:40 a.m.
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  <schonberg@adacore.com>

	* 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.

Patch

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