libcpp: Enable P1949R7 for C++98 too [PR100977]

Message ID 20211130181955.GR2646553@tucnak
State Committed
Headers
Series libcpp: Enable P1949R7 for C++98 too [PR100977] |

Commit Message

Jakub Jelinek Nov. 30, 2021, 6:19 p.m. UTC
  On Mon, Nov 29, 2021 at 05:53:58PM -0500, Jason Merrill wrote:
> I'm inclined to go ahead and change C++98 as well; I doubt anyone is relying
> on the particular C++98 extended character set rules, and we already accept
> the union of the different sets when not pedantic.

Ok, here is an incremental patch to do that also for -std={c,gnu}++98.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2021-11-30  Jakub Jelinek  <jakub@redhat.com>

	* init.c (struct lang_flags): Remove cxx23_identifiers.
	(lang_defaults): Remove cxx23_identifiers initializers.
	(cpp_set_lang): Don't copy cxx23_identifiers.
	* include/cpplib.h (struct cpp_options): Adjust comment about
	c11_identifiers.  Remove cxx23_identifiers field.
	* lex.c (warn_about_normalization): Use cplusplus instead of
	cxx23_identifiers.
	* charset.c (ucn_valid_in_identifier): Likewise.

	* g++.dg/cpp/ucnid-1.C: Adjust expected diagnostics.
	* g++.dg/cpp/ucnid-1-utf8.C: Likewise.



	Jakub
  

Comments

Jason Merrill Nov. 30, 2021, 6:28 p.m. UTC | #1
On 11/30/21 13:19, Jakub Jelinek wrote:
> On Mon, Nov 29, 2021 at 05:53:58PM -0500, Jason Merrill wrote:
>> I'm inclined to go ahead and change C++98 as well; I doubt anyone is relying
>> on the particular C++98 extended character set rules, and we already accept
>> the union of the different sets when not pedantic.
> 
> Ok, here is an incremental patch to do that also for -std={c,gnu}++98.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

