From af15a2fed76b5da2faf0c2ee9e052923c7562e8f Mon Sep 17 00:00:00 2001
From: Joseph Myers <joseph@codesourcery.com>
Date: Tue, 20 Sep 2005 21:31:37 +0100
Subject: [PATCH] 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
---
 gcc/ChangeLog                          |  8 ++++++
 gcc/c-opts.c                           |  4 +++
 gcc/c.opt                              |  4 +++
 gcc/doc/cpp.texi                       | 18 +++++++-----
 gcc/doc/cppopts.texi                   |  6 ++++
 gcc/testsuite/ChangeLog                | 12 ++++++++
 gcc/testsuite/g++.dg/cpp/normalize-1.C |  2 +-
 gcc/testsuite/g++.dg/cpp/ucnid-1.C     |  2 +-
 gcc/testsuite/g++.dg/other/ucnid-1.C   |  1 +
 gcc/testsuite/gcc.dg/cpp/normalize-1.c |  2 +-
 gcc/testsuite/gcc.dg/cpp/normalize-2.c |  2 +-
 gcc/testsuite/gcc.dg/cpp/normalize-3.c |  2 +-
 gcc/testsuite/gcc.dg/cpp/normalize-4.c |  2 +-
 gcc/testsuite/gcc.dg/cpp/ucnid-1.c     |  2 +-
 gcc/testsuite/gcc.dg/cpp/ucnid-2.c     |  2 +-
 gcc/testsuite/gcc.dg/cpp/ucnid-3.c     |  2 +-
 gcc/testsuite/gcc.dg/cpp/ucnid-4.c     |  2 +-
 gcc/testsuite/gcc.dg/cpp/ucnid-5.c     |  2 +-
 gcc/testsuite/gcc.dg/cpp/ucnid-7.c     |  2 +-
 gcc/testsuite/gcc.dg/cpp/ucnid-8.c     |  8 ++++++
 gcc/testsuite/gcc.dg/ucnid-1.c         |  2 +-
 gcc/testsuite/gcc.dg/ucnid-2.c         |  2 +-
 gcc/testsuite/gcc.dg/ucnid-3.c         |  2 +-
 gcc/testsuite/gcc.dg/ucnid-4.c         |  2 +-
 gcc/testsuite/gcc.dg/ucnid-5.c         |  2 +-
 gcc/testsuite/gcc.dg/ucnid-6.c         |  2 +-
 libcpp/ChangeLog                       |  8 ++++++
 libcpp/include/cpplib.h                |  3 ++
 libcpp/init.c                          | 38 +++++++++++++++-----------
 libcpp/lex.c                           |  2 +-
 30 files changed, 106 insertions(+), 42 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/cpp/ucnid-8.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f19cfdb44e25..4f55ac077c36 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+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>
 
 	PR tree-optimization/23929
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index e3531193e6e9..b0efaf4a61b1 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -647,6 +647,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       flag_enforce_eh_specs = value;
       break;
 
+    case OPT_fextended_identifiers:
+      cpp_opts->extended_identifiers = value;
+      break;
+
     case OPT_ffixed_form:
     case OPT_ffixed_line_length_:
       /* Fortran front end options ignored when preprocessing only.  */
diff --git a/gcc/c.opt b/gcc/c.opt
index d650f111168e..eb01d325ab2c 100644
--- a/gcc/c.opt
+++ b/gcc/c.opt
@@ -495,6 +495,10 @@ fexec-charset=
 C ObjC C++ ObjC++ Joined RejectNegative
 -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=
 C ObjC C++ ObjC++ Joined RejectNegative
 -finput-charset=<cset>	Specify the default character set for source files
diff --git a/gcc/doc/cpp.texi b/gcc/doc/cpp.texi
index f5f29a6397b2..c019adbac670 100644
--- a/gcc/doc/cpp.texi
+++ b/gcc/doc/cpp.texi
@@ -281,11 +281,11 @@ the character in the source character set that they represent, then
 converted to the execution character set, just like unescaped
 characters.
 
+Unless the experimental @option{-fextended-identifiers} option is used,
 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
