diff options
author | Mike Gulick <mgulick@mathworks.com> | 2018-11-27 15:49:43 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2018-11-27 15:49:43 +0000 |
commit | 56c79e7f5d21660c2e16b2e17d5b48d1df10d92f (patch) | |
tree | badad3254b640aae0b59b521d6190bfd33070b20 /libcpp | |
parent | f316c3e5a7b07e558a62fec06a81e555f8d35185 (diff) | |
download | gcc-56c79e7f5d21660c2e16b2e17d5b48d1df10d92f.zip gcc-56c79e7f5d21660c2e16b2e17d5b48d1df10d92f.tar.gz gcc-56c79e7f5d21660c2e16b2e17d5b48d1df10d92f.tar.bz2 |
PR preprocessor/83173: Additional check before decrementing highest_location
2018-11-27 Mike Gulick <mgulick@mathworks.com>
PR preprocessor/83173
* files.c (_cpp_stack_include): Check if
line_table->highest_location is past current line before
decrementing.
From-SVN: r266516
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/ChangeLog | 7 | ||||
-rw-r--r-- | libcpp/files.c | 32 |
2 files changed, 30 insertions, 9 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 575f18e..71fc213 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,10 @@ +2018-11-27 Mike Gulick <mgulick@mathworks.com> + + PR preprocessor/83173 + * files.c (_cpp_stack_include): Check if + line_table->highest_location is past current line before + decrementing. + 2018-11-13 David Malcolm <dmalcolm@redhat.com> * charset.c: Replace "source_location" with "location_t". diff --git a/libcpp/files.c b/libcpp/files.c index 3771fad..fe80e84 100644 --- a/libcpp/files.c +++ b/libcpp/files.c @@ -1012,6 +1012,7 @@ _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets, struct cpp_dir *dir; _cpp_file *file; bool stacked; + bool decremented = false; /* For -include command-line flags we have type == IT_CMDLINE. When the first -include file is processed we have the case, where @@ -1035,20 +1036,33 @@ _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets, return false; /* Compensate for the increment in linemap_add that occurs if - _cpp_stack_file actually stacks the file. In the case of a - normal #include, we're currently at the start of the line - *following* the #include. A separate location_t for this - location makes no sense (until we do the LC_LEAVE), and - complicates LAST_SOURCE_LINE_LOCATION. This does not apply if we - found a PCH file (in which case linemap_add is not called) or we - were included from the command-line. */ + _cpp_stack_file actually stacks the file. In the case of a normal + #include, we're currently at the start of the line *following* the + #include. A separate location_t for this location makes no + sense (until we do the LC_LEAVE), and complicates + LAST_SOURCE_LINE_LOCATION. This does not apply if we found a PCH + file (in which case linemap_add is not called) or we were included + from the command-line. In the case that the #include is the last + line in the file, highest_location still points to the current + line, not the start of the next line, so we do not decrement in + this case. See plugin/location-overflow-test-pr83173.h for an + example. */ if (file->pchname == NULL && file->err_no == 0 && type != IT_CMDLINE && type != IT_DEFAULT) - pfile->line_table->highest_location--; + { + int highest_line = linemap_get_expansion_line (pfile->line_table, + pfile->line_table->highest_location); + int source_line = linemap_get_expansion_line (pfile->line_table, loc); + if (highest_line > source_line) + { + pfile->line_table->highest_location--; + decremented = true; + } + } stacked = _cpp_stack_file (pfile, file, type == IT_IMPORT, loc); - if (!stacked) + if (decremented && !stacked) /* _cpp_stack_file didn't stack the file, so let's rollback the compensation dance we performed above. */ pfile->line_table->highest_location++; |