aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2019-09-05 11:23:48 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2019-09-05 11:23:48 +0000
commit056f95ec951178a110b57e58a2ee434907de2e38 (patch)
treea8e6ad6be4a477e263294cb8c34feef8df71253e /libcpp
parente7414688f16c4c9db2dacbc31da683887b4ba1bd (diff)
downloadgcc-056f95ec951178a110b57e58a2ee434907de2e38.zip
gcc-056f95ec951178a110b57e58a2ee434907de2e38.tar.gz
gcc-056f95ec951178a110b57e58a2ee434907de2e38.tar.bz2
[preprocessor/91639] #includes at EOF
https://gcc.gnu.org/ml/gcc-patches/2019-09/msg00280.html libcpp/ PR preprocessor/91639 * directives.c (do_include_common): Tell lexer we're a #include. * files.c (_cpp_stack_file): Lexer will have always incremented. * internal.h (struct cpp_context): Extend in_directive's semantics. * lex.c (_cpp_lex_direct): Increment line for final \n when lexing for an ISO #include. * line-map.c (linemap_line_start): Remember if we overflowed. gcc/testsuite/ PR preprocessor/91639 * c-c++-common/cpp/pr91639.c: New. * c-c++-common/cpp/pr91639-one.h: New. * c-c++-common/cpp/pr91639-two.h: New. From-SVN: r275402
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/ChangeLog11
-rw-r--r--libcpp/directives.c4
-rw-r--r--libcpp/files.c29
-rw-r--r--libcpp/internal.h3
-rw-r--r--libcpp/lex.c8
-rw-r--r--libcpp/line-map.c6
6 files changed, 39 insertions, 22 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 6791b36..c418d75 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,14 @@
+2019-09-05 Nathan Sidwell <nathan@acm.org>
+
+ PR preprocessor/91639
+ * directives.c (do_include_common): Tell lexer we're a #include.
+ * files.c (_cpp_stack_file): Lexer will have always incremented.
+ * internal.h (struct cpp_context): Extend in_directive's
+ semantics.
+ * lex.c (_cpp_lex_direct): Increment line for final \n when lexing
+ for an ISO #include.
+ * line-map.c (linemap_line_start): Remember if we overflowed.
+
2019-09-03 Ulrich Weigand <uweigand@de.ibm.com>
* directives.c: Remove references to spu from comments.
diff --git a/libcpp/directives.c b/libcpp/directives.c
index 29d21ed..1c6b31e 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -818,6 +818,10 @@ do_include_common (cpp_reader *pfile, enum include_type type)
callback can dump comments which follow #include. */
pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
+ /* Tell the lexer this is an include directive -- we want it to
+ increment the line number even if this is the last line of a file. */
+ pfile->state.in_directive = 2;
+
fname = parse_include (pfile, &angle_brackets, &buf, &location);
if (!fname)
goto done;
diff --git a/libcpp/files.c b/libcpp/files.c
index ee31aff..aa77dc7 100644
--- a/libcpp/files.c
+++ b/libcpp/files.c
@@ -938,25 +938,16 @@ _cpp_stack_file (cpp_reader *pfile, _cpp_file *file, include_type type,
pfile->mi_valid = true;
pfile->mi_cmacro = 0;
- /* Compensate for the increment in linemap_add that occurs when in
- do_file_change. 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. */
- bool decremented = false;
- if (file->pchname == NULL && file->err_no == 0 && type < IT_DIRECTIVE_HWM)
- {
- decremented = (pfile->line_table->highest_line
- == pfile->line_table->highest_location);
- if (decremented)
- pfile->line_table->highest_location--;
- }
+ /* In the case of a normal #include, we're now 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.
+
+ This does not apply if we found a PCH file, we're not a regular
+ include, or we ran out of locations. */
+ if (file->pchname == NULL
+ && type < IT_DIRECTIVE_HWM
+ && pfile->line_table->highest_location != LINE_MAP_MAX_LOCATION - 1)
+ pfile->line_table->highest_location--;
/* Add line map and do callbacks. */
_cpp_do_file_change (pfile, LC_ENTER, file->path, 1, sysp);
diff --git a/libcpp/internal.h b/libcpp/internal.h
index d4768ae..f9bcd37 100644
--- a/libcpp/internal.h
+++ b/libcpp/internal.h
@@ -234,7 +234,8 @@ struct cpp_context
struct lexer_state
{
- /* Nonzero if first token on line is CPP_HASH. */
+ /* 1 if we're handling a directive. 2 if it's an include-like
+ directive. */
unsigned char in_directive;
/* Nonzero if in a directive that will handle padding tokens itself.
diff --git a/libcpp/lex.c b/libcpp/lex.c
index 16ded6e..52e5bce 100644
--- a/libcpp/lex.c
+++ b/libcpp/lex.c
@@ -2771,7 +2771,13 @@ _cpp_lex_direct (cpp_reader *pfile)
goto skipped_white;
case '\n':
- if (buffer->cur < buffer->rlimit)
+ /* Increment the line, unless this is the last line ... */
+ if (buffer->cur < buffer->rlimit
+ /* ... or this is a #include, (where _cpp_stack_file needs to
+ unwind by one line) ... */
+ || (pfile->state.in_directive > 1
+ /* ... except traditional-cpp increments this elsewhere. */
+ && !CPP_OPTION (pfile, traditional)))
CPP_INCREMENT_LINE (pfile, 0);
buffer->need_line = true;
goto fresh_line;
diff --git a/libcpp/line-map.c b/libcpp/line-map.c
index 572d7f4..d6924eb 100644
--- a/libcpp/line-map.c
+++ b/libcpp/line-map.c
@@ -764,7 +764,11 @@ linemap_line_start (line_maps *set, linenum_type to_line,
/* Locations of ordinary tokens are always lower than locations of
macro tokens. */
if (r >= LINE_MAP_MAX_LOCATION)
- return 0;
+ {
+ /* Remember we overflowed. */
+ set->highest_line = set->highest_location = LINE_MAP_MAX_LOCATION - 1;
+ return 0;
+ }
set->highest_line = r;
if (r > set->highest_location)