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

    <tr>
        <th>Summary</th>
        <td>
            [RISC-V] Empty structs are ignored when passing in C++
        </td>
    </tr>

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

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

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

<pre>
    According to RISC-V integer calling convention:
> Empty structs or union arguments or return values are ignored by C compilers which support them
as a non-standard extension. **This is not the case for C++, which requires them to be sized types.**

```C++
struct Empty {};

int after_empty(int i0, Empty e, int i1)
{
        return i1;
}

int after_empty_on_stack(
    int i0, int i1, int i2, int i3, int i4, int i5, int i6, int i7, Empty e, int i8)
{
        return i8;
}
```

Clang doesn't assign a register nor a stack slot to the empty struct for passing:
```asm
after_empty(int, Empty, int): # @after_empty(int, Empty, int)
        mv      a0, a1
 ret
after_empty_on_stack(int, int, int, int, int, int, int, int, Empty, int): # @after_empty_on_stack(int, int, int, int, int, int, int, int, Empty, int)
        ld      a0, 0(sp)
        ret
```

I'd expect these functions to be `mv a0, a2` and `ld a0, 8(sp)` respectively.

This also doesn't match GCC which does allocate a register and stack slot to the empty struct argument. [Comparison with GCC on Godbolt](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXLnwEEAqgGdMABQAenAAy8AVhNK0mDUMgCkAJgBCZ86UX1kBPAMqN0AYVS0AriwYhTpFwAZPAZMADlvACNMYgkpAAdUeUJHBncvHz9SROSHAWDQiJZo2MkbTDs8hiECJmICdO9ff1tMe1SauoIC8KiYuJta%2BsbMlqHukN7i/skAShtUT2Jkdg55AmJPewBqbBZ4ggBPbeMAdktTgBFjAGZLdQBBY0eQgm2mdHQIV%2B28dVJdvsjttMACfnguLNnk9ztDngBOYiYAhLBi/dQnCy/Li3e4w66PaE/D7oAD6AlJ6yYyAA1t9BOiwQyIUy3nh/L9mTdWb8ACw8vAAVgFADYBacAXsDsdQZy2QAOKGE2GE9SI5Go36nTHmX7y3Fwq4cea0TiC3i%2Bbi8VCcVxWKzbeSLZaYTE3HikAgaY3zGkgG43AB0AZDobDYtNHF5Fu9pBtHF48hA/y9HE08zgsCQaH2dBi5EoOfiedixAAbiLeQBaZD6QxceVcf40WgEGJJiCRWOREJ1Q6cD095jEQ4AeUiWjaqY9ObYglHDFo/bTvCwkU8wFcYloSatpCwLAMwHEK/3eCR7TLmF3mgCKjanjbA94rwqsdoeEixD77iwsY2eAsM%2BpBXsQkRJJglyYIehgfoY3rzFQ%2BjAPIABqeCYAA7qO8SMMB/CCCIYjsGUBFyIoqixjoUh1kY9oWHon5JpA8yoAcqS7lWo4AF7WqBxB4FgzEQPMrTtE4EAuCMvhSEEkxFCUug5CkAjSUpSQqQwPQKTM5SVB04xqVIYlVJ09TaX0pSDF0RnWeZ8mWRIonOisTl6GaManvG2wAEoAJJCK4Vaods5aVsAyDbLWR7bA2gZcIGGIQLghAkG6kK8Km6a%2Bv6QZhvlIYRpw0akJat7xomyaeghpCZogKCoLm9BkBQEBFiWIBhdWEXIFwvJNnwdBtsQHZdqeQ59sBE0juOk72MBs6MAQC5LrGa4blutA7sBB5Hiet74BeDhXjevCYPeyCPqsHqvpGt4fl%2BP4YKst4AUBe6geBihQTBx4hKAK6IchaEYdhuGWh6ZFEeIpEyAoyhqKeOj%2BLRKD0dYD3Cax7ECJxPF8TEAlCfAokVFOqTOAwbgeE0uhyYUjkJBpVS2cpVQWdMVkmQZNk05kxlk%2BJ1TjBzinGYZfMyXZEwM5zblOksrmQu5HDmqVsbef5gXBdsECVlWPYEPIszbD1sW8vFiW6ylRDEOlsyZQhOUBsGBX5SrJVldanCVSmTsq6YnnlT71WA/MoHJE4vJAA)

