aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorMike Gulick <mgulick@mathworks.com>2018-11-27 15:49:43 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2018-11-27 15:49:43 +0000
commit56c79e7f5d21660c2e16b2e17d5b48d1df10d92f (patch)
treebadad3254b640aae0b59b521d6190bfd33070b20 /libcpp
parentf316c3e5a7b07e558a62fec06a81e555f8d35185 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--libcpp/files.c32
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++;