[Ada] Incorrect source line range on subprogram body with contract

2020-06-04  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* sinput.adb (Sloc_Range): Ignore node in the tree if it appears
	in a unit different from that of the node whose Sloc range we
	are computing. This is necessary when computing the source range
	of a subprogram body whose declaration includes a pre- or
	postcondition, because declaration and body may appear in
	different units, and the expanded code for the body includes
	copies of the contract code.
This commit is contained in:
Ed Schonberg 2020-01-23 11:00:46 -05:00 committed by Pierre-Marie de Rodat
parent 593627b456
commit 0b27ccce08

View File

@ -937,6 +937,8 @@ package body Sinput is
procedure Sloc_Range (N : Node_Id; Min, Max : out Source_Ptr) is
Indx : constant Source_File_Index := Get_Source_File_Index (Sloc (N));
function Process (N : Node_Id) return Traverse_Result;
-- Process function for traversing the node tree
@ -950,6 +952,14 @@ package body Sinput is
Orig : constant Node_Id := Original_Node (N);
begin
-- Skip nodes that may have been added during expansion and
-- that originate in other units, such as code for contracts
-- in subprogram bodies.
if Get_Source_File_Index (Sloc (Orig)) /= Indx then
return Skip;
end if;
if Sloc (Orig) < Min then
if Sloc (Orig) > No_Location then
Min := Sloc (Orig);