-change eventually, but there are problems with the standard semantics
-of such ``extended identifiers'' which must be resolved through the
-ISO C and C++ committees first.
+@samp{\u} and @samp{\U} escapes, in identifiers.  Even with that
+option, characters outside the ASCII range can only be specified with
+the @samp{\u} and @samp{\U} escapes, not used directly in identifiers.
 
 @node Initial processing
 @section Initial processing
@@ -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
 discretion (such as accented Latin letters, Greek letters, or Chinese
 ideograms).  This may be done with an extended character set, or the
-@samp{\u} and @samp{\U} escape sequences.  GCC does not presently
-implement either feature in the preprocessor or the compiler.
+@samp{\u} and @samp{\U} escape sequences.  The implementation of this
+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
 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
 The C and C++ standards allow identifiers to be composed of @samp{_}
 and the alphanumeric characters.  C++ and C99 also allow universal
 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
 most targets.  This is true regardless of the @option{std=} switch,
diff --git a/gcc/doc/cppopts.texi b/gcc/doc/cppopts.texi
index 2790e8c77345..adf77e1802a8 100644
--- a/gcc/doc/cppopts.texi
+++ b/gcc/doc/cppopts.texi
@@ -511,6 +511,12 @@ Accept @samp{$} in identifiers.
   @xref{Identifier characters}.
 @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
 @opindex fpreprocessed
 Indicate to the preprocessor that the input file has already been
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 382e26f5b54c..92e197728ac8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,15 @@
+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>
 
 	PR tree-optimization/23929
diff --git a/gcc/testsuite/g++.dg/cpp/normalize-1.C b/gcc/testsuite/g++.dg/cpp/normalize-1.C
index 8c49602d99ea..536a3b45b98b 100644
--- a/gcc/testsuite/g++.dg/cpp/normalize-1.C
+++ b/gcc/testsuite/g++.dg/cpp/normalize-1.C
@@ -1,5 +1,5 @@
 /* { dg-do preprocess } */
-/* { dg-options "-Wnormalized=id" } */
+/* { dg-options "-fextended-identifiers -Wnormalized=id" } */
 
 \u00AA
 \u00B7
diff --git a/gcc/testsuite/g++.dg/cpp/ucnid-1.C b/gcc/testsuite/g++.dg/cpp/ucnid-1.C
index ccbb1ea094fb..d15be4f8e030 100644
--- a/gcc/testsuite/g++.dg/cpp/ucnid-1.C
+++ b/gcc/testsuite/g++.dg/cpp/ucnid-1.C
@@ -1,5 +1,5 @@
 /* { dg-do preprocess } */
-/* { dg-options "-pedantic" } */
+/* { dg-options "-pedantic -fextended-identifiers" } */
 
 \u00AA /* { dg-error "not valid in an identifier" } */
 \u00AB /* { dg-error "not valid in an identifier" } */
diff --git a/gcc/testsuite/g++.dg/other/ucnid-1.C b/gcc/testsuite/g++.dg/other/ucnid-1.C
index faba7b87f11d..ff5696bbc2bc 100644
--- a/gcc/testsuite/g++.dg/other/ucnid-1.C
+++ b/gcc/testsuite/g++.dg/other/ucnid-1.C
@@ -1,4 +1,5 @@
 /* { dg-do run } */
+/* { dg-options "-fextended-identifiers" } */
 /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
 #include <cstdlib>
 
diff --git a/gcc/testsuite/gcc.dg/cpp/normalize-1.c b/gcc/testsuite/gcc.dg/cpp/normalize-1.c
index 768e1930e7a1..b20f235ee98a 100644
--- a/gcc/testsuite/gcc.dg/cpp/normalize-1.c
+++ b/gcc/testsuite/gcc.dg/cpp/normalize-1.c
@@ -1,5 +1,5 @@
 /* { dg-do preprocess } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fextended-identifiers" } */
 
 \u00AA
 \u00B7
diff --git a/gcc/testsuite/gcc.dg/cpp/normalize-2.c b/gcc/testsuite/gcc.dg/cpp/normalize-2.c
index 28ef2f18e428..6f2f49564300 100644
--- a/gcc/testsuite/gcc.dg/cpp/normalize-2.c
+++ b/gcc/testsuite/gcc.dg/cpp/normalize-2.c
@@ -1,5 +1,5 @@
 /* { dg-do preprocess } */
