Commit af15a2fe by Joseph Myers Committed by Joseph Myers

c.opt (fextended-identifiers): New.

gcc:
	* c.opt (fextended-identifiers): New.
	* c-opts.c (c_common_handle_option): Handle
	-fextended-identifiers.
	* doc/cpp.texi: Update documentation of extended identifiers.
	* doc/cppopts.texi (-fextended-identifiers): Document.

gcc/testsuite:
	* g++.dg/cpp/ucnid-1.C, g++.dg/cpp/normalize-1.C,
	g++.dg/other/ucnid-1.C, gcc.dg/cpp/normalize-1.c,
	gcc.dg/cpp/normalize-2.c, gcc.dg/cpp/normalize-3.c,
	gcc.dg/cpp/normalize-4.c, gcc.dg/cpp/ucnid-1.c,
	gcc.dg/cpp/ucnid-2.c, gcc.dg/cpp/ucnid-3.c, gcc.dg/cpp/ucnid-4.c,
	gcc.dg/cpp/ucnid-5.c, gcc.dg/cpp/ucnid-7.c,gcc.dg/ucnid-1.c,
	gcc.dg/ucnid-2.c, gcc.dg/ucnid-3.c, gcc.dg/ucnid-4.c,
	gcc.dg/ucnid-5.c, gcc.dg/ucnid-6.c: Add -fextended-identifiers.
	* gcc.dg/cpp/ucnid-8.c: New test.

libcpp:
	* include/cpplib.h (struct cpp_options): Add extended_identifiers.
	* init.c (struct lang_flags, lang_defaults): Add
	extended_identifiers.
	(cpp_set_lang): Use it.
	* lex.c (forms_identifier_p): Check extended_identifiers.

