ada: Adjust locations in aspects on generic formal subprograms

When instantiating a generic that has formal subprogram parameter with
contracts, e.g.:

  generic
    with procedure P with Pre => ..., Post => ...;
  ...

we create a wrapper that executes Pre/Post contracts before/after
calling the actual subprogram. Errors emitted for these contracts
will now have locations of the instance and not just of the generic.

gcc/ada/

	* sem_ch12.adb (Build_Subprogram_Wrappers): Adjust slocs of the
	copied aspects, just like we do in Build_Class_Wide_Expression for
	inherited class-wide contracts.
This commit is contained in:
Piotr Trojanek 2022-10-28 22:15:53 +02:00 committed by Marc Poulhiès
parent 35f29cfe9f
commit 28e5c45bd5

View file

@ -1203,12 +1203,31 @@ package body Sem_Ch12 is
-------------------------------
procedure Build_Subprogram_Wrappers is
function Adjust_Aspect_Sloc (N : Node_Id) return Traverse_Result;
-- Adjust sloc so that errors located at N will be reported with
-- information about the instance and not just about the generic.
------------------------
-- Adjust_Aspect_Sloc --
------------------------
function Adjust_Aspect_Sloc (N : Node_Id) return Traverse_Result is
begin
Adjust_Instantiation_Sloc (N, S_Adjustment);
return OK;
end Adjust_Aspect_Sloc;
procedure Adjust_Aspect_Slocs is new
Traverse_Proc (Adjust_Aspect_Sloc);
Formal : constant Entity_Id :=
Defining_Unit_Name (Specification (Analyzed_Formal));
Aspect_Spec : Node_Id;
Decl_Node : Node_Id;
Actual_Name : Node_Id;
-- Start of processing for Build_Subprogram_Wrappers
begin
-- Create declaration for wrapper subprogram
-- The actual can be overloaded, in which case it will be
@ -1247,6 +1266,7 @@ package body Sem_Ch12 is
Aspect_Spec := First (Aspect_Specifications (Decl_Node));
while Present (Aspect_Spec) loop
Adjust_Aspect_Slocs (Aspect_Spec);
Set_Analyzed (Aspect_Spec, False);
Next (Aspect_Spec);
end loop;