From: Ed Schonberg Date: Thu, 23 Jan 2020 16:00:46 +0000 (-0500) Subject: [Ada] Incorrect source line range on subprogram body with contract X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0b27ccce0849ef93b95aebae12c8a0e77929810e;p=gcc.git [Ada] Incorrect source line range on subprogram body with contract 2020-06-04 Ed Schonberg 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. --- diff --git a/gcc/ada/sinput.adb b/gcc/ada/sinput.adb index 4c342d97a33..9f2669edb55 100644 --- a/gcc/ada/sinput.adb +++ b/gcc/ada/sinput.adb @@ -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);