-/* { dg-options "-std=c99 -Wnormalized=nfkc" } */
+/* { dg-options "-std=c99 -fextended-identifiers -Wnormalized=nfkc" } */
 
 \u00AA  /* { dg-warning "not in NFKC" } */
 \u00B7
diff --git a/gcc/testsuite/gcc.dg/cpp/normalize-3.c b/gcc/testsuite/gcc.dg/cpp/normalize-3.c
index 040749208608..a4f496fbb3a8 100644
--- a/gcc/testsuite/gcc.dg/cpp/normalize-3.c
+++ b/gcc/testsuite/gcc.dg/cpp/normalize-3.c
@@ -1,5 +1,5 @@
 /* { dg-do preprocess } */
-/* { dg-options "-std=c99 -Wnormalized=id" } */
+/* { dg-options "-std=c99 -fextended-identifiers -Wnormalized=id" } */
 
 \u00AA
 \u00B7
diff --git a/gcc/testsuite/gcc.dg/cpp/normalize-4.c b/gcc/testsuite/gcc.dg/cpp/normalize-4.c
index 1ee3ff545d56..0040c03aa292 100644
--- a/gcc/testsuite/gcc.dg/cpp/normalize-4.c
+++ b/gcc/testsuite/gcc.dg/cpp/normalize-4.c
@@ -1,5 +1,5 @@
 /* { dg-do preprocess } */
-/* { dg-options "-std=c99 -Wnormalized=none" } */
+/* { dg-options "-std=c99 -fextended-identifiers -Wnormalized=none" } */
 
 \u00AA
 \u00B7
diff --git a/gcc/testsuite/gcc.dg/cpp/ucnid-1.c b/gcc/testsuite/gcc.dg/cpp/ucnid-1.c
index bc516cae92eb..3fad08831a61 100644
--- a/gcc/testsuite/gcc.dg/cpp/ucnid-1.c
+++ b/gcc/testsuite/gcc.dg/cpp/ucnid-1.c
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fextended-identifiers" } */
 void abort (void);
 
 #define \u00C0 1
diff --git a/gcc/testsuite/gcc.dg/cpp/ucnid-2.c b/gcc/testsuite/gcc.dg/cpp/ucnid-2.c
index 616680a969ee..6719c783f561 100644
--- a/gcc/testsuite/gcc.dg/cpp/ucnid-2.c
+++ b/gcc/testsuite/gcc.dg/cpp/ucnid-2.c
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fextended-identifiers" } */
 #include <stdlib.h>
 #include <string.h>
 
diff --git a/gcc/testsuite/gcc.dg/cpp/ucnid-3.c b/gcc/testsuite/gcc.dg/cpp/ucnid-3.c
index a910037c3162..6389b7ebfee2 100644
--- a/gcc/testsuite/gcc.dg/cpp/ucnid-3.c
+++ b/gcc/testsuite/gcc.dg/cpp/ucnid-3.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fextended-identifiers" } */
 
 #define paste(x, y) x ## y
 
diff --git a/gcc/testsuite/gcc.dg/cpp/ucnid-4.c b/gcc/testsuite/gcc.dg/cpp/ucnid-4.c
index e41a3f5907d9..6a6699b942c8 100644
--- a/gcc/testsuite/gcc.dg/cpp/ucnid-4.c
+++ b/gcc/testsuite/gcc.dg/cpp/ucnid-4.c
@@ -1,5 +1,5 @@
 /* { dg-do preprocess } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fextended-identifiers" } */
 
 \u00AA
 \u00AB /* { dg-error "not valid in an identifier" } */
diff --git a/gcc/testsuite/gcc.dg/cpp/ucnid-5.c b/gcc/testsuite/gcc.dg/cpp/ucnid-5.c
index 8fcaeac6f317..cdccd3cdf6a1 100644
--- a/gcc/testsuite/gcc.dg/cpp/ucnid-5.c
+++ b/gcc/testsuite/gcc.dg/cpp/ucnid-5.c
@@ -1,5 +1,5 @@
 /* { dg-do preprocess } */
