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
This commit is contained in:
Joseph Myers 2009-02-21 21:25:39 +00:00 committed by Joseph Myers
parent 8e361f234b
commit 4bb09c26bc
4 changed files with 37 additions and 2 deletions

View 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

View File

@ -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 /*
> */

View 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.

View 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;