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)

Reply via email to