+2019-08-19 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_warn.adb (Check_References, Generic_Body_Formal): When a
+ formal parameter of a generic subprogram is not referenced in
+ the body, place the corresponding warning on the corresponding
+ entity in the specification of the generic body, as is done for
+ non-generic subprograms.
+
2019-08-19 Bob Duff <duff@adacore.com>
* errout.ads (Size_Too_Small_Message): New constant.
-- 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
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 --
---------------------------------
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;
--- /dev/null
+-- { 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;