diff options
author | Joseph Myers <joseph@codesourcery.com> | 2022-10-14 23:07:50 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2022-10-14 23:07:50 +0000 |
commit | 36d20fa4a83d1a294462c2622ca76eac93465c2c (patch) | |
tree | f2ce724a425779a555362f80d7d418a7318f836d /gcc | |
parent | 89f20c9ae4641f9b2e87e47f7dab3dc197faa0aa (diff) | |
download | gcc-36d20fa4a83d1a294462c2622ca76eac93465c2c.zip gcc-36d20fa4a83d1a294462c2622ca76eac93465c2c.tar.gz gcc-36d20fa4a83d1a294462c2622ca76eac93465c2c.tar.bz2 |
preprocessor: C2x identifier rules
C2x has, like C++, adopted rules for identifiers based directly on an
unversioned normative reference to Unicode. Make libcpp follow those
rules for c2x / gnu2x standards (this involves bringing back a flag
separate from the C++ one for whether to use these identifier rules,
but this time enabled for all C++ language versions since that was the
conclusion adopted for C++ identifier handling).
There is one change here that affects C++. I believe the new
normative requirement for NFC only applies to identifiers, not to the
use of identifier-continue characters in pp-numbers, where there is no
such requirement and so the diagnostic ought to be a warning not a
pedwarn in pp-numbers, and that this is the case for both C and C++.
Bootstrapped with no regressions for x86_64-pc-linux-gnu.
libcpp/
* charset.cc (ucn_valid_in_identifier): Check xid_identifiers not
cplusplus to determine whether to use CXX23 and NXX23 flags.
* include/cpplib.h (struct cpp_options): Add xid_identifiers.
* init.cc (struct lang_flags, lang_defaults): Add xid_identifiers.
(cpp_set_lang): Set xid_identifiers.
* lex.cc (warn_about_normalization): Add parameter identifier.
Only pedwarn about non-NFC for identifiers, not pp-numbers.
(_cpp_lex_direct): Update calls to warn_about_normalization.
gcc/testsuite/
* gcc.dg/cpp/c2x-ucnid-1-utf8.c, gcc.dg/cpp/c2x-ucnid-1.c: New
tests.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/cpp/c2x-ucnid-1-utf8.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/cpp/c2x-ucnid-1.c | 13 |
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/cpp/c2x-ucnid-1-utf8.c b/gcc/testsuite/gcc.dg/cpp/c2x-ucnid-1-utf8.c new file mode 100644 index 0000000..55d2281 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/c2x-ucnid-1-utf8.c @@ -0,0 +1,13 @@ +/* Test C2x (= Unicode) rules for characters in identifiers. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=c2x -pedantic-errors" } */ + +¨ + +/* The requirement for NFC only applies in identifiers, not pp-numbers. */ + +À /* { dg-error "not in NFC" } */ +ÿÀ /* { dg-error "not in NFC" } */ + +0À /* { dg-warning "not in NFC" } */ +.1À /* { dg-warning "not in NFC" } */ diff --git a/gcc/testsuite/gcc.dg/cpp/c2x-ucnid-1.c b/gcc/testsuite/gcc.dg/cpp/c2x-ucnid-1.c new file mode 100644 index 0000000..f9fdbea --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/c2x-ucnid-1.c @@ -0,0 +1,13 @@ +/* Test C2x (= Unicode) rules for characters in identifiers. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=c2x -pedantic-errors" } */ + +\u00A8 /* { dg-error "is not valid in an identifier" } */ + +/* The requirement for NFC only applies in identifiers, not pp-numbers. */ + +A\u0300 /* { dg-error "not in NFC" } */ +\u00ffA\u0300 /* { dg-error "not in NFC" } */ + +0A\u0300 /* { dg-warning "not in NFC" } */ +.1A\u0300 /* { dg-warning "not in NFC" } */ |