aboutsummaryrefslogtreecommitdiff
path: root/libcpp/lex.cc
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2022-10-14 23:07:50 +0000
committerJoseph Myers <joseph@codesourcery.com>2022-10-14 23:07:50 +0000
commit36d20fa4a83d1a294462c2622ca76eac93465c2c (patch)
treef2ce724a425779a555362f80d7d418a7318f836d /libcpp/lex.cc
parent89f20c9ae4641f9b2e87e47f7dab3dc197faa0aa (diff)
downloadgcc-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 'libcpp/lex.cc')
-rw-r--r--libcpp/lex.cc13
1 files changed, 7 insertions, 6 deletions
diff --git a/libcpp/lex.cc b/libcpp/lex.cc
index a429a3d..cc12a52d 100644
--- a/libcpp/lex.cc
+++ b/libcpp/lex.cc
@@ -2007,7 +2007,8 @@ name_p (cpp_reader *pfile, const cpp_string *string)
static void
warn_about_normalization (cpp_reader *pfile,
const cpp_token *token,
- const struct normalize_state *s)
+ const struct normalize_state *s,
+ bool identifier)
{
if (CPP_OPTION (pfile, warn_normalize) < NORMALIZE_STATE_RESULT (s)
&& !pfile->state.skipping)
@@ -2043,7 +2044,7 @@ warn_about_normalization (cpp_reader *pfile,
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, cplusplus))
+ else if (identifier && CPP_OPTION (pfile, xid_identifiers))
cpp_pedwarning_at (pfile, CPP_W_NORMALIZE, &rich_loc,
"`%.*s' is not in NFC", (int) sz, buf);
else
@@ -3839,7 +3840,7 @@ _cpp_lex_direct (cpp_reader *pfile)
struct normalize_state nst = INITIAL_NORMALIZE_STATE;
result->type = CPP_NUMBER;
lex_number (pfile, &result->val.str, &nst);
- warn_about_normalization (pfile, result, &nst);
+ warn_about_normalization (pfile, result, &nst, false);
break;
}
@@ -3888,7 +3889,7 @@ _cpp_lex_direct (cpp_reader *pfile)
result->val.node.node = lex_identifier (pfile, buffer->cur - 1, false,
&nst,
&result->val.node.spelling);
- warn_about_normalization (pfile, result, &nst);
+ warn_about_normalization (pfile, result, &nst, true);
}
/* Convert named operators to their proper types. */
@@ -4101,7 +4102,7 @@ _cpp_lex_direct (cpp_reader *pfile)
struct normalize_state nst = INITIAL_NORMALIZE_STATE;
result->type = CPP_NUMBER;
lex_number (pfile, &result->val.str, &nst);
- warn_about_normalization (pfile, result, &nst);
+ warn_about_normalization (pfile, result, &nst, false);
}
else if (*buffer->cur == '.' && buffer->cur[1] == '.')
buffer->cur += 2, result->type = CPP_ELLIPSIS;
@@ -4192,7 +4193,7 @@ _cpp_lex_direct (cpp_reader *pfile)
result->type = CPP_NAME;
result->val.node.node = lex_identifier (pfile, base, true, &nst,
&result->val.node.spelling);
- warn_about_normalization (pfile, result, &nst);
+ warn_about_normalization (pfile, result, &nst, true);
break;
}