mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-21 19:35:28 -05:00
c, libcpp: Partially implement C2Y N3353 paper [PR117028]
The following patch partially implements the N3353 paper.
In particular, it adds support for the delimited escape sequences
(\u{123}, \x{123}, \o{123}) which were added already for C++23,
all I had to do is split the delimited escape sequence guarding from
named universal character escape sequence guards
(\N{LATIN CAPITAL LETTER C WITH CARON}), which C++23 has but C2Y doesn't
and emit different diagnostics for C from C++ for the delimited escape
sequences.
And it adds support for the new style of octal literals, 0o137 or 0O1777.
I have so far added that just for C and not C++, because I have no idea
whether C++ will want to handle it similarly.
What the patch doesn't do is any kind of diagnostics for obsoletion of
\137 or 0137, as discussed in the PR, I think it is way too early for that.
Perhaps some non-default warning later on.
2024-10-17 Jakub Jelinek <jakub@redhat.com>
PR c/117028
libcpp/
* include/cpplib.h (struct cpp_options): Add named_uc_escape_seqs,
octal_constants and cpp_warn_c23_c2y_compat members.
(enum cpp_warning_reason): Add CPP_W_C23_C2Y_COMPAT enumerator.
* init.cc (struct lang_flags): Add named_uc_escape_seqs and
octal_constants bit-fields.
(lang_defaults): Add initializers for them into the table.
(cpp_set_lang): Initialize named_uc_escape_seqs and octal_constants.
(cpp_create_reader): Initialize cpp_warn_c23_c2y_compat to -1.
* charset.cc (_cpp_valid_ucn): Test
CPP_OPTION (pfile, named_uc_escape_seqs) rather than
CPP_OPTION (pfile, delimited_escape_seqs) in \N{} related tests.
Change wording of C cpp_pedwarning for \u{} and emit
-Wc23-c2y-compat warning for it too if needed. Formatting fixes.
(convert_hex): Change wording of C cpp_pedwarning for \u{} and emit
-Wc23-c2y-compat warning for it too if needed.
(convert_oct): Likewise.
* expr.cc (cpp_classify_number): Handle C2Y 0o or 0O prefixed
octal constants.
(cpp_interpret_integer): Likewise.
gcc/c-family/
* c.opt (Wc23-c2y-compat): Add CPP and CppReason parameters.
* c-opts.cc (set_std_c2y): Use CLK_STDC2Y or CLK_GNUC2Y rather
than CLK_STDC23 and CLK_GNUC23. Formatting fix.
* c-lex.cc (interpret_integer): Handle C2Y 0o or 0O prefixed
and wb/WB/uwb/UWB suffixed octal constants.
gcc/testsuite/
* gcc.dg/bitint-112.c: New test.
* gcc.dg/c23-digit-separators-1.c: Add _Static_assert for
valid binary constant with digit separator.
* gcc.dg/c23-octal-constants-1.c: New test.
* gcc.dg/c23-octal-constants-2.c: New test.
* gcc.dg/c2y-digit-separators-1.c: New test.
* gcc.dg/c2y-digit-separators-2.c: New test.
* gcc.dg/c2y-octal-constants-1.c: New test.
* gcc.dg/c2y-octal-constants-2.c: New test.
* gcc.dg/c2y-octal-constants-3.c: New test.
* gcc.dg/cpp/c23-delimited-escape-seq-1.c: New test.
* gcc.dg/cpp/c23-delimited-escape-seq-2.c: New test.
* gcc.dg/cpp/c2y-delimited-escape-seq-1.c: New test.
* gcc.dg/cpp/c2y-delimited-escape-seq-2.c: New test.
* gcc.dg/cpp/c2y-delimited-escape-seq-3.c: New test.
* gcc.dg/cpp/c2y-delimited-escape-seq-4.c: New test.
* gcc.dg/octal-constants-1.c: New test.
* gcc.dg/octal-constants-2.c: New test.
* gcc.dg/octal-constants-3.c: New test.
* gcc.dg/octal-constants-4.c: New test.
* gcc.dg/system-octal-constants-1.c: New test.
* gcc.dg/system-octal-constants-1.h: New file.
This commit is contained in:
committed by
Jakub Jelinek
parent
96ba5e5663
commit
e020116db0
@@ -556,6 +556,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
|
||||
enum {NOT_FLOAT = 0, AFTER_POINT, AFTER_EXPON} float_flag;
|
||||
bool seen_digit;
|
||||
bool seen_digit_sep;
|
||||
bool zero_o_prefix;
|
||||
|
||||
if (ud_suffix)
|
||||
*ud_suffix = NULL;
|
||||
@@ -571,6 +572,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
|
||||
radix = 10;
|
||||
seen_digit = false;
|
||||
seen_digit_sep = false;
|
||||
zero_o_prefix = false;
|
||||
|
||||
/* First, interpret the radix. */
|
||||
if (*str == '0')
|
||||
@@ -601,6 +603,17 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
|
||||
SYNTAX_ERROR_AT (virtual_location,
|
||||
"digit separator after base indicator");
|
||||
}
|
||||
else if ((*str == 'o' || *str == 'O') && !CPP_OPTION (pfile, cplusplus))
|
||||
{
|
||||
if (ISDIGIT (str[1]))
|
||||
{
|
||||
zero_o_prefix = true;
|
||||
str++;
|
||||
}
|
||||
else if (DIGIT_SEP (str[1]))
|
||||
SYNTAX_ERROR_AT (virtual_location,
|
||||
"digit separator after base indicator");
|
||||
}
|
||||
}
|
||||
|
||||
/* Now scan for a well-formed integer or float. */
|
||||
@@ -694,6 +707,12 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
|
||||
"invalid prefix %<0b%> for floating constant");
|
||||
return CPP_N_INVALID;
|
||||
}
|
||||
if (zero_o_prefix)
|
||||
{
|
||||
cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
|
||||
"invalid prefix %<0o%> for floating constant");
|
||||
return CPP_N_INVALID;
|
||||
}
|
||||
|
||||
if (radix == 16 && !seen_digit)
|
||||
SYNTAX_ERROR_AT (virtual_location,
|
||||
@@ -897,8 +916,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
|
||||
if (radix == 2)
|
||||
{
|
||||
bool warned = false;
|
||||
if (!CPP_OPTION (pfile, binary_constants)
|
||||
&& CPP_PEDANTIC (pfile))
|
||||
if (!CPP_OPTION (pfile, binary_constants) && CPP_PEDANTIC (pfile))
|
||||
{
|
||||
if (CPP_OPTION (pfile, cplusplus))
|
||||
warned
|
||||
@@ -916,6 +934,19 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
|
||||
virtual_location, 0,
|
||||
"binary constants are a C23 feature");
|
||||
}
|
||||
if (zero_o_prefix)
|
||||
{
|
||||
bool warned = false;
|
||||
if (!CPP_OPTION (pfile, octal_constants) && CPP_PEDANTIC (pfile))
|
||||
warned
|
||||
= cpp_pedwarning_with_line (pfile, CPP_W_PEDANTIC, virtual_location,
|
||||
0, "%<0o%> prefixed constants are a C2Y "
|
||||
"feature or GCC extension");
|
||||
if (!warned && CPP_OPTION (pfile, cpp_warn_c23_c2y_compat) > 0)
|
||||
cpp_warning_with_line (pfile, CPP_W_C23_C2Y_COMPAT,
|
||||
virtual_location, 0,
|
||||
"%<0o%> prefixed constants are a C2Y feature");
|
||||
}
|
||||
|
||||
if (radix == 10)
|
||||
result |= CPP_N_DECIMAL;
|
||||
@@ -967,6 +998,8 @@ cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token,
|
||||
{
|
||||
base = 8;
|
||||
p++;
|
||||
if (*p == 'o' || *p == 'O')
|
||||
p++;
|
||||
}
|
||||
else if ((type & CPP_N_RADIX) == CPP_N_HEX)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user