> 2021-11-30  Jakub Jelinek  <jakub@redhat.com>
> 
> 	* init.c (struct lang_flags): Remove cxx23_identifiers.
> 	(lang_defaults): Remove cxx23_identifiers initializers.
> 	(cpp_set_lang): Don't copy cxx23_identifiers.
> 	* include/cpplib.h (struct cpp_options): Adjust comment about
> 	c11_identifiers.  Remove cxx23_identifiers field.
> 	* lex.c (warn_about_normalization): Use cplusplus instead of
> 	cxx23_identifiers.
> 	* charset.c (ucn_valid_in_identifier): Likewise.
> 
> 	* g++.dg/cpp/ucnid-1.C: Adjust expected diagnostics.
> 	* g++.dg/cpp/ucnid-1-utf8.C: Likewise.
> 
> --- gcc/init.c.jj	2021-11-29 22:54:46.503750631 +0100
> +++ gcc/init.c	2021-11-30 01:06:31.704473882 +0100
> @@ -82,7 +82,6 @@ struct lang_flags
>     char extended_numbers;
>     char extended_identifiers;
>     char c11_identifiers;
> -  char cxx23_identifiers;
>     char std;
>     char digraphs;
>     char uliterals;
> @@ -100,31 +99,31 @@ struct lang_flags
>   };
>   
>   static const struct lang_flags lang_defaults[] =
> -{ /*              c99 c++ xnum xid c11 c++23 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp szlit elifdef */
> -  /* GNUC89   */  { 0,  0,  1,  0,  0,  0,    0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> -  /* GNUC99   */  { 1,  0,  1,  1,  0,  0,    0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> -  /* GNUC11   */  { 1,  0,  1,  1,  1,  0,    0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> -  /* GNUC17   */  { 1,  0,  1,  1,  1,  0,    0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> -  /* GNUC2X   */  { 1,  0,  1,  1,  1,  0,    0,  1,   1,   1,   0,    1,     1,     0,   1,      1,   1,     1,   0,   1 },
> -  /* STDC89   */  { 0,  0,  0,  0,  0,  0,    1,  0,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
> -  /* STDC94   */  { 0,  0,  0,  0,  0,  0,    1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
> -  /* STDC99   */  { 1,  0,  1,  1,  0,  0,    1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
> -  /* STDC11   */  { 1,  0,  1,  1,  1,  0,    1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
> -  /* STDC17   */  { 1,  0,  1,  1,  1,  0,    1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
> -  /* STDC2X   */  { 1,  0,  1,  1,  1,  0,    1,  1,   1,   0,   0,    1,     1,     1,   1,      0,   1,     1,   0,   1 },
> -  /* GNUCXX   */  { 0,  1,  1,  1,  0,  0,    0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> -  /* CXX98    */  { 0,  1,  0,  1,  0,  0,    1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   1,     0,   0,   0 },
> -  /* GNUCXX11 */  { 1,  1,  1,  1,  1,  1,    0,  1,   1,   1,   1,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> -  /* CXX11    */  { 1,  1,  0,  1,  1,  1,    1,  1,   1,   1,   1,    0,     0,     1,   0,      0,   1,     0,   0,   0 },
> -  /* GNUCXX14 */  { 1,  1,  1,  1,  1,  1,    0,  1,   1,   1,   1,    1,     1,     0,   0,      1,   1,     0,   0,   0 },
> -  /* CXX14    */  { 1,  1,  0,  1,  1,  1,    1,  1,   1,   1,   1,    1,     1,     1,   0,      0,   1,     0,   0,   0 },
> -  /* GNUCXX17 */  { 1,  1,  1,  1,  1,  1,    0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
> -  /* CXX17    */  { 1,  1,  1,  1,  1,  1,    1,  1,   1,   1,   1,    1,     1,     0,   1,      0,   1,     0,   0,   0 },
> -  /* GNUCXX20 */  { 1,  1,  1,  1,  1,  1,    0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
> -  /* CXX20    */  { 1,  1,  1,  1,  1,  1,    1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
> -  /* GNUCXX23 */  { 1,  1,  1,  1,  1,  1,    0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   1,   1 },
> -  /* CXX23    */  { 1,  1,  1,  1,  1,  1,    1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   1,   1 },
> -  /* ASM      */  { 0,  0,  1,  0,  0,  0,    0,  0,   0,   0,   0,    0,     0,     0,   0,      0,   0,     0,   0,   0 }
> +{ /*              c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp szlit elifdef */
> +  /* GNUC89   */  { 0,  0,  1,  0,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> +  /* GNUC99   */  { 1,  0,  1,  1,  0,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> +  /* GNUC11   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> +  /* GNUC17   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> +  /* GNUC2X   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    1,     1,     0,   1,      1,   1,     1,   0,   1 },
> +  /* STDC89   */  { 0,  0,  0,  0,  0,  1,  0,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
> +  /* STDC94   */  { 0,  0,  0,  0,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
> +  /* STDC99   */  { 1,  0,  1,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
> +  /* STDC11   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
> +  /* STDC17   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
> +  /* STDC2X   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    1,     1,     1,   1,      0,   1,     1,   0,   1 },
> +  /* GNUCXX   */  { 0,  1,  1,  1,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> +  /* CXX98    */  { 0,  1,  0,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   1,     0,   0,   0 },
> +  /* GNUCXX11 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
> +  /* CXX11    */  { 1,  1,  0,  1,  1,  1,  1,   1,   1,   1,    0,     0,     1,   0,      0,   1,     0,   0,   0 },
> +  /* GNUCXX14 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   0,      1,   1,     0,   0,   0 },
> +  /* CXX14    */  { 1,  1,  0,  1,  1,  1,  1,   1,   1,   1,    1,     1,     1,   0,      0,   1,     0,   0,   0 },
> +  /* GNUCXX17 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
> +  /* CXX17    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      0,   1,     0,   0,   0 },
> +  /* GNUCXX20 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
> +  /* CXX20    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
> +  /* GNUCXX23 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   1,   1 },
> +  /* CXX23    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   1,   1 },
> +  /* ASM      */  { 0,  0,  1,  0,  0,  0,  0,   0,   0,   0,    0,     0,     0,   0,      0,   0,     0,   0,   0 }
>   };
>   
>   /* Sets internal flags correctly for a given language.  */
> @@ -140,7 +139,6 @@ cpp_set_lang (cpp_reader *pfile, enum c_
>     CPP_OPTION (pfile, extended_numbers)		 = l->extended_numbers;
>     CPP_OPTION (pfile, extended_identifiers)	 = l->extended_identifiers;
>     CPP_OPTION (pfile, c11_identifiers)		 = l->c11_identifiers;
> -  CPP_OPTION (pfile, cxx23_identifiers)		 = l->cxx23_identifiers;
>     CPP_OPTION (pfile, std)			 = l->std;
>     CPP_OPTION (pfile, digraphs)			 = l->digraphs;
>     CPP_OPTION (pfile, uliterals)			 = l->uliterals;
> --- gcc/include/cpplib.h.jj	2021-11-17 20:08:18.359724792 +0100
> +++ gcc/include/cpplib.h	2021-11-30 01:06:12.325741705 +0100
> @@ -491,13 +491,9 @@ struct cpp_options
>     unsigned char ext_numeric_literals;
>   
>     /* Nonzero means extended identifiers allow the characters specified
> -     in C11 and C++11.  */
> +     in C11.  */
>     unsigned char c11_identifiers;
>   
> -  /* Nonzero means extended identifiers allow the characters specified
> -     in C++23.  */
> -  unsigned char cxx23_identifiers;
> -
>     /* Nonzero for C++ 2014 Standard binary constants.  */
>     unsigned char binary_constants;
>   
> --- gcc/lex.c.jj	2021-11-23 23:09:03.404339391 +0100
> +++ gcc/lex.c	2021-11-30 01:07:20.713796544 +0100
> @@ -1838,7 +1838,7 @@ warn_about_normalization (cpp_reader *pf
>         if (NORMALIZE_STATE_RESULT (s) == normalized_C)
>   	cpp_warning_at (pfile, CPP_W_NORMALIZE, &rich_loc,
>   			"`%.*s' is not in NFKC", (int) sz, buf);
> -      else if (CPP_OPTION (pfile, cxx23_identifiers))
> +      else if (CPP_OPTION (pfile, cplusplus))
>   	cpp_pedwarning_at (pfile, CPP_W_NORMALIZE, &rich_loc,
>   				  "`%.*s' is not in NFC", (int) sz, buf);
>         else
> --- gcc/charset.c.jj	2021-11-01 23:01:30.582702315 +0100
> +++ gcc/charset.c	2021-11-30 01:08:13.651064928 +0100
> @@ -955,14 +955,12 @@ ucn_valid_in_identifier (cpp_reader *pfi
>     valid_flags = C99 | CXX | C11 | CXX23;
>     if (CPP_PEDANTIC (pfile))
>       {
> -      if (CPP_OPTION (pfile, cxx23_identifiers))
> +      if (CPP_OPTION (pfile, cplusplus))
>   	valid_flags = CXX23;
>         else if (CPP_OPTION (pfile, c11_identifiers))
>   	valid_flags = C11;
>         else if (CPP_OPTION (pfile, c99))
>   	valid_flags = C99;
> -      else if (CPP_OPTION (pfile, cplusplus))
> -	valid_flags = CXX;
>       }
>     if (! (ucnranges[mn].flags & valid_flags))
>         return 0;
> @@ -1021,7 +1019,7 @@ ucn_valid_in_identifier (cpp_reader *pfi
>         return 2;
>       }
>   
> -  if (CPP_OPTION (pfile, cxx23_identifiers))
> +  if (CPP_OPTION (pfile, cplusplus))
>       invalid_start_flags = NXX23;
>     else if (CPP_OPTION (pfile, c11_identifiers))
>       invalid_start_flags = N11;
> --- gcc/testsuite/g++.dg/cpp/ucnid-1.C.jj	2020-01-14 20:02:46.702611047 +0100
> +++ gcc/testsuite/g++.dg/cpp/ucnid-1.C	2021-11-30 18:40:00.664865172 +0100
> @@ -1,17 +1,17 @@
>   /* { dg-do preprocess } */
>   /* { dg-options "-std=gnu++98 -pedantic" } */
>   
> -\u00AA /* { dg-error "not valid in an identifier" } */
> +\u00AA
>   \u00AB /* { dg-error "not valid in an identifier" } */
>   \u00B6 /* { dg-error "not valid in an identifier" } */
> -\u00BA /* { dg-error "not valid in an identifier" } */
> +\u00BA
>   \u00C0
>   \u00D6
> -\u0384
> +\u0384 /* { dg-error "not valid in an identifier" } */
>   
> -\u0669 /* { dg-error "not valid in an identifier" } */
> -A\u0669 /* { dg-error "not valid in an identifier" } */
> -0\u00BA /* { dg-error "not valid in an identifier" } */
> -0\u0669 /* { dg-error "not valid in an identifier" } */
> -\u0E59
> +\u0669 /* { dg-error "not valid at the start of an identifier" } */
> +A\u0669
> +0\u00BA
> +0\u0669
> +\u0E59 /* { dg-error "not valid at the start of an identifier" } */
>   A\u0E59
> --- gcc/testsuite/g++.dg/cpp/ucnid-1-utf8.C.jj	2020-01-14 20:02:46.702611047 +0100
> +++ gcc/testsuite/g++.dg/cpp/ucnid-1-utf8.C	2021-11-30 18:40:51.641121457 +0100
> @@ -1,17 +1,17 @@
>   /* { dg-do preprocess } */
>   /* { dg-options "-std=gnu++98 -pedantic" } */
>   
> -ª /* { dg-error "not valid in an identifier" } */
> +ª
>   « /* { dg-error "not valid in an identifier" } */
>   ¶ /* { dg-error "not valid in an identifier" } */
> -º /* { dg-error "not valid in an identifier" } */
> +º
>   À
>   Ö
> -΄
> +΄ /* { dg-error "not valid in an identifier" } */
>   
> -٩ /* { dg-error "not valid in an identifier" } */
> -A٩ /* { dg-error "not valid in an identifier" } */
> -0º /* { dg-error "not valid in an identifier" } */
> -0٩ /* { dg-error "not valid in an identifier" } */
> -๙
> +٩ /* { dg-error "not valid at the start of an identifier" } */
> +A٩
> +0º
> +0٩
> +๙ /* { dg-error "not valid at the start of an identifier" } */
>   A๙
> 
> 
> 	Jakub
>
  

Patch

--- gcc/init.c.jj	2021-11-29 22:54:46.503750631 +0100
+++ gcc/init.c	2021-11-30 01:06:31.704473882 +0100
@@ -82,7 +82,6 @@  struct lang_flags
   char extended_numbers;
   char extended_identifiers;
   char c11_identifiers;
-  char cxx23_identifiers;
   char std;
   char digraphs;
   char uliterals;
@@ -100,31 +99,31 @@  struct lang_flags
 };
 
 static const struct lang_flags lang_defaults[] =
-{ /*              c99 c++ xnum xid c11 c++23 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp szlit elifdef */
-  /* GNUC89   */  { 0,  0,  1,  0,  0,  0,    0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
-  /* GNUC99   */  { 1,  0,  1,  1,  0,  0,    0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
-  /* GNUC11   */  { 1,  0,  1,  1,  1,  0,    0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
-  /* GNUC17   */  { 1,  0,  1,  1,  1,  0,    0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
-  /* GNUC2X   */  { 1,  0,  1,  1,  1,  0,    0,  1,   1,   1,   0,    1,     1,     0,   1,      1,   1,     1,   0,   1 },
-  /* STDC89   */  { 0,  0,  0,  0,  0,  0,    1,  0,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
-  /* STDC94   */  { 0,  0,  0,  0,  0,  0,    1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
-  /* STDC99   */  { 1,  0,  1,  1,  0,  0,    1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
-  /* STDC11   */  { 1,  0,  1,  1,  1,  0,    1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
-  /* STDC17   */  { 1,  0,  1,  1,  1,  0,    1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
-  /* STDC2X   */  { 1,  0,  1,  1,  1,  0,    1,  1,   1,   0,   0,    1,     1,     1,   1,      0,   1,     1,   0,   1 },
-  /* GNUCXX   */  { 0,  1,  1,  1,  0,  0,    0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
-  /* CXX98    */  { 0,  1,  0,  1,  0,  0,    1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   1,     0,   0,   0 },
-  /* GNUCXX11 */  { 1,  1,  1,  1,  1,  1,    0,  1,   1,   1,   1,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
-  /* CXX11    */  { 1,  1,  0,  1,  1,  1,    1,  1,   1,   1,   1,    0,     0,     1,   0,      0,   1,     0,   0,   0 },
-  /* GNUCXX14 */  { 1,  1,  1,  1,  1,  1,    0,  1,   1,   1,   1,    1,     1,     0,   0,      1,   1,     0,   0,   0 },
-  /* CXX14    */  { 1,  1,  0,  1,  1,  1,    1,  1,   1,   1,   1,    1,     1,     1,   0,      0,   1,     0,   0,   0 },
-  /* GNUCXX17 */  { 1,  1,  1,  1,  1,  1,    0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
-  /* CXX17    */  { 1,  1,  1,  1,  1,  1,    1,  1,   1,   1,   1,    1,     1,     0,   1,      0,   1,     0,   0,   0 },
-  /* GNUCXX20 */  { 1,  1,  1,  1,  1,  1,    0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
-  /* CXX20    */  { 1,  1,  1,  1,  1,  1,    1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
-  /* GNUCXX23 */  { 1,  1,  1,  1,  1,  1,    0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   1,   1 },
-  /* CXX23    */  { 1,  1,  1,  1,  1,  1,    1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   1,   1 },
-  /* ASM      */  { 0,  0,  1,  0,  0,  0,    0,  0,   0,   0,   0,    0,     0,     0,   0,      0,   0,     0,   0,   0 }
+{ /*              c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp szlit elifdef */
+  /* GNUC89   */  { 0,  0,  1,  0,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
+  /* GNUC99   */  { 1,  0,  1,  1,  0,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
+  /* GNUC11   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
+  /* GNUC17   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
+  /* GNUC2X   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    1,     1,     0,   1,      1,   1,     1,   0,   1 },
+  /* STDC89   */  { 0,  0,  0,  0,  0,  1,  0,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
+  /* STDC94   */  { 0,  0,  0,  0,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
+  /* STDC99   */  { 1,  0,  1,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
+  /* STDC11   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
+  /* STDC17   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
+  /* STDC2X   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    1,     1,     1,   1,      0,   1,     1,   0,   1 },
+  /* GNUCXX   */  { 0,  1,  1,  1,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
+  /* CXX98    */  { 0,  1,  0,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   1,     0,   0,   0 },
+  /* GNUCXX11 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
+  /* CXX11    */  { 1,  1,  0,  1,  1,  1,  1,   1,   1,   1,    0,     0,     1,   0,      0,   1,     0,   0,   0 },
+  /* GNUCXX14 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   0,      1,   1,     0,   0,   0 },
+  /* CXX14    */  { 1,  1,  0,  1,  1,  1,  1,   1,   1,   1,    1,     1,     1,   0,      0,   1,     0,   0,   0 },
+  /* GNUCXX17 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
+  /* CXX17    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      0,   1,     0,   0,   0 },
+  /* GNUCXX20 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
+  /* CXX20    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
+  /* GNUCXX23 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   1,   1 },
+  /* CXX23    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   1,   1 },
+  /* ASM      */  { 0,  0,  1,  0,  0,  0,  0,   0,   0,   0,    0,     0,     0,   0,      0,   0,     0,   0,   0 }
 };
 
 /* Sets internal flags correctly for a given language.  */
@@ -140,7 +139,6 @@  cpp_set_lang (cpp_reader *pfile, enum c_
   CPP_OPTION (pfile, extended_numbers)		 = l->extended_numbers;
   CPP_OPTION (pfile, extended_identifiers)	 = l->extended_identifiers;
   CPP_OPTION (pfile, c11_identifiers)		 = l->c11_identifiers;
-  CPP_OPTION (pfile, cxx23_identifiers)		 = l->cxx23_identifiers;
   CPP_OPTION (pfile, std)			 = l->std;
   CPP_OPTION (pfile, digraphs)			 = l->digraphs;
   CPP_OPTION (pfile, uliterals)			 = l->uliterals;
--- gcc/include/cpplib.h.jj	2021-11-17 20:08:18.359724792 +0100
+++ gcc/include/cpplib.h	2021-11-30 01:06:12.325741705 +0100
@@ -491,13 +491,9 @@  struct cpp_options
   unsigned char ext_numeric_literals;
 
   /* Nonzero means extended identifiers allow the characters specified
-     in C11 and C++11.  */
+     in C11.  */
   unsigned char c11_identifiers;
 
-  /* Nonzero means extended identifiers allow the characters specified
-     in C++23.  */
-  unsigned char cxx23_identifiers;
-
   /* Nonzero for C++ 2014 Standard binary constants.  */
   unsigned char binary_constants;
 
--- gcc/lex.c.jj	2021-11-23 23:09:03.404339391 +0100
+++ gcc/lex.c	2021-11-30 01:07:20.713796544 +0100
@@ -1838,7 +1838,7 @@  warn_about_normalization (cpp_reader *pf
       if (NORMALIZE_STATE_RESULT (s) == normalized_C)
 	cpp_warning_at (pfile, CPP_W_NORMALIZE, &rich_loc,
 			"`%.*s' is not in NFKC", (int) sz, buf);
-      else if (CPP_OPTION (pfile, cxx23_identifiers))
+      else if (CPP_OPTION (pfile, cplusplus))
 	cpp_pedwarning_at (pfile, CPP_W_NORMALIZE, &rich_loc,
 				  "`%.*s' is not in NFC", (int) sz, buf);
       else
--- gcc/charset.c.jj	2021-11-01 23:01:30.582702315 +0100
+++ gcc/charset.c	2021-11-30 01:08:13.651064928 +0100
@@ -955,14 +955,12 @@  ucn_valid_in_identifier (cpp_reader *pfi
   valid_flags = C99 | CXX | C11 | CXX23;
   if (CPP_PEDANTIC (pfile))
     {
-      if (CPP_OPTION (pfile, cxx23_identifiers))
+      if (CPP_OPTION (pfile, cplusplus))
 	valid_flags = CXX23;
       else if (CPP_OPTION (pfile, c11_identifiers))
 	valid_flags = C11;
       else if (CPP_OPTION (pfile, c99))
 	valid_flags = C99;
-      else if (CPP_OPTION (pfile, cplusplus))
-	valid_flags = CXX;
     }
   if (! (ucnranges[mn].flags & valid_flags))
       return 0;
@@ -1021,7 +1019,7 @@  ucn_valid_in_identifier (cpp_reader *pfi
       return 2;
     }
 
-  if (CPP_OPTION (pfile, cxx23_identifiers))
+  if (CPP_OPTION (pfile, cplusplus))
     invalid_start_flags = NXX23;
   else if (CPP_OPTION (pfile, c11_identifiers))
     invalid_start_flags = N11;
--- gcc/testsuite/g++.dg/cpp/ucnid-1.C.jj	2020-01-14 20:02:46.702611047 +0100
+++ gcc/testsuite/g++.dg/cpp/ucnid-1.C	2021-11-30 18:40:00.664865172 +0100
@@ -1,17 +1,17 @@ 
 /* { dg-do preprocess } */
 /* { dg-options "-std=gnu++98 -pedantic" } */
 
-\u00AA /* { dg-error "not valid in an identifier" } */
+\u00AA
 \u00AB /* { dg-error "not valid in an identifier" } */
 \u00B6 /* { dg-error "not valid in an identifier" } */
-\u00BA /* { dg-error "not valid in an identifier" } */
+\u00BA
 \u00C0
 \u00D6
-\u0384
+\u0384 /* { dg-error "not valid in an identifier" } */
 
-\u0669 /* { dg-error "not valid in an identifier" } */
-A\u0669 /* { dg-error "not valid in an identifier" } */
-0\u00BA /* { dg-error "not valid in an identifier" } */
-0\u0669 /* { dg-error "not valid in an identifier" } */
-\u0E59
+\u0669 /* { dg-error "not valid at the start of an identifier" } */
+A\u0669
+0\u00BA
+0\u0669
+\u0E59 /* { dg-error "not valid at the start of an identifier" } */
 A\u0E59
--- gcc/testsuite/g++.dg/cpp/ucnid-1-utf8.C.jj	2020-01-14 20:02:46.702611047 +0100
+++ gcc/testsuite/g++.dg/cpp/ucnid-1-utf8.C	2021-11-30 18:40:51.641121457 +0100
@@ -1,17 +1,17 @@ 
 /* { dg-do preprocess } */
 /* { dg-options "-std=gnu++98 -pedantic" } */
 
-ª /* { dg-error "not valid in an identifier" } */

 « /* { dg-error "not valid in an identifier" } */
 ¶ /* { dg-error "not valid in an identifier" } */
-º /* { dg-error "not valid in an identifier" } */

 À
 Ö

+΄ /* { dg-error "not valid in an identifier" } */
 
-٩ /* { dg-error "not valid in an identifier" } */
-A٩ /* { dg-error "not valid in an identifier" } */
-0º /* { dg-error "not valid in an identifier" } */
-0٩ /* { dg-error "not valid in an identifier" } */
-๙
+٩ /* { dg-error "not valid at the start of an identifier" } */
+A٩
+0º
+0٩
+๙ /* { dg-error "not valid at the start of an identifier" } */
 A๙