Skip to content
Snippets Groups Projects
  • Jakub Jelinek's avatar
    e020116d
    c, libcpp: Partially implement C2Y N3353 paper [PR117028] · e020116d
    Jakub Jelinek authored
    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.
    e020116d
    History
    c, libcpp: Partially implement C2Y N3353 paper [PR117028]
    Jakub Jelinek authored
    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.