<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/64635>64635</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Clang should warn for implementation-defined constant expressions
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Eisenwave
      </td>
    </tr>
</table>

<pre>
    The following code doesn't compile for all major compilers, but receives no warnings from `-Wall -Wpedantic -Wextra`:
```c
const float x = 0;
const float y = x;
```
This code isn't portable, even with the C23 relaxations. [GCC and clang allow it, but MSVC rejects it](https://godbolt.org/z/h45qsx8aW). It is technically legal C, but the portability issues at least deserve a warning.

## Relevant Wording

> More latitude is permitted for constant expressions in initializers. Such a constant expression shall
be, or evaluate to, one of the following:
> - a named constant,
> - a compound literal constant,
> - an arithmetic constant expression,
> - a null pointer constant,
> - an address constant, or
> - an address constant for a complete object type plus or minus an integer constant expression

\- [**6.6 Constant expressions** p9][c23]

For the initialization of `y`, obviously only the first and third bullets can apply. *Arithmetic constant expressions* are built on top of *named constants*, so the only question is whether `x` is a named constant.

> An identifier that is:
> - an enumeration constant,
> - a predefined constant, or
> - declared with storage-class specifier `constexpr` and has an object type,
>
>is a *named constant*, as is [...]

\- [**6.6 Constant expressions** p7][c23]

`x` is not a named constant, because it is not `constexpr`. However, this code is not ill-formed, merely implementation-defined:

> An implementation may accept other forms of constant expressions; however, they are not an integer constant expression.

\- [**6.6 Constant expressions** p14][c23]

[c23]: https://open-std.org/JTC1/SC22/WG14/www/docs/n3096.pdf#148

## Suggested Solution

Clang should issue a warning, along the lines of:
```
initialization of 'y' relies on implementation-defined constant expressions [-Wnon-portable-constexpr]
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVk2P4roS_TVmU0oUHMLHggXQw7z3pNm8Hl3WTlwkHjl2xq7wMb_-yk5DA03P1Vyp1cR2uVx1zimXhfeqNohLVqxZ8TISPTXWLb8oj-YoDjgqrTwvvzcIe6u1PSpTQ2UlgrToDeMzgsq2ndLBwIHQGlrxw7rLrPOMb6DsCRxWqA7owVg4CmeUqT3snW2BTbNkF3Ymuw6lMKQqSHZ4IifYNGP5imUvLFuF7_hXDePKGk-w11YQnIDlL5CxfP1x7RzXTte1q59h-L1RfkhJvSXUWUei1BgixwMaOCpqgBqEDc_BoRYnQcoanwIr1l83GxBGQqWFqQMA9giKLll_e_1rAw5_YEU-TBcvjM8bos6HvPiW8W1tZWk1pdbVjG9_Mb5tJsVPf5qLHeOLFP5LoDwQVo1RldD6DBproWFzOSNENsSstKIzKO979CAINApPINGjOyCIC-7pGxDDf54znsP_UeNBGIKddVKZ-s4k_wLfrEPQghT1ESro0LWKCGUkPgIetuOpc-h9gAeUAWUUKaHVL3Q-hde-akA8MwbfCK2H48qIvHWAB6F7QQhk44xBsPuY7lWM7-rIv0ACAoxoUV5PYHxzvxxkaXsjQStCJ_SnlgaEU9S0GNT4JOAPnk2vNXRWGUL3O69SBg-3FmDdPxgNtRWD10gItgyCAjp3CJ3ufQCrVab3YXOIoManlNyRWmySoF_GV4yvpukUNk84HFahWwTlFuuK5-Hjxs3WusjIlehYGoEnNs3OocpCguVB2d7rM1ijzwODynmKhUONchLKXmskD1VIv-v0OQXGV6vfchCiA-EQyl5pAmuAbBeP5qt7HQx5bMDbeHiM4mePPsaqPBwbpAZdiPnEplmYepRS-lgRKwNKoiG1VxgwEKFOH_VoAE3fohtQ-VSWnUOJe2XupfsgDImVFg7lcB95sk7UmFRaeA--w2oIJFyQwUWAKaQSIG5EVMaNbG4juH7ErD9g9wad8AEVVqzTNH3QwJ9JafaZlG7AN5ae1TKUWIneIyi6WD2km8J_7BEP6II13Vzt0Vhpneyta1GG5RYd6jOoUFQtGoocJW88vBN5R_idLbTiDKKqsCOwUT_BuQ8KfKrWfA3NbXR4juqNyf62btN_j_Z48inc18l8BfctyXZoEk_yrSf97_tmzPj2dcM549vd1_GE8e3xeGR8K23lGd-aPFtM007uGc_Hk_mT_vLa1zX60C5ere7p4TLaxObpG9trOfSv924VxaetqWPpamUwIPzxWTAMn9xDfHZmfBYatwpbH1lMHivvroexYp3sjDXJ5VWQvMvtiuclhJFc5nKRL8QIl-PpYjzn-SLLRs1yKhb7MpuM5aRazKbzvOJjMS72ucAcp_PFfqSWPON5Nh_zbJYVWZYKmYlZlos8n_MMi4JNMmyF0qnWhzbwMoowLaeTaV6MtChR-_iI49zgccCQcR7edG4Z9iRlX3s2ybTy5N-9kCKNyzv8A-6x4_wBTqPe6eXDu0ZR05dpZVvGt-G8t5-kczbcQ4xvh5cK49uYxd8BAAD__92oZHY">