mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-08 15:42:07 +08:00
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>
|
||||
|
||||
PR target/39256
|
||||
|
14
gcc/testsuite/gcc.dg/cpp/include4.c
Normal file
14
gcc/testsuite/gcc.dg/cpp/include4.c
Normal 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 /*
|
||||
> */
|
@ -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.
|
||||
|
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
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user