@@ -818,6 +818,14 @@ package body Sem_Warn is
-- For an entry formal entity from an entry declaration, find the
-- corresponding body formal from the given accept statement.
+ function Generic_Body_Formal (E : Entity_Id) return Entity_Id;
+ -- Warnings on unused formals of subprograms are placed on the entity
+ -- in the subprogram body, which seems preferable because it suggests
+ -- a better codefix for GPS. The analysis of generic subprogram bodies
+ -- uses a different circuitry, so the choice for the proper placement
+ -- of the warning in the generic case takes place here, by finding the
+ -- body entity that corresponds to a formal in a spec.
+
procedure May_Need_Initialized_Actual (Ent : Entity_Id);
-- If an entity of a generic type has default initialization, then the
-- corresponding actual type should be fully initialized, or else there
@@ -876,6 +884,35 @@ package body Sem_Warn is
raise Program_Error;
end Body_Formal;
+ -------------------------
+ -- Generic_Body_Formal --
+ -------------------------
+
+ function Generic_Body_Formal (E : Entity_Id) return Entity_Id is
+ Gen_Decl : constant Node_Id := Unit_Declaration_Node (Scope (E));
+ Gen_Body : constant Entity_Id := Corresponding_Body (Gen_Decl);
+ Form : Entity_Id;
+
+ begin
+ if No (Gen_Body) then
+ return E;
+
+ else
+ Form := First_Entity (Gen_Body);
+ while Present (Form) loop
+ if Chars (Form) = Chars (E) then
+ return Form;
+ end if;
+
+ Next_Entity (Form);
+ end loop;
+ end if;
+
+ -- Should never fall through, should always find a match
+
+ raise Program_Error;
+ end Generic_Body_Formal;
+
---------------------------------
-- May_Need_Initialized_Actual --
---------------------------------
@@ -1688,7 +1725,15 @@ package body Sem_Warn is
elsif not Warnings_Off_E1
and then not Has_Junk_Name (E1)
then
- Unreferenced_Entities.Append (E1);
+ if Is_Formal (E1)
+ and then Nkind (Unit_Declaration_Node (Scope (E1)))
+ = N_Generic_Subprogram_Declaration
+ then
+ Unreferenced_Entities.Append
+ (Generic_Body_Formal (E1));
+ else
+ Unreferenced_Entities.Append (E1);
+ end if;
end if;
end if;
new file mode 100644
@@ -0,0 +1,36 @@
+-- { dg-do compile }
+-- { dg-options "-gnatwa" }
+
+package body Warn28 is
+
+ function Id (X : Integer) return Integer is (2 * X);
+
+ procedure TheProcedure1 (TheParameter : in Integer)
+ is
+ X : Integer;
+ begin
+
+ X := Id (TheParameter);
+ if X < 3 then
+ X := X ** 3;
+ end if;
+ end TheProcedure1;
+
+ procedure Junk (It : Integer) is -- { dg-warning "formal parameter \"It\" is not referenced" }
+ X : Integer := Id (34);
+ begin
+ if X < 3 then
+ X := X ** 3;
+ end if;
+ end;
+
+ procedure TheProcedure (TheParameter : in Integer) -- { dg-warning "formal parameter \"TheParameter\" is not referenced" }
+ is
+
+ begin
+
+ null;
+
+ end TheProcedure;
+
+end Warn28;
new file mode 100644
@@ -0,0 +1,9 @@
+package Warn28 is
+
+ procedure TheProcedure1 (TheParameter : in Integer);
+ procedure Junk (It : Integer);
+
+ generic
+ procedure TheProcedure (TheParameter : in Integer);
+
+end Warn28;