As shown by Roger Orr in the comments of this PR, cpp_get_token can cause a reallocation that invalidates some of the variables in do_linemarker. It seems to occur in this call to linemap_add:

      /* Allocate the new line_map.  However, if the current map only has a
         single line we can sometimes just increase its column_bits instead. */
      if (line_delta < 0
          || last_line != ORDINARY_MAP_STARTING_LINE_NUMBER (map)
          || SOURCE_COLUMN (map, highest) >= (1U << column_bits)
          || range_bits < map->m_range_bits)
        map = linemap_check_ordinary
                (const_cast <line_map *>
                  (linemap_add (set, LC_RENAME,
                                ORDINARY_MAP_IN_SYSTEM_HEADER_P (map),
                                ORDINARY_MAP_FILE_NAME (map),
                                to_line)));

I'm still not very familiar with this code, but I believe with LC_RENAME we'll retain the right information in INCLUDED_FROM even if map changes.

I've put his patch, slightly adapted, through a bootstrap and test cycle on x86_64-linux. Ok to apply?


Bernd
	PR preprocessor/69650
	* directives.c (do_linemarker): Reread map after calling
	cpp_get_token.

Index: libcpp/directives.c
===================================================================
--- libcpp/directives.c	(revision 234831)
+++ libcpp/directives.c	(working copy)
@@ -1048,6 +1048,9 @@ do_linemarker (cpp_reader *pfile)
 
   if (reason == LC_LEAVE)
     {
+      /* Reread map since cpp_get_token can invalidate it with a
+	 reallocation.  */
+      map = LINEMAPS_LAST_ORDINARY_MAP (line_table);
       const line_map_ordinary *from;      
       if (MAIN_FILE_P (map)
 	  || (new_file
@@ -1055,7 +1058,8 @@ do_linemarker (cpp_reader *pfile)
 	      && filename_cmp (ORDINARY_MAP_FILE_NAME (from), new_file) != 0))
 	{
 	  cpp_warning (pfile, CPP_W_NONE,
-		     "file \"%s\" linemarker ignored due to incorrect nesting", new_file);
+		       "file \"%s\" linemarker ignored due to "
+		       "incorrect nesting", new_file);
 	  return;
 	}
     }

Reply via email to