From-SVN: r104462
parent 6fff2603
2005-09-20 Joseph S. Myers <joseph@codesourcery.com>
* c.opt (fextended-identifiers): New.
* c-opts.c (c_common_handle_option): Handle
-fextended-identifiers.
* doc/cpp.texi: Update documentation of extended identifiers.
* doc/cppopts.texi (-fextended-identifiers): Document.
2005-09-20 Jakub Jelinek <jakub@redhat.com> 2005-09-20 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/23929 PR tree-optimization/23929
......
...@@ -647,6 +647,10 @@ c_common_handle_option (size_t scode, const char *arg, int value) ...@@ -647,6 +647,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
flag_enforce_eh_specs = value; flag_enforce_eh_specs = value;
break; break;
case OPT_fextended_identifiers:
cpp_opts->extended_identifiers = value;
break;
case OPT_ffixed_form: case OPT_ffixed_form:
case OPT_ffixed_line_length_: case OPT_ffixed_line_length_:
/* Fortran front end options ignored when preprocessing only. */ /* Fortran front end options ignored when preprocessing only. */
......
...@@ -495,6 +495,10 @@ fexec-charset= ...@@ -495,6 +495,10 @@ fexec-charset=
C ObjC C++ ObjC++ Joined RejectNegative C ObjC C++ ObjC++ Joined RejectNegative
-fexec-charset=<cset> Convert all strings and character constants to character set <cset> -fexec-charset=<cset> Convert all strings and character constants to character set <cset>
fextended-identifiers
C ObjC C++ ObjC++
Permit universal character names (\\u and \\U) in identifiers
finput-charset= finput-charset=
C ObjC C++ ObjC++ Joined RejectNegative C ObjC C++ ObjC++ Joined RejectNegative
-finput-charset=<cset> Specify the default character set for source files -finput-charset=<cset> Specify the default character set for source files
......
...@@ -281,11 +281,11 @@ the character in the source character set that they represent, then ...@@ -281,11 +281,11 @@ the character in the source character set that they represent, then
converted to the execution character set, just like unescaped converted to the execution character set, just like unescaped
characters. characters.
Unless the experimental @option{-fextended-identifiers} option is used,
GCC does not permit the use of characters outside the ASCII range, nor GCC does not permit the use of characters outside the ASCII range, nor
@samp{\u} and @samp{\U} escapes, in identifiers. We hope this will @samp{\u} and @samp{\U} escapes, in identifiers. Even with that
change eventually, but there are problems with the standard semantics option, characters outside the ASCII range can only be specified with
of such ``extended identifiers'' which must be resolved through the the @samp{\u} and @samp{\U} escapes, not used directly in identifiers.
ISO C and C++ committees first.
@node Initial processing @node Initial processing
@section Initial processing @section Initial processing
...@@ -510,8 +510,10 @@ In the 1999 C standard, identifiers may contain letters which are not ...@@ -510,8 +510,10 @@ In the 1999 C standard, identifiers may contain letters which are not
part of the ``basic source character set'', at the implementation's part of the ``basic source character set'', at the implementation's
discretion (such as accented Latin letters, Greek letters, or Chinese discretion (such as accented Latin letters, Greek letters, or Chinese
ideograms). This may be done with an extended character set, or the ideograms). This may be done with an extended character set, or the
@samp{\u} and @samp{\U} escape sequences. GCC does not presently @samp{\u} and @samp{\U} escape sequences. The implementation of this
implement either feature in the preprocessor or the compiler. feature in GCC is experimental; such characters are only accepted in
the @samp{\u} and @samp{\U} forms and only if
@option{-fextended-identifiers} is used.
As an extension, GCC treats @samp{$} as a letter. This is for As an extension, GCC treats @samp{$} as a letter. This is for
compatibility with some systems, such as VMS, where @samp{$} is commonly compatibility with some systems, such as VMS, where @samp{$} is commonly
...@@ -3791,7 +3793,9 @@ character set may be controlled by the user, with the ...@@ -3791,7 +3793,9 @@ character set may be controlled by the user, with the
The C and C++ standards allow identifiers to be composed of @samp{_} The C and C++ standards allow identifiers to be composed of @samp{_}
and the alphanumeric characters. C++ and C99 also allow universal and the alphanumeric characters. C++ and C99 also allow universal
character names, and C99 further permits implementation-defined character names, and C99 further permits implementation-defined
characters. characters. GCC currently only permits universal character names if
@option{-fextended-identifiers} is used, because the implementation of
universal character names in identifiers is experimental.
GCC allows the @samp{$} character in identifiers as an extension for GCC allows the @samp{$} character in identifiers as an extension for
most targets. This is true regardless of the @option{std=} switch, most targets. This is true regardless of the @option{std=} switch,
......
...@@ -511,6 +511,12 @@ Accept @samp{$} in identifiers. ...@@ -511,6 +511,12 @@ Accept @samp{$} in identifiers.
@xref{Identifier characters}. @xref{Identifier characters}.
@end ifset @end ifset
@item -fextended-identifiers
@opindex fextended-identifiers
Accept universal character names in identifiers. This option is
experimental; in a future version of GCC, it will be enabled by
default for C99 and C++.
@item -fpreprocessed @item -fpreprocessed
@opindex fpreprocessed @opindex fpreprocessed
Indicate to the preprocessor that the input file has already been Indicate to the preprocessor that the input file has already been
......
2005-09-20 Joseph S. Myers <joseph@codesourcery.com>
* g++.dg/cpp/ucnid-1.C, g++.dg/cpp/normalize-1.C,
g++.dg/other/ucnid-1.C, gcc.dg/cpp/normalize-1.c,
gcc.dg/cpp/normalize-2.c, gcc.dg/cpp/normalize-3.c,
gcc.dg/cpp/normalize-4.c, gcc.dg/cpp/ucnid-1.c,
gcc.dg/cpp/ucnid-2.c, gcc.dg/cpp/ucnid-3.c, gcc.dg/cpp/ucnid-4.c,
gcc.dg/cpp/ucnid-5.c, gcc.dg/cpp/ucnid-7.c,gcc.dg/ucnid-1.c,
gcc.dg/ucnid-2.c, gcc.dg/ucnid-3.c, gcc.dg/ucnid-4.c,
gcc.dg/ucnid-5.c, gcc.dg/ucnid-6.c: Add -fextended-identifiers.
* gcc.dg/cpp/ucnid-8.c: New test.
2005-09-20 Jakub Jelinek <jakub@redhat.com> 2005-09-20 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/23929 PR tree-optimization/23929
/* { dg-do preprocess } */ /* { dg-do preprocess } */
/* { dg-options "-Wnormalized=id" } */ /* { dg-options "-fextended-identifiers -Wnormalized=id" } */
\u00AA \u00AA
\u00B7 \u00B7
......
/* { dg-do preprocess } */ /* { dg-do preprocess } */
/* { dg-options "-pedantic" } */ /* { dg-options "-pedantic -fextended-identifiers" } */
\u00AA /* { dg-error "not valid in an identifier" } */ \u00AA /* { dg-error "not valid in an identifier" } */
\u00AB /* { dg-error "not valid in an identifier" } */ \u00AB /* { dg-error "not valid in an identifier" } */
......
/* { dg-do run } */ /* { dg-do run } */
/* { dg-options "-fextended-identifiers" } */
/* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */ /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
#include <cstdlib> #include <cstdlib>
......
/* { dg-do preprocess } */ /* { dg-do preprocess } */
/* { dg-options "-std=c99" } */ /* { dg-options "-std=c99 -fextended-identifiers" } */
\u00AA \u00AA
\u00B7 \u00B7
......
/* { dg-do preprocess } */ /* { dg-do preprocess } */
/* { dg-options "-std=c99 -Wnormalized=nfkc" } */ /* { dg-options "-std=c99 -fextended-identifiers -Wnormalized=nfkc" } */
\u00AA /* { dg-warning "not in NFKC" } */ \u00AA /* { dg-warning "not in NFKC" } */
\u00B7 \u00B7
......
/* { dg-do preprocess } */ /* { dg-do preprocess } */
/* { dg-options "-std=c99 -Wnormalized=id" } */ /* { dg-options "-std=c99 -fextended-identifiers -Wnormalized=id" } */
\u00AA \u00AA
\u00B7 \u00B7
......
/* { dg-do preprocess } */ /* { dg-do preprocess } */
/* { dg-options "-std=c99 -Wnormalized=none" } */ /* { dg-options "-std=c99 -fextended-identifiers -Wnormalized=none" } */
\u00AA \u00AA
\u00B7 \u00B7
......
/* { dg-do run } */ /* { dg-do run } */
/* { dg-options "-std=c99" } */ /* { dg-options "-std=c99 -fextended-identifiers" } */
void abort (void); void abort (void);
#define \u00C0 1 #define \u00C0 1
......
/* { dg-do run } */ /* { dg-do run } */
/* { dg-options "-std=c99" } */ /* { dg-options "-std=c99 -fextended-identifiers" } */
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-std=c99" } */ /* { dg-options "-std=c99 -fextended-identifiers" } */
#define paste(x, y) x ## y #define paste(x, y) x ## y
......
/* { dg-do preprocess } */ /* { dg-do preprocess } */
/* { dg-options "-std=c99" } */ /* { dg-options "-std=c99 -fextended-identifiers" } */
\u00AA \u00AA
\u00AB /* { dg-error "not valid in an identifier" } */ \u00AB /* { dg-error "not valid in an identifier" } */
......
/* { dg-do preprocess } */ /* { dg-do preprocess } */
/* { dg-options "-std=c99 -pedantic" } */ /* { dg-options "-std=c99 -pedantic -fextended-identifiers" } */
\u00AA \u00AA
\u00AB /* { dg-error "not valid in an identifier" } */ \u00AB /* { dg-error "not valid in an identifier" } */
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-std=c99" } */ /* { dg-options "-std=c99 -fextended-identifiers" } */
#define a b( #define a b(
#define b(x) q #define b(x) q
int a\U0000000z ); int a\U0000000z );
/* { dg-do compile } */
/* { dg-options "-std=c99" } */
/* Test that -std=c99 does not enable extended identifiers while the
feature is experimental; remove this test after audit of all
identifier uses in the compiler. */
#define a b(
#define b(x) q
int a\u00aa);
/* { dg-do run } */ /* { dg-do run } */
/* { dg-options "-std=c99" } */ /* { dg-options "-std=c99 -fextended-identifiers" } */
void abort (void); void abort (void);
int main (void) int main (void)
......
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */ /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
/* { dg-options "-std=c99" } */ /* { dg-options "-std=c99 -fextended-identifiers" } */
void abort (void); void abort (void);
static int \u00C0 = 1; static int \u00C0 = 1;
......
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */ /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
/* { dg-options "-std=c99" } */ /* { dg-options "-std=c99 -fextended-identifiers" } */
void abort (void); void abort (void);
int \u00C0 = 1; int \u00C0 = 1;
......
/* { dg-do run */ /* { dg-do run */
/* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */ /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
/* { dg-options "-std=c99" } */ /* { dg-options "-std=c99 -fextended-identifiers" } */
void abort (void); void abort (void);
int \u00C0(void) { return 1; } int \u00C0(void) { return 1; }
......
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */ /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
/* { dg-options "-std=c99 -fdollars-in-identifiers" } */ /* { dg-options "-std=c99 -fdollars-in-identifiers -fextended-identifiers" } */
void abort (void); void abort (void);
int a$b(void) { return 1; } int a$b(void) { return 1; }
......
/* { dg-do run */ /* { dg-do run */
/* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */ /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
/* { dg-options "-std=c99 -save-temps" } */ /* { dg-options "-std=c99 -fextended-identifiers -save-temps" } */
void abort (void); void abort (void);
int \u00C0(void) { return 1; } int \u00C0(void) { return 1; }
......
2005-09-20 Joseph S. Myers <joseph@codesourcery.com>
* include/cpplib.h (struct cpp_options): Add extended_identifiers.
* init.c (struct lang_flags, lang_defaults): Add
extended_identifiers.
(cpp_set_lang): Use it.
* lex.c (forms_identifier_p): Check extended_identifiers.
2005-08-30 Jakub Jelinek <jakub@redhat.com> 2005-08-30 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/20348 PR preprocessor/20348
......
...@@ -345,6 +345,9 @@ struct cpp_options ...@@ -345,6 +345,9 @@ struct cpp_options
/* Zero means dollar signs are punctuation. */ /* Zero means dollar signs are punctuation. */
unsigned char dollars_in_ident; unsigned char dollars_in_ident;
/* Nonzero means UCNs are accepted in identifiers. */
unsigned char extended_identifiers;
/* True if we should warn about dollars in identifiers or numbers /* True if we should warn about dollars in identifiers or numbers
for this translation unit. */ for this translation unit. */
unsigned char warn_dollars; unsigned char warn_dollars;
......
...@@ -72,21 +72,26 @@ struct lang_flags ...@@ -72,21 +72,26 @@ struct lang_flags
char c99; char c99;
char cplusplus; char cplusplus;
char extended_numbers; char extended_numbers;
char extended_identifiers;
char std; char std;
char cplusplus_comments; char cplusplus_comments;
char digraphs; char digraphs;
}; };
static const struct lang_flags lang_defaults[] = static const struct lang_flags lang_defaults[] =
{ /* c99 c++ xnum std // digr */ { /* c99 c++ xnum xid std // digr */
/* GNUC89 */ { 0, 0, 1, 0, 1, 1 }, /* GNUC89 */ { 0, 0, 1, 0, 0, 1, 1 },
/* GNUC99 */ { 1, 0, 1, 0, 1, 1 }, /* GNUC99 */ { 1, 0, 1, 0, 0, 1, 1 },
/* STDC89 */ { 0, 0, 0, 1, 0, 0 }, /* STDC89 */ { 0, 0, 0, 0, 1, 0, 0 },
/* STDC94 */ { 0, 0, 0, 1, 0, 1 }, /* STDC94 */ { 0, 0, 0, 0, 1, 0, 1 },
/* STDC99 */ { 1, 0, 1, 1, 1, 1 }, /* STDC99 */ { 1, 0, 1, 0, 1, 1, 1 },
/* GNUCXX */ { 0, 1, 1, 0, 1, 1 }, /* GNUCXX */ { 0, 1, 1, 0, 0, 1, 1 },
/* CXX98 */ { 0, 1, 1, 1, 1, 1 }, /* CXX98 */ { 0, 1, 1, 0, 1, 1, 1 },
/* ASM */ { 0, 0, 1, 0, 1, 0 } /* ASM */ { 0, 0, 1, 0, 0, 1, 0 }
/* xid should be 1 for GNUC99, STDC99, GNUCXX and CXX98 when no
longer experimental (when all uses of identifiers in the compiler
have been audited for correct handling of extended
identifiers). */
}; };
/* Sets internal flags correctly for a given language. */ /* Sets internal flags correctly for a given language. */
...@@ -97,13 +102,14 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang) ...@@ -97,13 +102,14 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
CPP_OPTION (pfile, lang) = lang; CPP_OPTION (pfile, lang) = lang;
CPP_OPTION (pfile, c99) = l->c99; CPP_OPTION (pfile, c99) = l->c99;
CPP_OPTION (pfile, cplusplus) = l->cplusplus; CPP_OPTION (pfile, cplusplus) = l->cplusplus;
CPP_OPTION (pfile, extended_numbers) = l->extended_numbers; CPP_OPTION (pfile, extended_numbers) = l->extended_numbers;
CPP_OPTION (pfile, std) = l->std; CPP_OPTION (pfile, extended_identifiers) = l->extended_identifiers;
CPP_OPTION (pfile, trigraphs) = l->std; CPP_OPTION (pfile, std) = l->std;
CPP_OPTION (pfile, cplusplus_comments) = l->cplusplus_comments; CPP_OPTION (pfile, trigraphs) = l->std;
CPP_OPTION (pfile, digraphs) = l->digraphs; CPP_OPTION (pfile, cplusplus_comments) = l->cplusplus_comments;
CPP_OPTION (pfile, digraphs) = l->digraphs;
} }
/* Initialize library global state. */ /* Initialize library global state. */
......
...@@ -476,7 +476,7 @@ forms_identifier_p (cpp_reader *pfile, int first, ...@@ -476,7 +476,7 @@ forms_identifier_p (cpp_reader *pfile, int first,
} }
/* Is this a syntactically valid UCN? */ /* Is this a syntactically valid UCN? */
if ((CPP_OPTION (pfile, cplusplus) || CPP_OPTION (pfile, c99)) if (CPP_OPTION (pfile, extended_identifiers)
&& *buffer->cur == '\\' && *buffer->cur == '\\'
&& (buffer->cur[1] == 'u' || buffer->cur[1] == 'U')) && (buffer->cur[1] == 'u' || buffer->cur[1] == 'U'))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment