This patch adds the C23 Support in GCC table (compiler features only).

While creating it, I've consulted Annex M.2, our own changes.html,
Joseph's "ISO C23 support in the GNU Toolchain" Cauldron presentation,
https://en.cppreference.com/w/c/compiler_support.html,
https://clang.llvm.org/c_status.html#c2x, as well as git archives.

I'm still not sure about N2341 / N2601.

Binary integer constants / #warning have been implemented for a very long
time but I didn't try to track down when they were added.
__has_include has been implemented since GCC 9 but only for C++.

Also, I'm not aware of any C23 features that *aren't* implemented.

W3 validated.  Ok?

---
 htdocs/projects/c-status.html | 428 +++++++++++++++++++++++++++++++++-
 1 file changed, 426 insertions(+), 2 deletions(-)

diff --git a/htdocs/projects/c-status.html b/htdocs/projects/c-status.html
index 215c5064..7e522bc3 100644
--- a/htdocs/projects/c-status.html
+++ b/htdocs/projects/c-status.html
@@ -19,10 +19,432 @@ 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>
+    <td>Binary integer constants</td>
+    <td><a 
href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2549.pdf";>N2549</a></td>
+    <td class="supported">Yes</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">Yes</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">Yes</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-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>
+    <!-- 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 -->
+    <td><code>[[maybe_unused]]</code></td>
+    <td><a 
href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2270.pdf";>N2270</a></td>
+    <td class="supported"><a href="../gcc-10/changes.html#c">10</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>
+    <!-- r10-4613-g00be2a5f394119 -->
+    <td>Add <code>*_NORM_MAX</code> constants to 
<code>&lt;float.h&gt;</code></td>
+    <td></td>
+    <td class="supported"><a href="../gcc-10/changes.html#c">10</a></td>
+    <td></td>
+  </tr>
+  <tr>
+    <!-- r10-3790-g27dfdc0f92850a -->
+    <td>Update DFP macros in <code>&lt;float.h&gt;</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>
+  <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>
+    <!-- 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></td>
+    <td>harmonization with ISO/IEC 9945; glibc support for these formats
+       was added in glibc 2.27</td>
+  </tr>
+  <tr>
+    <!-- r11-2030 -->
+    <td><code>BOOL_MAX</code> and <code>BOOL_WIDTH</code> macros in
+       <code>&lt;limits.h&gt;</code></td>
+    <td></td>
+    <td class="supported"><a href="../gcc-11/changes.html#c">11</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>
+    <!-- r11-4537 -->
+    <td>Give <code>true</code> and <code>false</code> in 
<code>&lt;stdbool.h&gt;</code>
+       type <code>_Bool</code></td>
+    <td></td>
+    <td class="supported"><a href="../gcc-11/changes.html#c">11</a></td>
+    <td></td>
+  </tr>
+  <tr>
+    <!-- r11-4462-g75ce04fba49eb3 -->
+    <td>Allow duplicate attributes</td>
+    <td><a 
href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2557.pdf";>N2557</a></td>
+    <td class="supported"><a href="../gcc-11/changes.html#c">11</a></td>
+    <td></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>
+    <!-- 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>
+    <!-- r11-5070 -->
+    <td>NaN and Inf macros in <code>&lt;float.h&gt;</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>&lt;float.h&gt;</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>&lt;float.h&gt;</code></td>
+    <td></td>
+    <td class="supported"><a href="../gcc-11/changes.html#c">11</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>
+    <!-- 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>
+    <!-- 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>
+<!-- Probably doesn't belong here.  Added in r12-4362.
+  <tr>
+    <td>Format checking <code>%b</code>, <code>%B</code> formats</td>
+    <td></td>
+    <td class="supported"><a href="../gcc-12/changes.html#c">12</a></td>
+    <td></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-2324-g2eca4ff4e867eb -->
+    <td><code>[[maybe_unused]]</code> for labels </td>
+    <td><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></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-3360-g3b3083a598ca3f -->
+    <!-- r13-3534-ge0997c14af5e8b -->
+    <td>Enhanced Enumerations (fixed underlying types)</td>
+    <td><a 
href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3029.htm";>N3029</a>,
+       <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>
+    <!-- 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>
+    <!-- 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>
+    <!-- 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-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-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>
+    <!-- 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>
+    <!-- r13-2976-g3a3516bc4a0a03 -->
+    <td>The <code>noreturn</code> attribute</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>
+    <!-- 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-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>
+    <!-- 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-2563-ga1a53dc7d87969 -->
+    <td><code>unreachable</code> macro in <code>&lt;stddef.h&gt;</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>
+    <!-- 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>
+    <!-- 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>
+    <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>
+    <!-- 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-13/changes.html#c">13</a></td>
+    <td>first support added in <a href="../gcc-8/changes.html#c">GCC 8</a></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></td>
+    <td>IA-32, x86-64 and AArch64 (little-endian) only</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>
+    <!-- r14-3178-g8441841a1b985d -->
+    <td><code>&lt;stdckdint.h&gt;</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>
+  <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>
+    <!-- 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>
+    <td>IEEE 754 decimal floating-point types</td>
+    <td><a 
href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2341.pdf";>N2341</a></td>
+    <!-- XXX Correct? -->
+    <td class="supported">Yes</td>
+    <td></td>
+  </tr>
+  <tr>
+    <td>IEEE 754 interchange and extended types</td>
+    <td><a 
href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2601.pdf";>N2601</a></td>
+    <!-- XXX Correct? -->
+    <td class="supported">Yes</td>
+    <td>C23 follows TS 18661-3 (support added in <a 
href="../gcc-7/changes.html#c">GCC 7</a>)</td>
+  </tr>
+</table>
+
 <h2 id="c17">C17 Support in GCC</h2>
 
 C17 brings no major changes, only technical corrections and clarifications.
@@ -31,6 +453,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.
-- 
2.49.0

Reply via email to