On 29-03-2025 03:50, Jason Merrill wrote:
CAUTION: This email comes from a non Wind River email account!
Do not click links or open attachments unless you recognize the sender and know the content is safe.

On 3/28/25 3:54 AM, yash.shi...@windriver.com wrote:
From: Jeremy Bettis <jbet...@google.com>

This patch addresses an issue in the C preprocessor where incorrect
line number information is generated when processing files with a
large number of lines. The problem arises from improper handling
of location intervals in the line map, particularly when locations
exceed LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES.

By ensuring that the highest location is not decremented if it
would move to a different ordinary map, this fix resolves
the line number discrepancies observed in certain test cases.
This change improves the accuracy of line number reporting, benefiting
users relying on precise code coverage and debugging information.

Pushed, thanks.

Thanks for pushing the fix.
I believe this fix will be included in GCC-15 release.
Could you kindly confirm?

(PS: I have submitted a PR to backport the fix in gcc-14 release branch.
https://gcc.gnu.org/pipermail/gcc-patches/2025-April/680142.html)

Regards,
Yash.
libcpp/ChangeLog:

      PR preprocessor/108900
      * files.cc (_cpp_stack_file): Do not decrement highest_location
      across distinct maps.

Signed-off-by: Jeremy Bettis <jbet...@google.com>
Signed-off-by: Yash Shinde <yash.shi...@windriver.com>
---
  libcpp/files.cc | 9 +++++++++
  1 file changed, 9 insertions(+)

diff --git a/libcpp/files.cc b/libcpp/files.cc
index 1ed19c5555a..c1abde6639f 100644
--- a/libcpp/files.cc
+++ b/libcpp/files.cc
@@ -1046,6 +1046,15 @@ _cpp_stack_file (cpp_reader *pfile, _cpp_file *file, include_type type,
                  && type < IT_DIRECTIVE_HWM
                  && (pfile->line_table->highest_location
                      != LINE_MAP_MAX_LOCATION - 1));
+
+  if (decrement && LINEMAPS_ORDINARY_USED (pfile->line_table))
+    {
+      const line_map_ordinary *map
+     = LINEMAPS_LAST_ORDINARY_MAP (pfile->line_table);
+      if (map && map->start_location == pfile->line_table->highest_location)
+     decrement = false;
+    }
+
    if (decrement)
      pfile->line_table->highest_location--;


Reply via email to