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> 2008-02-21 Uros Bizjak <ubizjak@gmail.com>
PR target/39256 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> 2009-02-15 Richard Guenther <rguenther@suse.de>
Revert last change. 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 /* 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)
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)
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;