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:
parent
35f29cfe9f
commit
28e5c45bd5
1 changed files with 20 additions and 0 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue