(fortran@ readers: The full patch is at
http://gcc.gnu.org/ml/gcc-patches/2011-08/msg01927.html )
On 08/23/2011 08:43 PM, Dodji Seketeli wrote:
OK for trunk?
The Fortran part is OK. Thanks for the patch!
Tobias
gcc/fortran/
* scanner.c (load_file): Don't abuse LC_RENAME reason while
(indirectly) calling linemap_add.
[...]
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -1887,6 +1887,11 @@ load_file (const char *realfilename, const char
*displayedname, bool initial)
int len, line_len;
bool first_line;
const char *filename;
+ /* If realfilename and displayedname are different and non-null then
+ surely realfilename is the preprocessed form of
+ displayedname. */
+ bool preprocessed_p = (realfilename&& displayedname
+ && strcmp (realfilename, displayedname));
filename = displayedname ? displayedname : realfilename;
@@ -1925,9 +1930,24 @@ load_file (const char *realfilename, const char
*displayedname, bool initial)
}
}
- /* Load the file. */
+ /* Load the file.
- f = get_file (filename, initial ? LC_RENAME : LC_ENTER);
+ A "non-initial" file means a file that is being included. In
+ that case we are creating an LC_ENTER map.
+
+ An "initial" file means a main file; one that is not included.
+ That file has already got at least one (surely more) line map(s)
+ created by gfc_init. So the subsequent map created in that case
+ must have LC_RENAME reason.
+
+ This latter case is not true for a preprocessed file. In that
+ case, although the file is "initial", the line maps created by
+ gfc_init was used during the preprocessing of the file. Now that
+ the preprocessing is over and we are being fed the result of that
+ preprocessing, we need to create a brand new line map for the
+ preprocessed file, so the reason is going to be LC_ENTER. */
+
+ f = get_file (filename, (initial&& !preprocessed_p) ? LC_RENAME : LC_ENTER);
if (!initial)
add_file_change (f->filename, f->inclusion_line);
current_file = f;