-/* { dg-options "-std=c99 -pedantic" } */
+/* { dg-options "-std=c99 -pedantic -fextended-identifiers" } */
 
 \u00AA
 \u00AB /* { dg-error "not valid in an identifier" } */
diff --git a/gcc/testsuite/gcc.dg/cpp/ucnid-7.c b/gcc/testsuite/gcc.dg/cpp/ucnid-7.c
index 854c948341aa..93404225de1e 100644
--- a/gcc/testsuite/gcc.dg/cpp/ucnid-7.c
+++ b/gcc/testsuite/gcc.dg/cpp/ucnid-7.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fextended-identifiers" } */
 #define a b(
 #define b(x) q
 int a\U0000000z );
diff --git a/gcc/testsuite/gcc.dg/cpp/ucnid-8.c b/gcc/testsuite/gcc.dg/cpp/ucnid-8.c
new file mode 100644
index 000000000000..1f0379a5bb51
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/ucnid-8.c
@@ -0,0 +1,8 @@
+/* { 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);
diff --git a/gcc/testsuite/gcc.dg/ucnid-1.c b/gcc/testsuite/gcc.dg/ucnid-1.c
index a8d49a3e16d0..ed89cfdeec48 100644
--- a/gcc/testsuite/gcc.dg/ucnid-1.c
+++ b/gcc/testsuite/gcc.dg/ucnid-1.c
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fextended-identifiers" } */
 void abort (void);
 
 int main (void)
diff --git a/gcc/testsuite/gcc.dg/ucnid-2.c b/gcc/testsuite/gcc.dg/ucnid-2.c
index 3b9973b43839..c7dd35bc7ff9 100644
--- a/gcc/testsuite/gcc.dg/ucnid-2.c
+++ b/gcc/testsuite/gcc.dg/ucnid-2.c
@@ -1,6 +1,6 @@
 /* { dg-do run } */
 /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fextended-identifiers" } */
 void abort (void);
 
 static int \u00C0 = 1;
diff --git a/gcc/testsuite/gcc.dg/ucnid-3.c b/gcc/testsuite/gcc.dg/ucnid-3.c
index b68ffd405d88..79f1be887520 100644
--- a/gcc/testsuite/gcc.dg/ucnid-3.c
+++ b/gcc/testsuite/gcc.dg/ucnid-3.c
@@ -1,6 +1,6 @@
 /* { dg-do run } */
 /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fextended-identifiers" } */
 void abort (void);
 
 int \u00C0 = 1;
diff --git a/gcc/testsuite/gcc.dg/ucnid-4.c b/gcc/testsuite/gcc.dg/ucnid-4.c
index 158b862e5b84..f9bf68eb6f66 100644
--- a/gcc/testsuite/gcc.dg/ucnid-4.c
+++ b/gcc/testsuite/gcc.dg/ucnid-4.c
@@ -1,6 +1,6 @@
 /* { dg-do run */
 /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -fextended-identifiers" } */
 void abort (void);
 
 int \u00C0(void) { return 1; }
diff --git a/gcc/testsuite/gcc.dg/ucnid-5.c b/gcc/testsuite/gcc.dg/ucnid-5.c
index a77d51465be5..8cd86060dfe1 100644
--- a/gcc/testsuite/gcc.dg/ucnid-5.c
+++ b/gcc/testsuite/gcc.dg/ucnid-5.c
@@ -1,6 +1,6 @@
 /* { dg-do run } */
 /* { 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);
 
 int a$b(void) { return 1; }
diff --git a/gcc/testsuite/gcc.dg/ucnid-6.c b/gcc/testsuite/gcc.dg/ucnid-6.c
index 7d2063ba0070..37433a1ebf21 100644
--- a/gcc/testsuite/gcc.dg/ucnid-6.c
+++ b/gcc/testsuite/gcc.dg/ucnid-6.c
@@ -1,6 +1,6 @@
 /* { dg-do run */
 /* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
-/* { dg-options "-std=c99 -save-temps" } */
+/* { dg-options "-std=c99 -fextended-identifiers -save-temps" } */
 void abort (void);
 
 int \u00C0(void) { return 1; }
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 1b62fcce3e2d..faf6b93070ad 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,11 @@
+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>
 
 	PR preprocessor/20348
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index ef42d0443a60..c84f62433766 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -345,6 +345,9 @@ struct cpp_options
   /* Zero means dollar signs are punctuation.  */
   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
      for this translation unit.  */
   unsigned char warn_dollars;
