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

    <tr>
        <th>Summary</th>
        <td>
            C: Add __lengthof__ operator
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          alejandro-colomar
      </td>
    </tr>
</table>

<pre>
    Hi!

I've sent a patch set to GCC for adding a `__lengthof__` operator:
<https://inbox.sourceware.org/gcc-patches/20240728141547.302478-1-alx@kernel.org/T/#t>

There's a related proposal for ISO C (wg14):
<https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2529.pdf>
(although the proposal is old (not authored by me), and isn't as curated as the GCC patches).

The specifications of the operator are:

```
The keyword __lengthof__ determined the length of an array operand,
that is, the number of elements in the array.
Its syntax is similar to sizeof.
The operand must be a complete array type or an expression of that type.
For example:

int a[n];
__lengthof__(a);  // returns n
__lengthof__(int [7][3]); // returns 7

The result of this operator is an integer constant expression,
unless the top-level array is a variable-length array.
The operand is only evaluated if the top-level array is a variable-length array.
For example:

__lengthof__(int [7][n++]);  // integer constant expression
__lengthof__(int [n++][7]);  // run-time value; n++ is evaluated
```

There are a few interesting reasons why this feature is better than just a macro around the usual sizeof division:

-  This keyword could be extended in the future to also give the length of a function parameter declared with array notation and a specified length.
-  This macro causes a compiler error if the argument is not an array (it's a constraint violation).
-  It results in a constant expression in some cases where sizeof would evaluate the operand.  For example: `__lengthof__(int [7][n++])`.
-  It only evaluates the operand once for VLAs, where the sizeof division would evaluate twice (one per sizeof call).

Please feel free to give any feedback for the feature in the GCC thread.

Also, are you interested in this feature?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVl2P4joS_TXmpQQKDjTwwEPDLLstrbQr3dF9bVXsCrjHsSPbgeb--qtywufM9MOVEKA4dVxV59SxMUazd0RrMd-I-bcRdungwxotfaDTwY-Vt77BMKq8Pq__Y4SciuKbKF777zchF0eCSC4BQotJHSBSguTh39st1D4Aam3cHhDES_H-bsnt08HX7-_ipQDfUsDkgygHPFFuDym1kR_InZA74yr_OYm-C4pOGGjiw17I3V6pcd6NopA7WchZsZDL6Ww6ny0mZSFni-V4Okb7KWbFDwqO7BD4PcOWSZT_uq_j-4ECCbmIgBDIYiINbfCtj2hzFW9__A-2IOTytJ_OhFz9PuPT6TTxLblxTHrY9COpqZC7qKTkFzICvyfkTnvFFTg5l6tJq-tbXnKJNh18tz9AOtAtGxPBW82pOJ-g54s0VGdoiBOTW0CnwUQn5CIBRlBdyAVhzEhMzLV3q8lTGyC2pExtFCbjXQRf56ALU4CBbrX33y_F8Lli_KDzyQcN93yDpkShMY50RuxXGB8dYAh47jdxWshtD5UOmMBELokjXNdUFDiCLDXkUgTj8koOHyp5SxHi2SX85FZF0xiLgQUZzV_k68kty2E7aLqYoCJAUL5pLaUBENK5JeCaHdBnGyhG413fEUx5dUDb-QD0iRz81BzDgyHmGyfm30S56R8-jIFcYtbTBqAXEARKXXAR3C_fZkQx3ywYcL4p-acPf4pePBMbKHY29emziC6MmsgFGpdoTwGUdzGhS3cVX_nonKXYiyj5dmzpSHZoFYPAEYPBytJ44PaelvuG8-7OnoGOaLssTVP_M9TfN_7LrjkhN_y59u7SvK-68AXsHd6wxxOjnRsn0xBwwcQrQwRXeO3CL8fpzp949gChplPOM1BM7KyBMPKkng7nntmaMHWBGLuilCiwXh18sMwRGlTBAwbfuX4Qu9ihHaYDtDmaXO1jN8cA3xn6MtjKd1bzzNBnIqeZwX4S6y5vnTygjR725kjP0w515xSbC7QYsGFXAE3KItvYyVwYBudT9qBsZ3jxJdID1uQxs74shV2kOEyysRSAQmCN14NP7Ds2Dm5Nds-L8zCVafD_zH1ApvZovM053IxyDPCWhlnK_oO_EgsvRN8QKOR8Tpm-ocWn3LsL6zd3dXoC8Cjon87Mr4X8Ujwk-TBj8X4j8E5RPtf-_O9r9tc-Q37lSQg_pXsyirhf3hG0FC7vK7T2-Tj5vyWMBDWRhTpQlkVWBLozP9UVqh85jSydi2zd9ZhKh0CoHzBfbfT5jAsEZ99dJ-EiwZv-Rbkb6XWpV-UKR7SeLmQ5my6Xcjo6rOvVbKlQ6mIhZwssqrkqinlF9aws9UrXxcis86ViOZ3KUi6K6UTz_3I1e6lLpZbzSswKatDYibXHhs_5kYmxo_W0kMvyZWSxIhvzrUpKxxPLq0JKvmSFNQeNq24fxaywJqZ4g0kmWVpvmf1X_XSEXjx71AW7frx27E06dNVE-UbIHYMNP-M2-A9Sie9SnALfNoYcj2v5dwAAAP__YNc8zQ">