charset.c (_cpp_valid_ucn): In identifiers, reject a partial UCN rather than printing an error.

2005-03-15  Geoffrey Keating  <geoffk@apple.com>

	* charset.c (_cpp_valid_ucn): In identifiers, reject a partial
	UCN rather than printing an error.

Index: gcc/testsuite/ChangeLog
2005-03-15  Geoffrey Keating  <geoffk@apple.com>

	* gcc.dg/cpp/ucnid-7.c: New.

From-SVN: r96546
This commit is contained in:
Geoffrey Keating 2005-03-16 00:59:31 +00:00 committed by Geoffrey Keating
parent 2532808d17
commit c79e602b63
4 changed files with 22 additions and 4 deletions

View File

@ -1,3 +1,7 @@
2005-03-15 Geoffrey Keating <geoffk@apple.com>
* gcc.dg/cpp/ucnid-7.c: New.
2005-03-15 Janis Johnson <janis187@us.ibm.com>
Dorit Naishlos <dorit@il.ibm.com>

View File

@ -0,0 +1,5 @@
/* { dg-do compile } */
/* { dg-options "-std=c99" } */
#define a b(
#define b(x) q
int a\U0000000z );

View File

@ -1,3 +1,8 @@
2005-03-15 Geoffrey Keating <geoffk@apple.com>
* charset.c (_cpp_valid_ucn): In identifiers, reject a partial
UCN rather than printing an error.
2005-03-14 Geoffrey Keating <geoffk@apple.com>
* lex.c (forms_identifier_p): Disable UCNs in C89 mode.

View File

@ -923,9 +923,8 @@ ucn_valid_in_identifier (cpp_reader *pfile, cppchar_t c,
program is ill-formed.
*PSTR must be preceded by "\u" or "\U"; it is assumed that the
buffer end is delimited by a non-hex digit. Returns zero if UCNs
are not part of the relevant standard, or if the string beginning
at *PSTR doesn't syntactically match the form 'NNNN' or 'NNNNNNNN'.
buffer end is delimited by a non-hex digit. Returns zero if the
UCN has not been consumed.
Otherwise the nonzero value of the UCN, whether valid or invalid,
is returned. Diagnostics are emitted for invalid values. PSTR
@ -974,10 +973,15 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
}
while (--length && str < limit);
/* Partial UCNs are not valid in strings, but decompose into
multiple tokens in identifiers, so we can't give a helpful
error message in that case. */
if (length && identifier_pos)
return 0;
*pstr = str;
if (length)
{
/* We'll error when we try it out as the start of an identifier. */
cpp_error (pfile, CPP_DL_ERROR,
"incomplete universal character name %.*s",
(int) (str - base), base);