From: Eric Botcazou Date: Thu, 20 Oct 2011 10:56:08 +0000 (+0000) Subject: back_end.adb (Call_Back_End): Pass the maximum logical line number instead of the... X-Git-Tag: releases/gcc-4.7.0~2956 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b7562769594e07afe277cd93bff32740c79522f5;p=thirdparty%2Fgcc.git back_end.adb (Call_Back_End): Pass the maximum logical line number instead of the maximum physical line... * back_end.adb (Call_Back_End): Pass the maximum logical line number instead of the maximum physical line number to gigi. * gcc-interface/trans.c (Sloc_to_locus): Cope with line zero. From-SVN: r180242 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index ff41f8e5f1aa..8b0c58a2258c 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2011-10-20 Eric Botcazou + + * back_end.adb (Call_Back_End): Pass the maximum logical line number + instead of the maximum physical line number to gigi. + * gcc-interface/trans.c (Sloc_to_locus): Cope with line zero. + 2011-10-16 Tom Tromey Dodji Seketeli diff --git a/gcc/ada/back_end.adb b/gcc/ada/back_end.adb index a089f3862c4a..b6ad263c232d 100644 --- a/gcc/ada/back_end.adb +++ b/gcc/ada/back_end.adb @@ -114,9 +114,13 @@ package body Back_End is return; end if; + -- The back end needs to know the maximum line number that can appear + -- in a Sloc, in other words the maximum logical line number. + for J in 1 .. Last_Source_File loop File_Info_Array (J).File_Name := Full_Debug_Name (J); - File_Info_Array (J).Num_Source_Lines := Num_Source_Lines (J); + File_Info_Array (J).Num_Source_Lines := + Nat (Physical_To_Logical (Last_Source_Line (J), J)); end loop; if Generate_SCIL then diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 69c66d1b1507..ba47a7e373eb 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -8393,6 +8393,10 @@ Sloc_to_locus (Source_Ptr Sloc, location_t *locus) Column_Number column = Get_Column_Number (Sloc); struct line_map *map = LINEMAPS_ORDINARY_MAP_AT (line_table, file - 1); + /* We can have zero if pragma Source_Reference is in effect. */ + if (line < 1) + line = 1; + /* Translate the location. */ *locus = linemap_position_for_line_and_column (map, line, column); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 709fae4848c4..654beee233e5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-10-20 Eric Botcazou + + * gnat.dg/source_ref1.adb: New test. + * gnat.dg/source_ref2.adb: Likewise. + 2011-10-19 Paolo Carlini PR c++/13657 diff --git a/gcc/testsuite/gnat.dg/source_ref1.adb b/gcc/testsuite/gnat.dg/source_ref1.adb new file mode 100644 index 000000000000..fd450cc45dbb --- /dev/null +++ b/gcc/testsuite/gnat.dg/source_ref1.adb @@ -0,0 +1,6 @@ +pragma Source_Reference (3, "p1.adb"); + +procedure Source_Ref1 is +begin + null; +end; diff --git a/gcc/testsuite/gnat.dg/source_ref2.adb b/gcc/testsuite/gnat.dg/source_ref2.adb new file mode 100644 index 000000000000..cc2d57655e2d --- /dev/null +++ b/gcc/testsuite/gnat.dg/source_ref2.adb @@ -0,0 +1,7 @@ +pragma Source_Reference (1, "p2.adb"); + +procedure Source_Ref2 is +pragma Source_Reference (2, "p2.adb"); +begin + null; +end;