ISA: rv64gc
Clang version: 18.1.0 and Godbolt "trunk" at the time of filing this issue (2024-07-01).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0V1uTujjT_zTMTeo_hREEL-Yi4eCRUTwO3mwFiBA5REkQmU__FurMf97drX32uXgsynR10odfp5N0EyFYUlL6puhY0e0XUsuUV2-SFzQTvGEvIY_bNxRFvIpZmQDJwWqytn7tACslTWgFIpLn3UzEyystJeOl0keKaisqUvoOcIqzbIGQVR1JAXgF6pLxEpAqqQtaPlgVlXVVgivJayoAqShgSckrGoOwBRaIeHFmOa0EaFIWpUDU5zOvJJApLR6GiAAElLz8JSQpY1LFgN4kLQXj5StQIFIg2qRMACZAye-CICKCgiOvgKVAfP-sp_qKXmpWUXHX3wEOKRDsk8ZAtmcqXh_6nggf_wP18X3punMfmJ8BUAysGLbSxz_lWCkBOUpa_UG7RQo0Ow5TO18eYrQj78yeAodPWeNbyfAZOdb7rdmw_8HEH7z8Q0gSZQo0HwsAAOC31S9TTwp-U_1vSvum9G9q8E0Zf-e7-Y--m3_j-1dAf0KxclImIOZUlAo0JHikLiCgogkTklag5BUg4I4PiLzbaH7fa_ojB-97fu5ky-R3on7ZI-Iro_68Ld-4nqg6SH0EFNgHiqb-q-Xf8e5-xfUxknvcSe85W1H5Fwd-btpT9X89_CvX_xeG_h_oPP4JWlWgKc5_WfQdgr_NgokCje54n2l0P8jdKa7LqLt3xPOwKgO1uH4FFioDFZAy7rh5_OSa35YHKqio6JSxK83b15-m7lcGyQX_kXQFkVEKRtbXZdHNAJLnPCKS_szFzuR_yMSvO_AVKDq2eHEmFRO8BA2TDxO8BCMehzyXim4r0EylPIsuaaGrQDd5TL3yKrkz-p9KHy2CeZIiF19i3bduKGiWAfasAq9iPEduz7ciRJaOhbzPBksPGchvXOn5uEWrZDiTfuCgVrBQ9T_mZeM46JKMYg9hH9ESodZEu_R9phb21kusDE0TbB3Mwfajl-El8i7vKgp2axVVrAnSzdlt0GGJDh6y8yuy3r0gyc4IxVu6nY5xGV3Hn8P1arEeo73ts-mBQy8LN7YwU-ZY02JixYvh8diTHu2tSc0nljljQT2VRIE6xCL08su4zt4NpkBXZGidyu0GTrM40XVUTJe0wZcQH7QkwcuQeijO5CbB7gmNDvPYxzhQqZ8UsIjH_mR3VwnNeDeNr-IkpYesY5nU8_cyG35Ku0zwImABSue4sxb7pdUq0J2zPtWawWBJHAW6tsGRPUD5dNAGLUI9OcQL1vjtZNv2y7RbPiw28T40kdWYV4R2iYvsAJMIfQhbxP6hhT5azEYOHDnD9UQf8f6g3IyLD6Ptu81FiyhRN8zqs7uzITN3VrS77WefIV3PDyTYOP0xy1BCgv7nKEtGWh9hFR1sHtqBfB-7ulsPz1iOXc1MuxRqh2NHNT8TYflkDGPMdIcvjozG7IZQyObUx-RgD_xbRHfRUVP3iTOaTpm12i9WzrTnDyJbHeonx9cQ3bL9iVyC4SIMknxsu1yBbri5Wk22NRs3CnK-JvJsNXPkNWNnpkC3T62VsZkXbr9IrNmJlKcQDbWquYiYU4fdbMNgjQggRcK7Az7jD-Fnq-k0ydtgQtPkyIN-9en699kTWk4QvlArQMi4LMy152EFupZlTYKTGG2x2074hd1OfJv2smDI92Ne6tMzMluOosvayPdcQ66xv-Ab1tzk0_GXXrWRjuag2vKu6dpxsptrbetEtzJ0Wm_Pa__iN0t_tvH09Q6r2u2ymwT5bqoON-RDPa9tV12Ve3owi_1qwssFE5t8MCIeKa8j2CCHo-nUmmk7wmOhk51ArR3O9ysjRDA5RJPRaOJ3ZzkbDbKZOSsGj7y_DvxDes0nwercqCSbEmnceNESmqRn68CTmcXnxRBn2Hewy_YTnMZ752PiNtfpe9nEWAp_fIgv1NeHAjvqqV5kBvSwGHjIt_R5NSJamNcSGQJjfcyoNDRM7fTjRK9WsKSttbyI8eV6HkntmN89WmrBTEgNbTEdJBSz1N_gm5bO0GwwiVLiBHFaj_bp4OA6dHJ2WsTb9DKji9Nder6a2Woc2H2L3AzHmt6WrrlxUG4dEc927uKyWaAmTKij1mkbbE_ZFJ93axidd_4-9nZZ4R_eM1XPbnl21zftbU74k5Wj4HD02o-D03j6Z5gvMlEVfq2P7eKyEyE96skHjoVj7fL9MnCWE_EZ2j2xN68u2w_afGU7i1y0Bz9dbLEY4Q99XU13eUxKa7cuNuIyCMoy3xi9fXeUPD6eOtp1itDvSufxWq1R99RW14GWRD_LmCutxKNUBj3ztff6eKOetz1QIJRVXWYKhIA86lXJCgr4ERzZvdqWj3JW1BQo0IQq1H6pxi-1qxJfX-K3fjzsD8kLfesZvaHZ19Se8ZK-UaL3YBT2YyOKQ6j34ICYUFOP4dEkht4LX9hbp0k11F6v18m8wsikfWNAjkcjNrUhVDSVFoTlr3l-LbqX5-Xuw9vQgKb-kpOQ5uLeSkBY0ubhoAJh11lUb53Mr7BOhKKpORNS_NYimczvPcijuVB0-0-Nw8-moElp-VXCAVZ-VfAvdZW__emJZDKtw9eIFwp0O2PP4de54icaSQW6dxeFAt0HhOsb_L8AAAD__37sG6k">