Bug 117028 - [C2y] Implement N3353, Obsolete implicitly octal literals and add delimited escape sequences
Summary: [C2y] Implement N3353, Obsolete implicitly octal literals and add delimited e...
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: unknown
: P3 enhancement
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL: https://gcc.gnu.org/pipermail/gcc-pat...
Keywords:
Depends on:
Blocks:
 
Reported: 2024-10-08 18:04 UTC by Marek Polacek
Modified: 2024-10-17 05:03 UTC (History)
5 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2024-10-10 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Marek Polacek 2024-10-08 18:04:41 UTC
See <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3353.htm>.
Comment 1 Joseph S. Myers 2024-10-08 18:07:11 UTC
My strong inclination is *not* to add any obsolescence diagnostics, just support the new features (which should already be present for C++) for C23.
Comment 2 Jakub Jelinek 2024-10-08 18:37:00 UTC
0o123 or 0O123 aren't supported for C++, just \u{123}, \x{123}, \o{123} are.
Comment 3 Eric Gallager 2024-10-10 04:56:55 UTC
Note that there's also bug 60523 about octal literals
Comment 4 Frank Heckenbach 2024-10-10 10:25:44 UTC
(In reply to Joseph S. Myers from comment #1)
> My strong inclination is *not* to add any obsolescence diagnostics, just
> support the new features (which should already be present for C++) for C23.

Why no diagnostics? The new features are good, and a warning would help locate and eradicate the evil from code bases.
Comment 5 Joseph S. Myers 2024-10-10 16:04:25 UTC
Obsolescence is generally unhelpful when there is no non-obsolescent alternative in previous standard versions, given that much code needs to work with a range of implementation and standard versions; octal literals are extremely widely used and the new syntax doesn't exist before C23.
Comment 6 Jakub Jelinek 2024-10-10 16:08:42 UTC
Not even C23.  So codebases can start relying on the new syntax only when C2Y is released and compilers supporting it are generally available.
Comment 7 Frank Heckenbach 2024-10-10 16:11:47 UTC
(In reply to Joseph S. Myers from comment #5)
> Obsolescence is generally unhelpful when there is no non-obsolescent
> alternative in previous standard versions, given that much code needs to
> work with a range of implementation and standard versions; octal literals
> are extremely widely used and the new syntax doesn't exist before C23.

So how about a new warning that is off by default and can be activated by those who want to convert their code, which can later become included in -Wall or -Wextra?
Comment 8 Drea Pinski 2024-10-10 16:43:43 UTC
At least having an option to warn is useful to begin with. Turning it on by default (or as part of -Wall, or -Wextra) can be a seperate discussion.
Comment 9 GCC Commits 2024-10-17 05:03:17 UTC
The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:e020116db056352d9a7495e85d37e66c36f6ea32

commit r15-4403-ge020116db056352d9a7495e85d37e66c36f6ea32
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Oct 17 07:01:44 2024 +0200

    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.