<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/98159>98159</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[ARM32] 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>
Problem similar to #97285, opening new issue since the RISC-V one is closed. I'm less familiar with ARM32 so I can't point to the ABI wording that specifies empty struct handling.
```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;
}
```
```asm
after_empty(int, Empty, int):
mov r0, r1
bx lr
after_empty_on_stack(int, int, int, int, int, int, int, int, Empty, int):
ldr r0, [sp, #16]
bx lr
```
GCC passes `i1` and `i8` in `r2` and `[sp, #20]` respectively. [Comparison on Godbolt](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXLnwEEAqgGdMABQAenAAy8AVhNK0mDUMgCkAJgBCZ86UX1kBPAMqN0AYVS0AriwYhTpFwAZPAZMADlvACNMYgl/AAdUeUJHBncvHz9SROSHAWDQiJZo2K5/W0x7VKECJmICdO9fcsw7PIYauoIC8KiYuJta%2BsbM8qHukN7i/rKAShtUT2Jkdg55AmJPewBqbBZ4ggBPbeMAdktTgBFjAGZLdQBBY0eQgm2mKgIYgH1MfaOIK9tnh1KRdv9jpgwUC8FxZs8nucEc8AJzETAEJYMYFcW73RHXR4IoEfL7EX4Q74Cb7rJjIADWEAR2xZwMEwNBbLesOh7Lw/i5wJuvO5ABYRcCAKwSvAANhlpzBewOkJlAA54USkUT1GiMVjgWq8cirhx5rROJLeL5uLxUJxXFYrNt5ItlpgTqYbjxSAQNGb5vSQDcbgA6EMRyNR%2BUWjii63%2B0j2ji8eQgUF%2BjiaeZwWBIND7OgxciUAvxIuxOosABupwAtMh9IYuGquKCaLQyWmIJFE5EQnVDpwff3mMRDgB5SJaSqZn0FtiCCcMWhDrO8LCRTzAVxiWhp22kLAsAzAcTro94dFVauYA%2BaAIqSqeL7D3ivVqJ2h4SLEQfuLBEw2PAWDfUhb2ISIkkwS4/lPb9DH9eYqH0YB5AANTwTAAHcJ3iRgwP4QQRDEdhJGkQQFGUNQLx0KQmyMJ0LD0H800geZUAOVIDzrCcAC87Qg4g8CwNiIHmCoqicCAXBGXwpCCSYihKXQchSAQ5NUpJ1IYHplJmGxWlnapxk0qRJPaTp6j0vpSkGLozPs6ylNsiQJLdFY3L0S0EwvZN3mIGt6yYbZG1PbYW1DLhQ3UbYIFwQgSE9b1Zl4TNs0DYMwyjHKIxjTh41IG0H2TVN019JDSFzRAUFQQt6DICgIDLCsQCrYAuFFNs%2BDoLtKF7C9R0HMChvHKcZ3sMCF0YAhl1XRNN23XdaH3MDj3g1YH3wa8HFve9eEwJ9kBfVYfQ/WMH2/X9/wwTa0uE0DDwgqDFFgk9DAQ0B12Q1CMKw3D8JtH0iOEURxHIkGqNURMdH8BiUCY6wrrEjiuIEHj%2BMEmJhNE%2BAJKMqTfBkhg3A8JpdEUwpXKkNT2kc2nUhs6Y7IskyHLJzJzIJyzxiZlTzNMjn5KciYqeZrzXSWTy4W8jgrSKxN/IeAAlABZbYAHFXFcCLRSimK4oSohiGSuE0qQzKQ3DXKctlwrirtTgyozC3ZdMXySqdirvvmCDkicUUgA%3D)
ARM64 on Clang looks ok, it matches GCC and passes `i1` in `w2`
Clang version: 18.1.0 and Godbolt "trunk" at the time of filing this issue (2024-07-09).
cc @svs-quic @efriedma-quic
Part of dotnet/runtime#84834
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVluTqrj3_TT0S-p0QQCBh34INwEBRaQVX6a4RIjclIuon_5fYJ8-Z85Mzb9-XRRZSchea-9G9oq6jmQ1xh8UL1O8-hYNfd60H31T4aJrRvIWN-njY9M2cYkr0JGKlFEL-gZQkJUEKPIUVEBzwTWpM1DjEZCuGzDoSJ1g0OcYbE1f-fEJmhoD0oGkbDqcvgOTgkIFStx14BRVpCRRC0bS5wBtHRaCrgEmSKKagkIPLg2p-4lyCodkE4xNm050fR71oLvghJwI7gCuLv0DdH07JD3IozotSZ29U7RK0ejrvqBfl0JBebrm1a8T2nycEmRKUClW_v3cxB-detz-NXNQUJxWCD3l_jqGJzgvMhSUvs4K30GkFvdDW0-735EF9T8o_mrqv7o-SgoKiq8HAADgF-tPqi8EvxH7jbhvxH-jxTcS_k27-J_axX_R_rOgf0yjrnqt_KNq37RfpBMji36lOP1VzQ20c5ot8_ed-P4ay_Yf4X-v2BfP_zz8f8LKtJ3HlziKl7vLDCDLLChe_YfWnzL_KNNSUcAl6jrcAWpBE4Za0CCq03kiThNST7iFv238TgbpiWxBgxZPb39Pbrh8vE96lKa6RC3pmho0NVg2adyU_fQwFPO-v3RTRlCnoJ69tt6bNpsX2CfFonVoZznS5WvKe8odheMmlB2lkrepbCOd8ZQERRtNQc5zlHsHCcgb9d7x5AfaZtKq90INPToS097BrkdNQ9dsmTpI9hCuEXqI6DN3V3SlBk6mFMjKZOUoLoIDU8gb5FxdGoWfPo1aMob57qKP6LhBRwep5Q0prhNmJQV1hNIAB5Yh18nNeEr-du0baK96xDo2cMVTUN_Td-FzpSlWZSrpWjol3ShszDAaGlMRVyQcrD6iIA_lLnbEqzEUrkAoqLcr5Od9sINWkWY8jyprg0f5GstHLsvkTYwdlBb9LpP1M1oe7dST5ZDGXlbBapWZYWYwzilamyupr3NmtU1v0vmSjYEi6vdjJ9ZDoiUisp7aDmlW6IR6shfYrXHYcmajnWxBO3CewCmx0FpnE6l7DW3h_Tg62ujKsY27dS7YIwV1wo_WcFvzSA63iYJWo39DyM3Ly1PG47qwSoR4LvCLYMcsifN5zvZXMSFtfufb7dqysc0P9j2w7gc9bN2eN_vyku2uYXy--8hzlzF_8z01iTO00Jztw93OlQr2Z0IW7IzpMzwTEXtZoM_zM4nwcdzLpqsK6-yekADd7uZwXzcdkofLiHonl8xwWF6HlRLZ3mNfmZau8ZpXf6qX8XRiK2erZjLvW5F_Pda03hNFSZx9rrZr0Va2uyf6vJN9foGwsFGHnijZtY3EpfpnNIRoFhEh8-pfsS2oLLl9Xi2Yc76teafBlrURbtBePQV5DE3fLIrR5yiol5tYUg0Jh1eDDmUeIXc37hAyEosl22zccJ63VbU0t5aF5-nLwPXsO73yqodj0bZKGyJNZ_gYoPWnqT5bJUGKKHgZl4nK6BLTqJTmShIFHeTlYbwoih-SfHXwktxHHu8GF4sxQ-NSWtXyvi_r6HIv6OvW2kS7y-JM3y5-sbSb56ZbPEq3I55lp3rI2rRPa-Pt6LKVuewXjzA-LplNHO4Z1c49NohDUx-9zNekmDmW3M7taDV0xsfZWJn38y7nGHNJG3D36dKMZKm-_tyiQPe8fqGaSmaqttJ5ShuiQdfdbi6r2tj9ShcUaUsbjpLfjFVyZDtH0ekQ5SVz2LouZA9pZLCOemYzJjTYMRIN_YYlrI2WVMinz_DkTT9Kx4AU1A8SBfVx3EX0oNGqOmZXVdezQlKRR8sM9BjFWY2sKlq9QZO1Fmzvhlksr26wdVJDlEmghIuxbbUzGUzNOM8iHa2yclebMbJWznV3kos8Y5FoXVItGC-HVeHuYJHAOsi7RSiYXfEwbOtpPU3r8byTY7l7us655lcJCa_42D4P_n734PbiOWv91d2loG5ihEokH-MQGfpBTxR765NqxTV-k5OlP2j01XuuPFY9rJK-HFvS9rvs0TwV9pg6h4d_TUl7u1WKWpAkCLLprWXV716Lts6Cm77XShnVGSibpuhAU8x9qAdV1Cc57sDUNKZe8GfjePWKEf5qwvP9FeuG2440NcUiwIjvzPurnXz1BUBB2LdDXVAQgqif7VVPKgyaEziR8uWwSPfl6CgoQhpyP2jhBy1RUPqbsUoSQHF0d-t-XAcyY3xqCU6r6GthfmoTtf0UPG36GvfTV3eoJ0IKsiInstxb-sGmEitFb_iDESDNs1AU-Lf8I4W0JGHutBDYUyxBEXNSKkT0CQtxxDAL6Y18TNpogZYYlhN47j3mFrEE-QWMOYHhI35SVEWkfC_LWzV1vbc5qw9JZHjprYxiXHazBYbw28RSEE6OuP2YzvyIh6yjOLokXd_9itKTvpy98-xbKV798lQvT9mBqMWAZHXT4hSMOa7nf99UWVKDLxP6NrTlxx_dmfT5EL8nTTV9q8rbz-HHpW3OOJlKNyvsKKi_Mrh9wP8LAAD__ygToJ4">