On Tue, 6 May 2025, Jakub Jelinek wrote: > Hi! > > Here is the 14 branch version of the PR120061 fix I've just posted > for 16/15. > The differences from the earlier patch are all caused by the > 32-bit location_t on the branch instead of 64-bit location_t that > 16/15 has. > So, it needs 1 << whatever instead of loc_one << whatever in the > sources, and more importantly, in the testcases deal with different > cut off values. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for 14 branch? > Also tested with pre- r14-11679 14 branch, where I get > FAIL: gcc.dg/plugin/location-overflow-test-pr116047.c > -fplugin=./location_overflow_plugin.so scan-file > static_assert[^\n\r]*6[^\n\r]*== 6 > and with vanilla 14 branch I get > FAIL: gcc.dg/plugin/location-overflow-test-pr120061.c > -fplugin=./location_overflow_plugin.so scan-file > static_assert[^\n\r]*5[^\n\r]*== 5 > and with the patch on 14 branch I get all PASSes.
I have tested this by building the affected qt6-webengine package with the fix and the build now succeeds (as it did with the PR108900 patch reverted). I'm leaving approval to the more libcpp-savy people. Thanks for fixing this, Richard. > 2025-05-06 Jakub Jelinek <ja...@redhat.com> > > PR preprocessor/108900 > PR preprocessor/116047 > PR preprocessor/120061 > * files.cc (_cpp_stack_file): Revert 2025-03-28 change. > * line-map.cc (linemap_add): Use > SOURCE_LINE (from, linemap_included_from (map - 1)) + 1; instead of > SOURCE_LINE (from, from[1].start_location); to compute to_line > for LC_LEAVE if from[1].reason is LC_RENAME. For LC_ENTER > included_from computation, look at map[-2] or even lower if map[-1] > has the same start_location as map[0]. > > * gcc.dg/plugin/plugin.exp: Add location-overflow-test-pr116047.c > and location-overflow-test-pr120061.c. > * gcc.dg/plugin/location_overflow_plugin.c (plugin_init): Don't error > on unknown values, instead just break. > * gcc.dg/plugin/location-overflow-test-pr116047.c: New test. > * gcc.dg/plugin/location-overflow-test-pr116047-1.h: New test. > * gcc.dg/plugin/location-overflow-test-pr116047-2.h: New test. > * gcc.dg/plugin/location-overflow-test-pr120061.c: New test. > * gcc.dg/plugin/location-overflow-test-pr120061-1.h: New test. > * gcc.dg/plugin/location-overflow-test-pr120061-2.h: New test. > > --- libcpp/files.cc.jj 2025-05-03 11:02:02.502647404 +0200 > +++ libcpp/files.cc 2025-05-05 21:09:18.042680877 +0200 > @@ -1006,14 +1006,6 @@ _cpp_stack_file (cpp_reader *pfile, _cpp > && (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--; > > --- libcpp/line-map.cc.jj 2024-04-26 11:47:02.244168816 +0200 > +++ libcpp/line-map.cc 2025-05-06 00:57:23.488499702 +0200 > @@ -627,7 +627,10 @@ linemap_add (line_maps *set, enum lc_rea > if (to_file == NULL) > { > to_file = ORDINARY_MAP_FILE_NAME (from); > - to_line = SOURCE_LINE (from, from[1].start_location); > + if (from[1].reason == LC_RENAME) > + to_line = SOURCE_LINE (from, linemap_included_from (map - 1)) + 1; > + else > + to_line = SOURCE_LINE (from, from[1].start_location); > sysp = ORDINARY_MAP_IN_SYSTEM_HEADER_P (from); > } > else > @@ -657,11 +660,16 @@ linemap_add (line_maps *set, enum lc_rea > if (set->depth == 0) > map->included_from = 0; > else > - /* The location of the end of the just-closed map. */ > - map->included_from > - = (((map[0].start_location - 1 - map[-1].start_location) > - & ~((1 << map[-1].m_column_and_range_bits) - 1)) > - + map[-1].start_location); > + { > + /* The location of the end of the just-closed map. */ > + int i = -1; > + while (map[i].start_location == map[0].start_location) > + --i; > + map->included_from > + = (((map[0].start_location - 1 - map[i].start_location) > + & ~((1 << map[i].m_column_and_range_bits) - 1)) > + + map[i].start_location); > + } > set->depth++; > if (set->trace_includes) > trace_include (set, map); > --- gcc/testsuite/gcc.dg/plugin/plugin.exp.jj 2024-04-26 11:46:58.650218626 > +0200 > +++ gcc/testsuite/gcc.dg/plugin/plugin.exp 2025-05-06 10:01:10.543208267 > +0200 > @@ -126,7 +126,9 @@ set plugin_test_list [list \ > { location_overflow_plugin.c \ > location-overflow-test-1.c \ > location-overflow-test-2.c \ > - location-overflow-test-pr83173.c } \ > + location-overflow-test-pr83173.c \ > + location-overflow-test-pr116047.c \ > + location-overflow-test-pr120061.c } \ > { must_tail_call_plugin.c \ > must-tail-call-1.c \ > must-tail-call-2.c } \ > --- gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c.jj 2024-04-26 > 11:46:58.650218626 +0200 > +++ gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c 2025-05-06 > 10:01:23.602029841 +0200 > @@ -101,7 +101,7 @@ plugin_init (struct plugin_name_args *pl > break; > > default: > - error_at (UNKNOWN_LOCATION, "unrecognized value for plugin argument"); > + break; > } > > return 0; > --- gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c.jj > 2025-05-06 08:56:14.311445940 +0200 > +++ gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c > 2025-05-06 09:52:37.909212363 +0200 > @@ -0,0 +1,5 @@ > +/* PR preprocessor/116047 */ > +/* { dg-do preprocess } */ > +/* { dg-options "-nostdinc -std=c23 > -fplugin-arg-location_overflow_plugin-value=0x4fff8080" } */ > +#include "location-overflow-test-pr116047-1.h" > +/* { dg-final { scan-file location-overflow-test-pr116047.i > "static_assert\[^\n\r]\*6\[^\n\r]\*== 6" } } */ > --- gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h.jj > 2025-05-06 08:57:39.624279475 +0200 > +++ gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h > 2025-05-06 09:47:57.586042403 +0200 > @@ -0,0 +1,6 @@ > + > + > + > + > +#include "location-overflow-test-pr116047-2.h" > +static_assert (__LINE__ == 6, ""); > --- gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h.jj > 2025-05-06 08:57:52.869098384 +0200 > +++ gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h > 2025-05-05 12:27:34.907854863 +0200 > @@ -0,0 +1 @@ > +int i; > --- gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c.jj > 2025-05-06 09:49:58.153395094 +0200 > +++ gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c > 2025-05-06 09:55:41.382705568 +0200 > @@ -0,0 +1,6 @@ > +/* PR preprocessor/120061 */ > +/* { dg-do preprocess } */ > +/* { dg-options "-nostdinc -std=c23 > -fplugin-arg-location_overflow_plugin-value=0x61000000" } */ > +#include "location-overflow-test-pr120061-1.h" > +static_assert (__LINE__ == 5, ""); > +/* { dg-final { scan-file location-overflow-test-pr120061.i > "static_assert\[^\n\r]\*5\[^\n\r]\*== 5" } } */ > --- gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h.jj > 2025-05-06 08:57:39.624279475 +0200 > +++ gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h > 2025-05-06 09:55:48.417609451 +0200 > @@ -0,0 +1,6 @@ > + > + > + > + > +#include "location-overflow-test-pr120061-2.h" > + > --- gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h.jj > 2025-05-06 08:57:52.869098384 +0200 > +++ gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h > 2025-05-05 12:27:34.907854863 +0200 > @@ -0,0 +1 @@ > +int i; > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)