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:
parent
8e361f234b
commit
4bb09c26bc
|
@ -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
|
||||||
|
|
|
@ -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 /*
|
||||||
|
> */
|
|
@ -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.
|
||||||
|
|
15
libcpp/lex.c
15
libcpp/lex.c
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue