===================================================================
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
+-- Copyright (C) 1998-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -223,6 +223,7 @@
Line : Natural;
Column : Natural;
Decl_Type : Character;
+ Is_Parameter : Boolean := False;
Remove_Only : Boolean := False;
Symbol_Match : Boolean := True)
return Declaration_Reference
@@ -235,7 +236,7 @@
New_Decl : Declaration_Reference :=
Entities_HTable.Get (Key'Unchecked_Access);
- Is_Parameter : Boolean := False;
+ Is_Param : Boolean := Is_Parameter;
begin
-- Insert the Declaration in the table. There might already be a
@@ -243,7 +244,7 @@
-- need to check that first.
if New_Decl /= null and then New_Decl.Symbol_Length = 0 then
- Is_Parameter := New_Decl.Is_Parameter;
+ Is_Param := Is_Parameter or else New_Decl.Is_Parameter;
Entities_HTable.Remove (Key'Unrestricted_Access);
Entities_Count := Entities_Count - 1;
Free (New_Decl.Key);
@@ -269,7 +270,7 @@
Column => Column,
Source_Line => null,
Next => null),
- Is_Parameter => Is_Parameter,
+ Is_Parameter => Is_Param,
Decl_Type => Decl_Type,
Body_Ref => null,
Ref_Ref => null,
@@ -294,6 +295,10 @@
then
New_Decl.Match := Default_Match
or else Match (File_Ref, Line, Column);
+ New_Decl.Is_Parameter := New_Decl.Is_Parameter or else Is_Param;
+
+ elsif New_Decl /= null then
+ New_Decl.Is_Parameter := New_Decl.Is_Parameter or else Is_Param;
end if;
return New_Decl;
@@ -392,6 +397,8 @@
Labels_As_Ref : Boolean)
is
New_Ref : Reference;
+ New_Decl : Declaration_Reference;
+ pragma Unreferenced (New_Decl);
begin
case Ref_Type is
@@ -407,37 +414,22 @@
when '=' | '<' | '>' | '^' =>
-- Create a dummy declaration in the table to report it as a
- -- parameter. Note that the current declaration for the subprogram
- -- comes before the declaration of the parameter.
+ -- parameter.
+ -- In a given ALI file, the declaration of the subprogram comes
+ -- before the declaration of the parameter. However, it is
+ -- possible that another ALI file has been parsed that also
+ -- references the parameter (for instance a named parameter in a
+ -- call), so we need to check whether there already exists a
+ -- declaration for the parameter.
- declare
- Key : constant String :=
- Key_From_Ref (File_Ref, Line, Column);
- New_Decl : Declaration_Reference;
+ New_Decl := Add_Declaration
+ (File_Ref => File_Ref,
+ Symbol => "",
+ Line => Line,
+ Column => Column,
+ Decl_Type => ' ',
+ Is_Parameter => True);
- begin
- New_Decl := new Declaration_Record'
- (Symbol_Length => 0,
- Symbol => "",
- Key => new String'(Key),
- Decl => new Reference_Record'
- (File => File_Ref,
- Line => Line,
- Column => Column,
- Source_Line => null,
- Next => null),
- Is_Parameter => True,
- Decl_Type => ' ',
- Body_Ref => null,
- Ref_Ref => null,
- Modif_Ref => null,
- Match => False,
- Par_Symbol => null,
- Next => null);
- Entities_HTable.Set (New_Decl);
- Entities_Count := Entities_Count + 1;
- end;
-
when 'e' | 'z' | 't' | 'p' | 'P' | 'k' | 'd' =>
return;
===================================================================
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
+-- Copyright (C) 1998-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -78,6 +78,7 @@
Line : Natural;
Column : Natural;
Decl_Type : Character;
+ Is_Parameter : Boolean := False;
Remove_Only : Boolean := False;
Symbol_Match : Boolean := True)
return Declaration_Reference;
@@ -89,6 +90,8 @@
-- the command line. In that case, the entity will not be output by
-- gnatfind. If Symbol_Match is True, the entity will only be output if the
-- file name itself matches.
+ -- Is_Parameter should be set to True if the entity is known to be a
+ -- subprogram parameter.
procedure Add_Parent
(Declaration : in out Declaration_Reference;