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
This commit is contained in:
Mike Gulick 2018-11-27 15:49:43 +00:00 committed by David Malcolm
parent f316c3e5a7
commit 56c79e7f5d
2 changed files with 30 additions and 9 deletions

View File

@ -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".

View File

@ -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++;