On Thu, Jun 19, 2025 at 08:36:42PM +0000, Joseph Myers wrote: > On Fri, 13 Jun 2025, Marek Polacek wrote: > > > doesn't need any changes, I think. Another is "modified existing functions > > to preserve the const-ness of the type placed into the function", I don't > > what this is talking about. > > It's a duplicate of the entry "added qualifier preserving macros for > bsearch, memchr, strchr, strpbrk, strrchr, strstr, > wcschr, wcspbrk, wcsrchr, wmemchr, and wcsstr;". As in C++, the > qualifiers on the type pointed to by the function return now match those > on the argument. It's a library feature, though it might benefit from > some language feature to make the macro expansions involved shorter (much > as <tgmath.h> benefits from __builtin-tgmath).
I see. Thanks. > > I suppose we might do what we've done in > > https://gcc.gnu.org/projects/cxx-status.html for e.g. Concepts. > > If a feature F is implemented as per paper P1, then we say so; if a later > > paper P2 undoes some of F, then we say P2 is/is not implemented yet. > > > > I very much like having a table like "C++26 Support in GCC" because > > it's immediately obvious what is/is not implemented, and if something > > isn't implemented, we have a PR for it where you can see if someone's > > already working on it. > > > > But if you don't want a C2y table, fair; I've already spent more time > > on this that I'd planned. > > It's reasonable to have the table, it just requires more ongoing > maintenance because of how existing entries can be invalidated by changes > to the working draft (consider e.g. how _Lengthof was changed to > _Countof). Sounds good then. > > + <tr> > > + <td>IEEE 754 interchange and extended types (Optional)</td> > > + <td><a > > href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2601.pdf">N2601</a></td> > > + <td class="supported"><a href="../gcc-7/changes.html#c">7</a> (binary > > types) <br> > > + <a href="../gcc-15/changes.html#c">15</a> (Annex H suffixes and > > + <code>_Decimal64x</code>)</td> > > That is, GCC 15 for Annex H suffixes *for decimal types*. Adjusted. > > + <tr> > > + <!-- r10-3790-g27dfdc0f92850a --> > > + <td>Update DFP macros in <code><float.h></code></td> > > + <td></td> > > + <td class="supported"><a href="../gcc-10/changes.html#c">10</a></td> > > + <td>adds <code>DEC*_TRUE_MIN</code> macros</td> > > + </tr> > > This seems more like it should be a note under the main entry for DFP > support rather than its own feature entry (given that previous C standard > versions didn't support DFP at all). Makes sense, removed. > > + <tr> > > + <!-- r0-81205-gf7fd775f0203c5 --> > > + <td>Binary integer literals formatting</td> > > + <td><a > > href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2549.pdf">N2549</a></td> > > + <td class="supported"><a href="../gcc-4.3/changes.html#c">4.3</a></td> > > + <td></td> > > + </tr> > > I don't think "formatting" belongs in this item description; the format > checking is the next item in your list. You're right. > OK with those items fixed. Thanks, here's what I'm pushing: -- >8 -- commit 9a4f238532b5b6a3e308ffdb29b50c0f5100a4c6 Author: Marek Polacek <pola...@redhat.com> Date: Wed Jun 11 19:20:01 2025 -0400 c-status.html: Add C23 table diff --git a/htdocs/projects/c-status.html b/htdocs/projects/c-status.html index 215c5064..98dcb4d5 100644 --- a/htdocs/projects/c-status.html +++ b/htdocs/projects/c-status.html @@ -19,10 +19,422 @@ the <code>-std=</code> command-line option. <li><a href="#c99">C99</a></li> <li><a href="#c11">C11</a></li> <li><a href="#c17">C17</a></li> - <li>C23</li> - <li>C2y</li> + <li><a href="#c23">C23</a></li> + <li><a href="#c2y">C2y</a></li> </ul> +<h2 id="c2y">C2y Support in GCC</h2> + +GCC has experimental and incomplete support for ISO C2y. + +<p>C2y can be explicitly selected with the <code>-std=c2y</code> +command-line flag, or <code>-std=gnu2y</code> to enable GNU extensions +as well.</p> + +<!-- +<table class="cxxstatus"> + <tr class="separator"> + <th>Feature</th> + <th>Proposal</th> + <th>Version</th> + <th>Notes</th> + </tr> + <tr> + <td></td> + <td></td> + <td class="supported"><a href="../gcc-4.9/changes.html#c"></a></td> + <td></td> + </tr> +</table> +--> + +<h2 id="c23">C23 Support in GCC</h2> + +GCC has support for ISO C23, the 2023 revision of the ISO C standard +(published in 2024). + +<p>C23 mode is <a href="https://gcc.gnu.org/gcc-15/porting_to.html#c23"> +the default</a> since GCC 15; it can be explicitly selected with the +<code>-std=c23</code> command-line flag, or <code>-std=gnu23</code> +to enable GNU extensions as well.</p> + +<table class="cxxstatus"> + <tr class="separator"> + <th>Feature</th> + <th>Proposal</th> + <th>Version</th> + <th>Notes</th> + </tr> + <tr> + <!-- r13-2520-g0a91bdaf177409 --> + <td>New keywords <code>alignas</code>, <code>alignof</code>, + <code>bool</code>, <code>false</code>, <code>static_assert</code>, + <code>thread_local</code>, <code>true</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2934.pdf">N2934</a>, + <a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2935.pdf">N2935</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r9-3505-g9f936c861383dc --> + <td><code>_Static_assert</code> with no message</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2265.pdf">N2665</a></td> + <td class="supported"><a href="../gcc-9/changes.html#c">9</a></td> + <td>support for <code>_Static_assert</code> with two arguments was added + in C11 and <a href="../gcc-4.6/changes.html#c">GCC 4.6</a></td> + </tr> + <tr> + <!-- r10-4466-g017c6491077bee --> + <!-- r12-244-gcc806126215c3f --> + <td>Removed support for function definitions with identifier lists</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2432.pdf">N2432</a></td> + <td class="supported"><a href="../gcc-10/changes.html#c">10</a></td> + <td>removal of old-style function definitions</td> + </tr> + <tr> + <!-- r13-2349-g0a4b219d39c74a --> + <td>Removal of unprototyped functions</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2841.htm">N2841</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td>function declarations whose parameter list is empty are treated the + same as a parameter list which only contain a single <code>void</code></td> + </tr> + <tr> + <!-- r10-3658-g843f104d5bc6d1 --> + <td><code>strftime</code> supports <code>%OB</code> and <code>%Ob</code> + formats</td> + <td></td> + <td class="supported"><a href="../gcc-10/changes.html#c">10</a> (format + checking)</td> + <td>harmonization with ISO/IEC 9945; glibc support for these formats + was added in glibc 2.27</td> + </tr> + <tr> + <td>IEEE 754 decimal floating-point types (Optional)</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2341.pdf">N2341</a></td> + <td class="supported"><a href="../gcc-4.3/changes.html#c">4.3</a> + (IA-32, x86-64, PowerPC, S/390) <br> + <a href="../gcc-13/changes.html#c">13</a> (aarch64)</td> + <!-- r10-3790-g27dfdc0f92850a --> + <td><code>DEC*_TRUE_MIN</code> macros added in + <a href="../gcc-10/changes.html#c">GCC 10</a></td> + </tr> + <tr> + <td>IEEE 754 interchange and extended types (Optional)</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2601.pdf">N2601</a></td> + <td class="supported"><a href="../gcc-7/changes.html#c">7</a> (binary types) <br> + <a href="../gcc-15/changes.html#c">15</a> (Annex H suffixes for decimal types and + <code>_Decimal64x</code>)</td> + <td></td> + </tr> + <tr> + <!-- r10-4613-g00be2a5f394119 --> + <td>Add <code>*_NORM_MAX</code> constants to <code><float.h></code></td> + <td></td> + <td class="supported"><a href="../gcc-10/changes.html#c">10</a></td> + <td></td> + </tr> + <tr> + <!-- r11-5070 --> + <td>NaN and Inf macros in <code><float.h></code></td> + <td></td> + <td class="supported"><a href="../gcc-11/changes.html#c">11</a></td> + <td>corresponding built-in functions <code>__builtin_nansdN</code> added</td> + </tr> + <tr> + <!-- r11-5102 --> + <td><code>*_IS_IEC_60559</code> macros in <code><float.h></code></td> + <td></td> + <td class="supported"><a href="../gcc-11/changes.html#c">11</a></td> + <td></td> + </tr> + <tr> + <!-- r11-5103 --> + <td><code>__STDC_WANT_IEC_60559_EXT__</code> supported by <code><float.h></code></td> + <td></td> + <td class="supported"><a href="../gcc-11/changes.html#c">11</a></td> + <td></td> + </tr> + <tr> + <!-- r13-3939-g9a265c974cd85b --> + <td><code>__STDC_VERSION_*_H__</code> header version macros</td> + <td></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r11-4813 --> + <td>Labels before declarations and end of blocks</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2508.pdf">N2508</a></td> + <td class="supported"><a href="../gcc-11/changes.html#c">11</a></td> + <td></td> + </tr> + <tr> + <!-- r10-4633-g4e03c3a7c1149a --> + <td><code>[[]]</code> attribute syntax</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2335.pdf">N2335</a>, + <a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2554.pdf">N2554</a></td> + <td class="supported"><a href="../gcc-10/changes.html#c">10</a></td> + <td></td> + </tr> + <tr> + <!-- r11-4953 --> + <td><code>__has_c_attribute</code> preprocessor operator</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2553.pdf">N2553</a></td> + <td class="supported"><a href="../gcc-11/changes.html#c">11</a></td> + <td></td> + </tr> + <tr> + <!-- r10-4694-g2cc94aa8d817ba --> + <td><code>[[deprecated]]</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2334.pdf">N2334</a></td> + <td class="supported"><a href="../gcc-10/changes.html#c">10</a></td> + <td></td> + </tr> + <tr> + <!-- r10-4633-g4e03c3a7c1149a --> + <td><code>[[fallthrough]]</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2408.pdf">N2408</a></td> + <td class="supported"><a href="../gcc-10/changes.html#c">10</a></td> + <td></td> + </tr> + <tr> + <!-- r10-4729-g97cc11871e3988 --> + <!-- r13-2324-g2eca4ff4e867eb (labels) --> + <td><code>[[maybe_unused]]</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2270.pdf">N2270</a>, + <a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2662.pdf">N2662</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td>support other than on labels added in <a href="../gcc-10/changes.html#c"> + GCC 10</a></td> + </tr> + <tr> + <!-- r11-4705 --> + <td><code>[[nodiscard]]</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2267.pdf">N2267</a>, + <a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2448.pdf">N2448</a></td> + <td class="supported"><a href="../gcc-11/changes.html#c">11</a></td> + <td></td> + </tr> + <tr> + <!-- r13-2976-g3a3516bc4a0a03 --> + <td><code>[[noreturn]]</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2764.pdf">N2764</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r15-3330-gdd346b613886ae --> + <td><code>[[unsequenced]]</code> and <code>[[reproducible]]</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2956.htm">N2956</a></td> + <td class="supported"><a href="../gcc-15/changes.html#c">15</a></td> + <td></td> + </tr> + <tr> + <!-- r10-4691-g7c5890cc0a0ece --> + <td><code>u8</code> character constants</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2418.pdf">N2418</a></td> + <td class="supported"><a href="../gcc-10/changes.html#c">10</a></td> + <td>for <code>char8_t</code> see + <a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2653.htm">N2653</a></td> + </tr> + <tr> + <td>Type change of <code>u8</code> string literals</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2653.htm">N2653</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r13-3289-g18981635127c67 --> + <td>Introduce storage-class specifiers for compound literals</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3038.htm">N3038</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r13-3930-gb556d1773db717 --> + <td>The <code>constexpr</code> specifier for object definitions</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3018.htm">N3018</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r13-2205-g14cfa01755a66a --> + <td>Support for empty initializer braces</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2900.htm">N2900</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td>some cases were already supported, but not scalars and VLAs</td> + </tr> + <tr> + <!-- r13-3135-gfa258f6894801a --> + <td><code>typeof</code>, <code>typeof_unqual</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2927.htm">N2927</a>, + <a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2930.pdf">N2930</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td><code>typeof</code> was previously supported as an extension</td> + </tr> + <tr> + <!-- r14-6770-g23fee88f84873b --> + <td>Improved tag compatibility</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3037.pdf">N3037</a></td> + <td class="supported"><a href="../gcc-14/changes.html#c">14</a></td> + <td></td> + </tr> + <tr> + <td>Bit-precise integer types (<code>_BitInt</code>)</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2763.pdf">N2763</a>, + <a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2775.pdf">N2775</a>, + <a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2969.htm">N2969</a>, + <a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3035.pdf">N3035</a></td> + <td class="supported"><a href="../gcc-14/changes.html#c">14</a> + (IA-32, x86-64 and AArch64 (little-endian) only)</td> + <td></td> + </tr> + <tr> + <!-- r13-3360-g3b3083a598ca3f --> + <td>Improved rules for handling enumerations without underlying types</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3029.htm">N3029</a></td> + <td class="supported">3.0</td> + <td>allows enums wider than int; adjusted in + <a href="../gcc-13/changes.html#c">GCC 13</a></td> + </tr> + <tr> + <!-- r13-3534-ge0997c14af5e8b --> + <td>Enhanced Enumerations (fixed underlying types)</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3030.htm">N3030</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r15-3599-geba6d2aa71a9b5 and many more --> + <td><code>#embed</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3017.htm">N3017</a></td> + <td class="supported"><a href="../gcc-15/changes.html#c">15</a></td> + <td></td> + </tr> + <tr> + <!-- r13-2206-g60d84e82639e25 --> + <td><code>nullptr</code> constant</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3042.htm">N3042</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r13-4541-gce53cf7b61ea6b --> + <td><code>__VA_OPT__</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3033.htm">N3033</a></td> + <td class="supported"><a href="../gcc-8/changes.html#c">8</a></td> + <td></td> + </tr> + <tr> + <!-- r11-4494 --> + <td>Parameter names may be omitted in function definitions</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2480.pdf">N2480</a></td> + <td class="supported"><a href="../gcc-11/changes.html#c">11</a></td> + <td></td> + </tr> + <tr> + <!-- r13-3549-g4fe34cdcc80ac2 --> + <td>Relax requirements for variadic parameter lists</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2975.pdf">N2975</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <td>Identifier Syntax using Unicode Standard Annex 31</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2836.pdf">N2836</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <td><code>__has_include</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2799.pdf">N2799</a></td> + <td class="supported"><a href="../gcc-5/changes.html#c">5</a></td> + <td></td> + </tr> + <tr> + <!-- r13-3620-ge3c898e12d0ace --> + <td>Type inference for object definitions (<code>auto</code>)</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3007.htm">N3007</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r12-730 --> + <td><code>#elifdef</code>, <code>#elifndef</code> preprocessor directives</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2645.pdf">N2645</a></td> + <td class="supported"><a href="../gcc-12/changes.html#c">12</a></td> + <td></td> + </tr> + <tr> + <td><code>#warning</code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2686.pdf">N2686</a></td> + <td class="supported">2.0</td> + <td></td> + </tr> + <tr> + <!-- r0-81205-gf7fd775f0203c5 --> + <td>Binary integer literals</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2549.pdf">N2549</a></td> + <td class="supported"><a href="../gcc-4.3/changes.html#c">4.3</a></td> + <td></td> + </tr> + <tr> + <td>Formatting for input/output of binary integer numbers</td> + <td></td> + <td class="supported"><a href="../gcc-12/changes.html#c">12</a></td> + <!-- Formatted input/output should be remarked as mainly a glibc + feature (printf support in glibc 2.35, scanf support in 2.38; + PRIb*, PRIB* and SCNb* macros in inttypes.h also in 2.38) but + also with GCC format checking support. And the integer literals + have a secondary library part (strtol etc), also in glibc 2.38. --> + <td>mainly a glibc feature; GCC format checking support present</td> + </tr> + <tr> + <!-- r12-722 --> + <td>Digit separators</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2626.pdf">N2626</a></td> + <td class="supported"><a href="../gcc-12/changes.html#c">12</a></td> + <td></td> + </tr> + <tr> + <!-- r13-2563-ga1a53dc7d87969 --> + <td><code>unreachable</code> macro in <code><stddef.h></code></td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2826.pdf">N2826</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r11-2030 --> + <td><code>BOOL_MAX</code> and <code>BOOL_WIDTH</code> macros in + <code><limits.h></code></td> + <td></td> + <td class="supported"><a href="../gcc-11/changes.html#c">11</a></td> + <td></td> + </tr> + <tr> + <!-- r13-2626-g2e7bc76d84f0aa --> + <td><code>ATOMIC_VAR_INIT</code> removed</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2886.htm">N2886</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td></td> + </tr> + <tr> + <!-- r13-2451-g5f38bf14bcb3ff --> + <td>Removal of trigraphs</td> + <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2940.pdf">N2940</a></td> + <td class="supported"><a href="../gcc-13/changes.html#c">13</a></td> + <td>can still be enabled using <code>-trigraphs</code></td> + </tr> + <tr> + <!-- r14-3178-g8441841a1b985d --> + <td><code><stdckdint.h></code> header for checked integer arithmetic</td> + <td></td> + <td class="supported"><a href="../gcc-14/changes.html#c">14</a></td> + <td></td> + </tr> +</table> + <h2 id="c17">C17 Support in GCC</h2> C17 brings no major changes, only technical corrections and clarifications. @@ -31,6 +443,8 @@ C17 brings no major changes, only technical corrections and clarifications. command-line flag, or <code>-std=gnu17</code> to enable GNU extensions as well.</p> +<p>This was the default mode from GCC 8 to GCC 14 (including).</p> + <h2 id="c11">C11 Support in GCC</h2> GCC has support for ISO C11, the 2011 revision of the ISO C standard.