OSDN Git Service

libcpp:
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 21 Feb 2009 21:25:39 +0000 (21:25 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 21 Feb 2009 21:25:39 +0000 (21:25 +0000)
* lex.c (lex_string): Return a CPP_LESS token for missing '>' in a
header name.
(_cpp_lex_direct): Handle this.

gcc/testsuite:
* gcc.dg/cpp/include4.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@144361 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/include4.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/lex.c

index 160b9f6..1d2db2e 100644 (file)
@@ -1,3 +1,7 @@
+2009-02-21  Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.dg/cpp/include4.c: New test.
+
 2008-02-21  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/39256
diff --git a/gcc/testsuite/gcc.dg/cpp/include4.c b/gcc/testsuite/gcc.dg/cpp/include4.c
new file mode 100644 (file)
index 0000000..d5e7fee
--- /dev/null
@@ -0,0 +1,14 @@
+/* Preprocessing tokens are always formed according to a greedy algorithm,
+   so "#include <stddef.h" must be interpreted as a sequence of tokens,
+   of which the "h" then gets macro expanded.  Likewise the other
+   examples.  */
+
+#define h h>
+#include <stddef.h
+#undef h
+
+#define foo stddef.h>
+#include <foo
+
+#include <foo /*
+> */
index f84aab3..d86092b 100644 (file)
@@ -1,3 +1,9 @@
+2009-02-21  Joseph Myers  <joseph@codesourcery.com>
+
+       * lex.c (lex_string): Return a CPP_LESS token for missing '>' in a
+       header name.
+       (_cpp_lex_direct): Handle this.
+
 2009-02-15  Richard Guenther  <rguenther@suse.de>
 
        Revert last change.
index 96d1a99..452e8ea 100644 (file)
@@ -613,7 +613,9 @@ create_literal (cpp_reader *pfile, cpp_token *token, const uchar *base,
 /* Lexes a string, character constant, or angle-bracketed header file
    name.  The stored string contains the spelling, including opening
    quote and leading any leading 'L', 'u' or 'U'.  It returns the type
-   of the literal, or CPP_OTHER if it was not properly terminated.
+   of the literal, or CPP_OTHER if it was not properly terminated, or
+   CPP_LESS for an unterminated header name which must be relexed as
+   normal tokens.
 
    The spelling is NUL-terminated, but it is not guaranteed that this
    is the first NUL since embedded NULs are preserved.  */
@@ -652,6 +654,14 @@ lex_string (cpp_reader *pfile, cpp_token *token, const uchar *base)
       else if (c == '\n')
        {
          cur--;
+         /* Unmatched quotes always yield undefined behavior, but
+            greedy lexing means that what appears to be an unterminated
+            header name may actually be a legitimate sequence of tokens.  */
+         if (terminator == '>')
+           {
+             token->type = CPP_LESS;
+             return;
+           }
          type = CPP_OTHER;
          break;
        }
@@ -1181,7 +1191,8 @@ _cpp_lex_direct (cpp_reader *pfile)
       if (pfile->state.angled_headers)
        {
          lex_string (pfile, result, buffer->cur - 1);
-         break;
+         if (result->type != CPP_LESS)
+           break;
        }
 
       result->type = CPP_LESS;