If a subprogram stub has not previous spec, it defines the formals that will
be used in the proper body, and these formals must have the appropriate cross-
references, for source navigation purposes.
The command
gcc -c a.adb
grep Bar a.ali
must yield:
3U14 Bar 3>19 3>33 3|2b11 5l5 5t8
---
package A is
procedure Foo;
end A;
---
package body A is
type T is new Integer;
procedure Bar (P1 : Integer; P2 : T) is separate;
procedure Foo is
begin
null;
end Foo;
end A;
---
separate (A)
procedure Bar (P1 : Integer; P2 : T) is
begin
null;
end Bar;
Tested on x86_64-pc-linux-gnu, committed on trunk
2011-09-01 Ed Schonberg <[email protected]>
* sem_ch6.adb (Analyze_Subprogram_Body_Helper): Generate references to
the formals of a subprogram stub that acts as a spec.
Index: sem_ch6.adb
===================================================================
--- sem_ch6.adb (revision 178401)
+++ sem_ch6.adb (working copy)
@@ -2565,10 +2565,14 @@
Set_Contract (Body_Id, Make_Contract (Sloc (Body_Id)));
Generate_Reference
(Body_Id, Body_Id, 'b', Set_Ref => False, Force => True);
- Generate_Reference_To_Formals (Body_Id);
Install_Formals (Body_Id);
Push_Scope (Body_Id);
end if;
+
+ -- For stubs and bodies with no previous spec, generate references to
+ -- formals.
+
+ Generate_Reference_To_Formals (Body_Id);
end if;
-- If the return type is an anonymous access type whose designated type
@@ -2600,7 +2604,7 @@
-- If this is the proper body of a stub, we must verify that the stub
-- conforms to the body, and to the previous spec if one was present.
- -- we know already that the body conforms to that spec. This test is
+ -- We know already that the body conforms to that spec. This test is
-- only required for subprograms that come from source.
if Nkind (Parent (N)) = N_Subunit
@@ -2626,8 +2630,8 @@
if not Conformant then
- -- The stub was taken to be a new declaration. Indicate
- -- that it lacks a body.
+ -- The stub was taken to be a new declaration. Indicate that
+ -- it lacks a body.
Set_Has_Completion (Old_Id, False);
end if;
@@ -2651,7 +2655,7 @@
end if;
-- Ada 2005 (AI-262): In library subprogram bodies, after the analysis
- -- if its specification we have to install the private withed units.
+ -- of the specification we have to install the private withed units.
-- This holds for child units as well.
if Is_Compilation_Unit (Body_Id)
@@ -2763,8 +2767,8 @@
if Present (Last_Real_Spec_Entity) then
- -- No body entities (happens when the only real spec entities
- -- come from precondition and postcondition pragmas)
+ -- No body entities (happens when the only real spec entities come
+ -- from precondition and postcondition pragmas).
if No (Last_Entity (Body_Id)) then
Set_First_Entity
@@ -2781,8 +2785,8 @@
Set_Last_Entity (Body_Id, Last_Entity (Spec_Id));
Set_Last_Entity (Spec_Id, Last_Real_Spec_Entity);
- -- Case where there are no spec entities, in this case there can
- -- be no body entities either, so just move everything.
+ -- Case where there are no spec entities, in this case there can be
+ -- no body entities either, so just move everything.
else
pragma Assert (No (Last_Entity (Body_Id)));
@@ -2804,7 +2808,7 @@
-- might be the following common idiom for a stubbed function:
-- statement of the procedure raises an exception. In particular this
-- deals with the common idiom of a stubbed function, which might
- -- appear as something like
+ -- appear as something like:
-- function F (A : Integer) return Some_Type;
-- X : Some_Type;