Commit 4bb09c26 by Joseph Myers Committed by Joseph Myers

lex.c (lex_string): Return a CPP_LESS token for missing '>' in a header name.

libcpp:
	* 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.

From-SVN: r144361
parent 8e361f23
2009-02-21 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/cpp/include4.c: New test.
2008-02-21 Uros Bizjak <ubizjak@gmail.com> 2008-02-21 Uros Bizjak <ubizjak@gmail.com>
PR target/39256 PR target/39256
......
/* 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 /*
> */
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> 2009-02-15 Richard Guenther <rguenther@suse.de>
Revert last change. Revert last change.
......
...@@ -613,7 +613,9 @@ create_literal (cpp_reader *pfile, cpp_token *token, const uchar *base, ...@@ -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 /* Lexes a string, character constant, or angle-bracketed header file
name. The stored string contains the spelling, including opening name. The stored string contains the spelling, including opening
quote and leading any leading 'L', 'u' or 'U'. It returns the type 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 The spelling is NUL-terminated, but it is not guaranteed that this
is the first NUL since embedded NULs are preserved. */ is the first NUL since embedded NULs are preserved. */
...@@ -652,6 +654,14 @@ lex_string (cpp_reader *pfile, cpp_token *token, const uchar *base) ...@@ -652,6 +654,14 @@ lex_string (cpp_reader *pfile, cpp_token *token, const uchar *base)
else if (c == '\n') else if (c == '\n')
{ {
cur--; 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; type = CPP_OTHER;
break; break;
} }
...@@ -1181,7 +1191,8 @@ _cpp_lex_direct (cpp_reader *pfile) ...@@ -1181,7 +1191,8 @@ _cpp_lex_direct (cpp_reader *pfile)
if (pfile->state.angled_headers) if (pfile->state.angled_headers)
{ {
lex_string (pfile, result, buffer->cur - 1); lex_string (pfile, result, buffer->cur - 1);
break; if (result->type != CPP_LESS)
break;
} }
result->type = CPP_LESS; result->type = CPP_LESS;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment