cpplib: EOF in pragmas
authorNathan Sidwell <nathan@acm.org>
Tue, 3 Nov 2020 17:06:09 +0000 (09:06 -0800)
committerNathan Sidwell <nathan@acm.org>
Tue, 3 Nov 2020 18:07:20 +0000 (10:07 -0800)
This patch moves the generation of PRAGMA_EOF earlier, to when we set
need_line, rather than when we try and get the next line.  It also
prevents peeking past a PRAGMA token.

libcpp/
* lex.c (cpp_peek_token): Do not peek past CPP_PRAGMA.
(_cpp_lex_direct): Handle EOF in pragma when setting need_line,
not when needing a line.

libcpp/lex.c

index 1d522030a3c76512a22c8b7119061a60fe853c1e..f58a88281245a8d79f59ae2048748869e95da16c 100644 (file)
@@ -2554,6 +2554,15 @@ cpp_peek_token (cpp_reader *pfile, int index)
          index--;
          break;
        }
+      else if (peektok->type == CPP_PRAGMA)
+       {
+         /* Don't peek past a pragma.  */
+         if (peektok == &pfile->directive_result)
+           /* Save the pragma in the buffer.  */
+           *pfile->cur_token++ = *peektok;
+         index--;
+         break;
+       }
     }
   while (index--);
 
@@ -2757,14 +2766,7 @@ _cpp_lex_direct (cpp_reader *pfile)
   buffer = pfile->buffer;
   if (buffer->need_line)
     {
-      if (pfile->state.in_deferred_pragma)
-       {
-         result->type = CPP_PRAGMA_EOL;
-         pfile->state.in_deferred_pragma = false;
-         if (!pfile->state.pragma_allow_expansion)
-           pfile->state.prevent_expansion--;
-         return result;
-       }
+      gcc_assert (!pfile->state.in_deferred_pragma);
       if (!_cpp_get_fresh_line (pfile))
        {
          result->type = CPP_EOF;
@@ -2829,6 +2831,19 @@ _cpp_lex_direct (cpp_reader *pfile)
              && !CPP_OPTION (pfile, traditional)))
        CPP_INCREMENT_LINE (pfile, 0);
       buffer->need_line = true;
+      if (pfile->state.in_deferred_pragma)
+       {
+         /* Produce the PRAGMA_EOL on this line.  File reading
+            ensures there is always a \n at end of the buffer, thus
+            in a deferred pragma we always see CPP_PRAGMA_EOL before
+            any CPP_EOF.  */
+         result->type = CPP_PRAGMA_EOL;
+         result->flags &= ~PREV_WHITE;
+         pfile->state.in_deferred_pragma = false;
+         if (!pfile->state.pragma_allow_expansion)
+           pfile->state.prevent_expansion--;
+         return result;
+       }
       goto fresh_line;
 
     case '0': case '1': case '2': case '3': case '4':