new file mode 100644
@@ -0,0 +1,995 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>C Standards Support in GCC</title>
+<link rel="stylesheet" type="text/css" href="https://gcc.gnu.org/gcc.css" />
+</head>
+
+<body>
+ <h1>C Standards Support in GCC</h1>
+
+ GCC supports different dialects of C, corresponding to the multiple
+ published ISO standards. Which standard it implements can be selected using
+ the <code>-std=</code> command-line option.
+
+ <ul>
+ <li><a href="#c89">C89</a></li>
+ <li><a href="#c99">C99</a></li>
+ <li><a href="#c11">C11</a></li>
+ <li><a href="#c17">C17</a></li>
+ <li><a href="#c2x">C2x</a></li>
+ </ul>
+
+<!-- We don't have this yet, but we should.
+ <p>For information about the status of C defect reports, please see
+ <a href="https://gcc.gnu.org/projects/c-dr-status.html">this page</a>.
+ </p>
+-->
+
+ <h2 id="c2x">C2x Support in GCC</h2>
+
+ <p>GCC has experimental support for the next revision of the C
+ standard.</p>
+
+ <p>C2X features are available since GCC 9. To enable C2X support, add the
+ command-line parameter <code>-std=c2x</code> to your <code>gcc</code> command
+ line. Or, to enable GNU extensions in addition to C2X features, add
+ <code>-std=gnu2x</code>. These options are available since
+ <a href="../gcc-9/changes.html">GCC 9</a>.</p>
+
+ <p><strong>Important</strong>: Because the ISO C2X standard is still
+ evolving, GCC's support is <strong>experimental</strong>. No attempt will
+ be made to maintain backward compatibility with implementations of C2X
+ features that do not reflect the final standard.</p>
+
+ <h2>C2X Language Features</h2>
+
+ <table class="cxxstatus">
+ <tr class="separator">
+ <th>Language Feature</th>
+ <th>Proposal</th>
+ <th>Available in GCC?</th>
+ <th>Notes</th>
+ </tr>
+ <!-- Pre-Oct 2019 Papers -->
+ <tr>
+ <td>Evaluation formats</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2186.pdf">N2186</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Clarifying the restrict Keyword v2</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2260.pdf">N2660</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Harmonizing static_assert with C++</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2265.pdf">N2665</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>nodiscard attribute</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2667.pdf">N2667</a></td>
+ <td class="supported"><a href="../gcc-11/changes.html">GCC 11</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>maybe_unused attribute</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2670.pdf">N2670</a></td>
+ <td class="supported"><a href="../gcc-10/changes.html">GCC 10</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>TS 18661 Integration</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2314.pdf">N2314</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2341.pdf">N2341</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2401.pdf">N2401</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2359.pdf">N2359</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2546.pdf">N2546</a></td>
+ <td class="unsupported">?</td>
+ <td>This is supported at least partially.</td>
+ </tr>
+ <tr>
+ <td>Preprocessor line numbers unspecified</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2322.htm">N2322</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>deprecated attribute</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2334.pdf">N2334</a></td>
+ <td class="supported"><a href="../gcc-10/changes.html">GCC 10</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Attributes</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2335.pdf">N2335</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2554.pdf">N2554</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Defining new types in offsetof</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2350.htm">N2350</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>fallthrough attribute</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2408.pdf">N2408</a></td>
+ <td class="supported"><a href="../gcc-10/changes.html">GCC 10</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Two's complement sign representation</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2412.pdf">N2412</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Adding the u8 character prefix</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2418.pdf">N2418</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Remove support for function definitions with identifier lists</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2432.pdf">N2432</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <!-- Oct 2019 Papers -->
+ <tr>
+ <td>*_IS_IEC_60559 feature test macros</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2379.htm">N2379</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Floating-point negation and conversion</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2416.pdf">N2416</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Annex F.8 update for implementation extensions and rounding</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2384.pdf">N2384</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>_Bool definitions for true and false</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2393.pdf">N2393</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <!-- Mar 2020 Papers -->
+ <tr>
+ <td>[[nodiscard("should have a reason")]]</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2448.pdf">N2448</a></td>
+ <td class="supported"><a href="../gcc-11/changes.html">GCC 11</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Allowing unnamed parameters in function definitions</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2480.pdf">N2480</a></td>
+ <td class="supported"><a href="../gcc-11/changes.html">GCC 11</a></td>
+ <td></td>
+ </tr>
+ <!-- Aug 2020 Papers -->
+ <tr>
+ <td>Free positioning of labels inside compound statements</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2508.pdf">N2508</a></td>
+ <td class="supported"><a href="../gcc-11/changes.html">GCC 11</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Clarification request for C17 example of undefined behavior</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2517.pdf">N2517</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Querying attribute support</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2553.pdf">N2553</a></td>
+ <td class="supported"><a href="../gcc-11/changes.html">GCC 11</a></td>
+ <td></td>
+ </tr>
+ <!-- Nov 2020 Papers -->
+ <tr>
+ <td>Binary literals</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2549.pdf">N2549</a></td>
+ <td class="supported"><a href="../gcc-11/changes.html">GCC 11</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Allow duplicate attributes</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2557.pdf">N2557</a></td>
+ <td class="supported"><a href="../gcc-11/changes.html">GCC 11</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Character encoding of diagnostic text</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2563.pdf">N2563</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>What we think we reserve</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2572.pdf">N2572</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Decimal floating-point triples</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2580.htm">N2580</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Remove mixed wide string literal concatenation</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2594.htm">N2594</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Update to IEC 60559:2020</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2600.pdf">N2600</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Compatibility of Pointers to Arrays with Qualifiers</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2607.pdf">N2607</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <!-- Apr 2021 Papers -->
+ <tr>
+ <td>String functions for freestanding implementations</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2524.htm">N2524</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Digit separators</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2626.pdf">N2626</a></td>
+ <td class="supported"><a href="../gcc-12/changes.html">GCC 12</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Missing DEC_EVAL_METHOD</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2640.htm">N2640</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Missing +(x) in table</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2641.htm">N2641</a></td>
+ <td class="other">N/A</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Add support for preprocessing directives elifdef and elifndef</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2645.pdf">N2645</a></td>
+ <td class="supported"><a href="../gcc-12/changes.html">GCC 12</a></td>
+ <td></td>
+ </tr>
+ </table>
+
+ <h2 id="c17">C17 Support in GCC</h2>
+
+ <p>C17 was published in July 2018. There are no major changes in this edition,
+ only technical corrections and clarifications. This mode is the default since
+ GCC 11 (<a href="https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=c76dc9c3">git</a>);
+ it can be explicitly selected with the <code>-std=c17</code> command-line
+ flag, or <code>-std=gnu17</code> to enable GNU extensions as well.</p>
+
+ <h2 id="c11">C11 Support in GCC</h2>
+
+ <p>This mode can be selected with the <code>-std=c11</code> command-line flag,
+ or <code>-std=gnu11</code> to enable GNU extensions as well (available since
+ <a href="../gcc-4.7/changes.html">GCC 4.7</a>).</p>
+
+ <table class="cxxstatus">
+ <tr class="separator">
+ <th>Language Feature</th>
+ <th>Proposal</th>
+ <th>Available in GCC?</th>
+ <th>Notes</th>
+ </tr>
+ <tr>
+ <td>A finer-grained specification for sequencing</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1252.htm">N1252</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Clarification of expressions</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1282.pdf">N1282</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Extending the lifetime of temporary objects (factored approach)</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1285.htm">N1285</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Requiring signed char to have no padding bits</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1310.htm">N1310</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Initializing static or external variables</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1311.pdf">N1311</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Conversion between pointers and floating types</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1316.htm">N1316</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Adding TR 19769 to the C Standard Library</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1326.pdf">N1326</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Static assertions</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1330.pdf">N1330</a></td>
+ <td class="supported"><a href="../gcc-4.6/changes.html">GCC 4.6</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Parallel memory sequencing model proposal</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1349.htm">N1349</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Analyzability (#1, #4 - conditionally normative)</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1350.htm">N1350</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>FLT_EVAL_METHOD issues (first change only)</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1353.pdf">N1353</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>_Bool bit-fields</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1356.htm">N1356</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Technical corrigendum for C1X</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1359.htm">N1359</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Benign typedef redefinition</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1360.htm">N1360</a></td>
+ <td class="supported"><a href="../gcc-4.6/changes.html">GCC 4.6</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Thread-local storage</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1364.htm">N1364</a></td>
+ <td class="supported"><a href="../gcc-4.9/changes.html">GCC 4.9</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Constant expressions</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1365.htm">N1365</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Contractions and expression evaluation methods</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1367.htm">N1367</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>FLT_EVAL_METHOD and return</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1382.htm">N1382</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Floating-point to int/_Bool conversions</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1391.htm">N1391</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Analyzability (along the lines)</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1394.htm">N1394</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Wide function returns (alternate proposal)</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1396.htm">N1396</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Alignment</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1397.htm">N1397</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1447.htm">N1447</a></td>
+ <td class="supported"><a href="../gcc-4.7/changes.html">GCC 4.7</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Anonymous member-structures and unions (modulo "name lookup")</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1406.pdf">N1406</a></td>
+ <td class="supported"><a href="../gcc-4.6/changes.html">GCC 4.6</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Completeness of types</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1439.pdf">N1439</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Generic macro facility</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1441.htm">N1441</a></td>
+ <td class="supported"><a href="../gcc-4.9/changes.html">GCC 4.9</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Dependency ordering for C memory model</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1444.htm">N1444</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Subsetting the standard</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1460.htm">N1460</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Assumed types in F.9.2</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1468.htm">N1468</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Supporting the 'noreturn' property in C1x</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1478.htm">N1478</a></td>
+ <td class="supported"><a href="../gcc-4.7/changes.html">GCC 4.7</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Updates to C++ memory model based on formalization</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1480.htm">N1480</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Explicit initializers for atomics</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1482.htm">N1482</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Atomics proposal (minus ternary op)</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1485.pdf">N1485</a></td>
+ <td class="supported"><a href="../gcc-4.9/changes.html">GCC 4.9</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>UTF-8 string literals</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1488.htm">N1488</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Optimizing away infinite loops</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1509.pdf">N1509</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Conditional normative status for Annex G</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1514.pdf">N1514</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Creation of complex value</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1464.htm">N1464</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Recommendations for extended identifier characters for C and C++</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1518.htm">N1518</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Atomic C1x/C++0x compatibility refinements (1st part only)</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1526.pdf">N1526</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Small fix for the effect of alignment on struct/union type compatibility</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1532.htm">N1532</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Synthesis re _Atomic</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1537.htm">N1537</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Clarification for wide evaluation</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1531.pdf">N1531</a></td>
+ <td class="unsupported">?</td>
+ <td></td>
+ </tr>
+ </table>
+
+ <h2 id="c99">C99 Support in GCC</h2>
+
+ <p>C99 is substantially completely supported as of GCC 4.5
+ (with <code>-std=c99 -pedantic-errors</code> used;
+ <code>-fextended-identifiers</code> also needed to enable extended
+ identifiers before GCC 5), modulo bugs and floating-point
+ issues (mainly but not entirely relating to optional C99 features from
+ Annexes F and G). The following table gives more details of the C99
+ support in different GCC versions.</p>
+
+ <p>This table is based on the list in the foreword to <a
+ href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf">N1256</a>
+ (ISO/IEC 9899:1999 (E), consolidated with ISO/IEC 9899:1999/Cor.1:2001
+ (E), ISO/IEC 9899:1999/Cor.2:2004 (E) and ISO/IEC 9899:1999/Cor.3:2007
+ (E)).</p>
+
+ <p>The "Version" column indicates the first GCC version in which
+ support for the relevant feature was substantially present; some bugs
+ or corner cases may have been fixed in later versions; this column is
+ "N/A" if nothing is needed from the compiler for the feature to be
+ substantially supported (for example, if the feature refers to
+ addition of new library functions rather than language features), even
+ if additional compiler features could be useful in conjunction with
+ it. It is assumed that GCC is used with <code>-std=c99
+ -pedantic-errors</code> (for versions 3.0 and later), as well
+ as <code>-fextended-identifiers</code> in the case of that feature
+ before GCC 5.
+ Where library cooperation is required, it is assumed that a recent
+ version of the GNU C Library is in use, and support with other C
+ libraries may be less good. Where the version listed is before GCC
+ 3.0, it should not be assumed that all corner cases follow C99 before
+ GCC 3.0, even if there is no specific note regarding corner cases.</p>
+
+ <p>See below the table for further notes on some issues.</p>
+
+ <p>This mode can be selected with the <code>-std=c99</code> command-line
+ flag, or <code>-std=gnu99</code> to enable GNU extensions as well.</p>
+ <p>Not all C99 documents are publicly available, so the documents
+ referenced in this section may be missing.</p>
+
+ <table class="cxxstatus">
+ <tr class="separator">
+ <th>Language Feature</th>
+ <th>Proposal</th>
+ <th>Available in GCC?</th>
+ <th>Notes</th>
+ </tr>
+ <tr>
+ <td>restricted character set support via digraphs and
+ <code><iso646.h></code> (originally specified in AMD1)</td>
+ <td></td>
+ <td class="supported">GCC 2.7</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>wide character library support in <code><wchar.h></code> and
+ <code><wctype.h></code> (originally specified in AMD1)</td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>Library feature, no compiler support required. GCC doesn't have
+ <code>wprintf</code>, <code>wscanf</code> and <code>wcsftime</code>
+ format checking support.</td>
+ </tr>
+ <tr>
+ <td>more precise aliasing rules via effective type</td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>Optimization, no compiler support required. GCC has optimized based
+ on aliasing rules since GCC 2.95.</td>
+ </tr>
+ <tr>
+ <td>restricted pointers</td>
+ <td>N448</td>
+ <td class="supported">GCC 2.95</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>variable length arrays</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n683.htm">N683</a></td>
+ <td class="supported">GCC 0.9</td>
+ <td>Various corner cases fixed in GCC 4.5.</td>
+ </tr>
+ <tr>
+ <td>flexible array members</td>
+ <td></td>
+ <td class="supported">GCC 3.0</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td><code>static</code> and type qualifiers in parameter array
+ declarators</td>
+ <td></td>
+ <td class="supported"><a href="../gcc-3.1/changes.html">GCC 3.1</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>complex (and imaginary) support in <code><complex.h></code></td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n620.ps">N620</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n638.ps">N638</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n657.ps">N657</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n694.ps">N694</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n809.ps">N809</a>
+ </td>
+ <td class="supported">GCC 3.0</td>
+ <td>New functions are a library issue not requiring much compiler
+ support (some built-in functions present). Complex numbers are
+ supported with <code>__complex__</code> since GCC 2.5, and with
+ C99 <code>_Complex</code> since GCC 3.0. Complex multiplication
+ and division support C99 special cases since GCC 4.0. Various
+ corner cases were fixed in GCC 4.5. GCC does not support the
+ Annex G imaginary types, but this support is optional, and complex
+ multiplication and division have excess overflows at runtime
+ (although not beyond those permitted by C99).</td>
+ </tr>
+ <tr>
+ <td>type-generic math macros in <code><tgmath.h></code></td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n693.ps">N693</a></td>
+ <td class="supported">N/A</td>
+ <td>Library feature; GCC built-in functions may be used in implementing
+ it.</td>
+ </tr>
+ <tr>
+ <td>the <code>long long int</code> type and library functions</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n601.ps">N601</a></td>
+ <td class="supported">GCC 1.27</td>
+ <td>New functions are a library issue not requiring much compiler
+ support (some built-in functions present).</td>
+ </tr>
+ <tr>
+ <td>increased minimum translation limits</td>
+ <td>N590</td>
+ <td class="supported">GCC 0.9</td>
+ <td>GNU policy has always avoided arbitrary limits.</td>
+ </tr>
+ <tr>
+ <td>additional floating-point characteristics in <code><float.h></code></td>
+ <td></td>
+ <td class="supported">GCC 3.0</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>remove implicit <code>int</code></td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n635.htm">N635</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n692.htm">N692</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n722.htm">N722</a>
+ </td>
+ <td class="supported">GCC 3.0</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>reliable integer division</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n617.htm">N617</a></td>
+ <td class="supported">GCC 0.9</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>universal character names (<code>\u</code> and <code>\U</code>)</td>
+ <td></td>
+ <td class="supported"><a href="../gcc-3.1/changes.html">GCC 3.1</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>extended identifiers</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n717.htm">N717</a></td>
+ <td class="supported"><a href="../gcc-4.1/changes.html">GCC 4.1</a></td>
+ <td>Some corner cases were fixed in GCC 5; <code>-fextended-identifiers</code>
+ was needed to enable this feature before that version.</td>
+ </tr>
+ <tr>
+ <td>hexadecimal floating-point constants and <code>%a</code> and
+ <code>%A</code> <code>printf</code>/<code>scanf</code> conversion
+ specifiers</td>
+ <td>N308</td>
+ <td class="supported">GCC 2.8</td>
+ <td>Conversion specifiers are a library issue (format checking support
+ present).</td>
+ </tr>
+ <tr>
+ <td>compound literals</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n716.htm">N716</a></td>
+ <td class="supported"><a href="../gcc-3.1/changes.html">GCC 3.1</a></td>
+ <td>The syntax was supported by GCC by version 1.21, but with significant
+ differences from C99 requirements until GCC 3.1.</td>
+ </tr>
+ <tr>
+ <td>designated initializers</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n494.pdf">N494</a></td>
+ <td class="supported">GCC 3.0</td>
+ <td>The syntax was supported since GCC 2.5, but with significant
+ differences from C99 requirements until GCC 3.0.</td>
+ </tr>
+ <tr>
+ <td><code>//</code> comments</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n644.htm">N644</a></td>
+ <td class="supported">GCC 2.7</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>extended integer types and library functions in
+ <code><inttypes.h></code> and <code><stdint.h></code></td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>All of this can be provided by the library rather than the
+ compiler (some built-in function support also
+ present). <code><stdint.h></code> is provided by GCC (as of
+ version 4.5), or fixed where the system headers provide a
+ nonconforming version, on some but not yet all systems. On
+ systems where types in this header have been defined
+ as <code>char</code>, GCC retains this definition although it is
+ not permitted by C99.</td>
+ </tr>
+ <tr>
+ <td>remove implicit function declaration</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n636.htm">N636</a></td>
+ <td class="supported">GCC 3.0</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>preprocessor arithmetic done in <code>intmax_t</code>/<code>uintmax_t</code></td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n736.htm">N736</a></td>
+ <td class="supported"><a href="../gcc-3.3/changes.html">GCC 3.3</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>mixed declarations and code</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n740.htm">N740</a></td>
+ <td class="supported">GCC 3.0</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>new block scopes for selection and iteration statements</td>
+ <td></td>
+ <td class="supported">GCC 3.0</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>integer constant type rules</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n629.htm">N629</a></td>
+ <td class="supported"><a href="../gcc-3.3/changes.html">GCC 3.3</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>integer promotion rules</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n725.htm">N725</a></td>
+ <td class="supported"><a href="../gcc-4.0/changes.html">GCC 4.0</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>macros with a variable number of arguments</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n707.htm">N707</a></td>
+ <td class="supported">GCC 2.95</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>the <code>vscanf</code> family of functions in
+ <code><stdio.h></code> and <code><wchar.h></code></td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>Library feature, no compiler support required (format checking
+ support present).</td>
+ </tr>
+ <tr>
+ <td>additional math library functions in <code><math.h></code></td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>Library feature, no compiler support required (various built-in
+ functions present).</td>
+ </tr>
+ <tr>
+ <td>treatment of error conditions by math library functions
+ (<code>math_errhandling</code>)</td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>Library feature, no compiler support required.</td>
+ </tr>
+ <tr>
+ <td>floating-point environment access in <code><fenv.h></code></td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>Library feature, no compiler support required.</td>
+ </tr>
+ <tr>
+ <td>IEC 60559 (also known as IEC 559 or IEEE arithmetic) support</td>
+ <td></td>
+ <td></td>
+ <td>Optional feature, not properly supported in GCC.</td>
+ </tr>
+ <tr>
+ <td>trailing comma allowed in <code>enum</code> declaration</td>
+ <td></td>
+ <td class="supported">GCC 0.9</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td><code>%lf</code> conversion specifier allowed in <code>printf</code></td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>Library feature, no compiler support required (format checking
+ support present).</td>
+ </tr>
+ <tr>
+ <td>inline functions</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n741.htm">N741</a></td>
+ <td class="supported"><a href="../gcc-4.0/changes.html">GCC 4.0</a></td>
+ <td>Inline function support present since at least GCC 1.21, but
+ with major differences from C99 semantics until 4.3.</td>
+ </tr>
+ <tr>
+ <td>the <code>snprintf</code> family of functions in <code><stdio.h></code></td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>Library feature, no compiler support required (format checking
+ support present).</td>
+ </tr>
+ <tr>
+ <td>boolean type in <code><stdbool.h></code></td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n815.htm">N815</a></td>
+ <td class="supported">GCC 3.0</td>
+ <td>GCC 2.95 had <code><stdbool.h></code>, but based on an
+ early draft with major differences from C99 semantics.</td>
+ </tr>
+ <tr>
+ <td>idempotent type qualifiers</td>
+ <td>N505</td>
+ <td class="supported">GCC 3.0</td>
+ <td>Always has been allowed, with a warning as required by C90
+ depending on GCC version.</td>
+ </tr>
+ <tr>
+ <td>empty macro arguments</td>
+ <td>N570</td>
+ <td class="supported">GCC 0.9</td>
+ <td>Undefined behavior in C90, but GCC not known ever to have
+ handled them contrary to C99.</td>
+ </tr>
+ <tr>
+ <td>new structure type compatibility rules (tag compatibility)</td>
+ <td>N522</td>
+ <td class="supported">GCC 0.9</td>
+ <td>This relates to compatibility between translation units.</td>
+ </tr>
+ <tr>
+ <td>additional predefined macro names</td>
+ <td></td>
+ <td class="supported">GCC 3.0</td>
+ <td>Support for the compiler to implicitly preinclude a file
+ <code>stdc-predef.h</code> provided by the C library, and so
+ predefine macros relating to library properties for the whole
+ translation unit, is new in GCC 4.8.</td>
+ </tr>
+ <tr>
+ <td><code>_Pragma</code> preprocessing operator</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n634.ps">N634</a></td>
+ <td class="supported">GCC 3.0</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>standard pragmas</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n631.htm">N631</a><br>
+ <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n696.ps">N696</a></td>
+ <td class="unsupported">No</td>
+ <td>Not implemented. Associated command-line options to control
+ the state of the pragmas for the whole translation unit are
+ available.</td>
+ </tr>
+ <tr>
+ <td><code>__func__</code> predefined identifier</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n611.ps">N611</a></td>
+ <td class="supported">GCC 2.95</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td><code>va_copy</code> macro</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n671.htm">N671</a></td>
+ <td class="supported">GCC 3.0</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>additional <code>strftime</code> conversion specifiers</td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>Library feature, no compiler support required (format checking
+ support present).</td>
+ </tr>
+ <tr>
+ <td>LIA compatibility annex</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n792.htm">N792</a></td>
+ <td class="other">N/A</td>
+ <td>This annex describes how C relates to another standard, and
+ does not impose any requirements on C implementations.</td>
+ </tr>
+ <tr>
+ <td>deprecate <code>ungetc</code> at the beginning of a binary file</td>
+ <td></td>
+ <td class="supported">N/A</td>
+ <td>Library feature, no compiler support required.</td>
+ </tr>
+ <tr>
+ <td>remove deprecation of aliased array parameters</td>
+ <td></td>
+ <td class="supported">GCC 0.9</td>
+ <td>GCC has never done anything regarding this deprecation.</td>
+ </tr>
+ <tr>
+ <td>conversion of array to pointer not limited to lvalues</td>
+ <td></td>
+ <td class="supported"><a href="../gcc-3.1/changes.html">GCC 3.1</a></td>
+ <td>Some support since GCC 2.0, but with major differences from
+ C99 requirements before GCC 3.1.</td>
+ </tr>
+ <tr>
+ <td>relaxed constraints on aggregate and union initialization</td>
+ <td></td>
+ <td class="supported">GCC 1.21</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>relaxed restrictions on portable header names</td>
+ <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n772.htm">N772</a></td>
+ <td class="supported">GCC 0.9</td>
+ <td>GCC has never had such restrictions itself.</td>
+ </tr>
+ <tr>
+ <td><code>return</code> without expression not permitted in function
+ that returns a value (and vice versa)</td>
+ <td></td>
+ <td class="supported">GCC 3.0</td>
+ <td></td>
+ </tr>
+ </table>
+
+ <h2 id="c89">C89 Support in GCC</h2>
+
+ GCC has full support for the 9899:1990 C standard as modified by the 1995
+ technical corrigendum and some later defect reports.
+
+ <p>This mode is the default in GCC versions prior to 5.1; it can be
+ explicitly selected with the <code>-std=c89</code> command-line flag,
+ or <code>-std=gnu89</code> to enable GNU extensions as well.</p>
+
+</body>
+</html>