diff --git a/libcpp/init.c b/libcpp/init.c
index 515e2549adc3..8d564c933f46 100644
--- a/libcpp/init.c
+++ b/libcpp/init.c
@@ -72,21 +72,26 @@ struct lang_flags
   char c99;
   char cplusplus;
   char extended_numbers;
+  char extended_identifiers;
   char std;
   char cplusplus_comments;
   char digraphs;
 };
 
 static const struct lang_flags lang_defaults[] =
-{ /*              c99 c++ xnum std  //   digr  */
-  /* GNUC89 */  { 0,  0,  1,   0,   1,   1     },
-  /* GNUC99 */  { 1,  0,  1,   0,   1,   1     },
-  /* STDC89 */  { 0,  0,  0,   1,   0,   0     },
-  /* STDC94 */  { 0,  0,  0,   1,   0,   1     },
-  /* STDC99 */  { 1,  0,  1,   1,   1,   1     },
-  /* GNUCXX */  { 0,  1,  1,   0,   1,   1     },
-  /* CXX98  */  { 0,  1,  1,   1,   1,   1     },
-  /* ASM    */  { 0,  0,  1,   0,   1,   0     }
+{ /*              c99 c++ xnum xid std  //   digr  */
+  /* GNUC89 */  { 0,  0,  1,   0,  0,   1,   1     },
+  /* GNUC99 */  { 1,  0,  1,   0,  0,   1,   1     },
+  /* STDC89 */  { 0,  0,  0,   0,  1,   0,   0     },
+  /* STDC94 */  { 0,  0,  0,   0,  1,   0,   1     },
+  /* STDC99 */  { 1,  0,  1,   0,  1,   1,   1     },
+  /* GNUCXX */  { 0,  1,  1,   0,  0,   1,   1     },
+  /* CXX98  */  { 0,  1,  1,   0,  1,   1,   1     },
+  /* 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.  */
@@ -97,13 +102,14 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
 
   CPP_OPTION (pfile, lang) = lang;
 
-  CPP_OPTION (pfile, c99)		 = l->c99;
-  CPP_OPTION (pfile, cplusplus)		 = l->cplusplus;
-  CPP_OPTION (pfile, extended_numbers)	 = l->extended_numbers;
-  CPP_OPTION (pfile, std)		 = l->std;
-  CPP_OPTION (pfile, trigraphs)		 = l->std;
-  CPP_OPTION (pfile, cplusplus_comments) = l->cplusplus_comments;
-  CPP_OPTION (pfile, digraphs)		 = l->digraphs;
+  CPP_OPTION (pfile, c99)			 = l->c99;
+  CPP_OPTION (pfile, cplusplus)			 = l->cplusplus;
+  CPP_OPTION (pfile, extended_numbers)		 = l->extended_numbers;
+  CPP_OPTION (pfile, extended_identifiers)	 = l->extended_identifiers;
+  CPP_OPTION (pfile, std)			 = l->std;
+  CPP_OPTION (pfile, trigraphs)			 = l->std;
+  CPP_OPTION (pfile, cplusplus_comments)	 = l->cplusplus_comments;
+  CPP_OPTION (pfile, digraphs)			 = l->digraphs;
 }
 
 /* Initialize library global state.  */
diff --git a/libcpp/lex.c b/libcpp/lex.c
index ee38a55a6c64..03131618eb55 100644
--- a/libcpp/lex.c
+++ b/libcpp/lex.c
@@ -476,7 +476,7 @@ forms_identifier_p (cpp_reader *pfile, int first,
     }
 
   /* 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[1] == 'u' || buffer->cur[1] == 'U'))
     {
-- 
GitLab