<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/77036>77036</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[x86_64][clang] Empty structure argument are ignored in function variable arguments.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
CoTinker
</td>
</tr>
</table>
<pre>
demo
```
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern void *memset (void *__s, int __c, size_t __n);
struct S14 {
union{}a;
};
struct S14 s14;
void check14va (int z, ...) {
struct S14 arg, *p;
va_list ap;
__builtin_va_start(ap, z);
arg = __builtin_va_arg(ap, struct S14);
double va = __builtin_va_arg(ap, long double);
printf("%f\n", va);
if (va != 2.0L)
printf("Fail\n");
__builtin_va_end(ap);
}
int main() {
memset (&s14, '\0', sizeof(s14));
check14va(2, s14, 2.0L);
return 0;
}
```
clang output:
```
0.000000
Fail
```
gcc output:
```
2.000000
```
https://godbolt.org/z/6ErKWPq15
llvm IR
```
define dso_local noundef i32 @main() {
entry:
%retval = alloca i32, align 4
%agg.tmp = alloca %struct.S14, align 1
store i32 0, ptr %retval, align 4
call void @llvm.memset.p0.i64(ptr align 1 @s14, i8 0, i64 1, i1 false)
call void @llvm.memcpy.p0.p0.i64(ptr align 1 %agg.tmp, ptr align 1 @s14, i64 1, i1 false)
call void (i32, ...) @check14va(int, ...)(i32 noundef 2, x86_fp80 noundef 0xK40008000000000000000)
ret i32 0
}
```
I find that clang ignore the empty structure argument `s14`. As a result, the subsequent running result does not meet the expectation.
https://github.com/llvm/llvm-project/blob/597086c60959dd5b3c032552e8b42dd1d053f233/clang/lib/CodeGen/Targets/X86.cpp#L2698-L2701
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVl1v2zYU_TX0C1GButTngx8Sux6K9mFYC2xvAiVSMleaVEnKSPLrB1KKLadutglBJPHee-7HOaTFnJODFmKL8keU7zds8kdjtzvzTervwm5aw5-3XJwMIntEHlBBlr_5FajUnZq4wIjunOdKtskR0Y-_MEvzjtVKPazN8b948sJqfDaSYwQPJ3FywmME1etK0zgEOyy1x03ThUcnX0QT3jSCGtHHGch5O3Uef00zjMpHPC9ijPGkpdGofETlniH6akHl_hL6E4BLszfGWE13FN33NDuzUF8o6CWUkyQJgnqVFJF6hcXsELwQPIyr7KQ-s0ZJ5zFbLYdym6adpPJSN2fWOM-sR1CxMWC8zP2unJkdMKL726CYcQm5FvJTLDdTqwQO3byHoIweFt_1uAPCaKX2PYIKASDIe5TvdHzc4TN76yz7yGqYXRoSQkK-xLldPN5CHphUF8j6nSkJzZdy61uCVwQGuk5M6ggd2bqCXUWHoAjcR75KlO9IuC2SM6EsNw9y3dtFFQiq2PuCsDR4MwQr_GQ1Jld1Xaq83XidYnrAZvLj5BF9uOtDEhKv-S1O657b0HX_AgQ3QG-MR-9HFyLhgOAwGN4a5RMTFHJ4QXAoPtrPf_7-I83X01bqfMKf_rgLyEUvtcDcmUaZjimszaS56LGkgFFG7rEktLfPl_IxRpBb4c9MRe0yFYBCfJg7U3LQOFu5smFI_Glc-yLI562RfJ3ZmqPS1yjnjRWxIhKso7fXnHeSdEyp5QzLSGg-mTWVjCSRRYagCghLjuCzaERWM74sMpzGhxT3TLm41d7D7sbngH0f_tLxa-l3Ev-3hFAtQ3095DKylrvU_mqcnS9sxrCnqmj6sSKXVfL0OSOEVOT2WmW3wi9zf3eDfMK91Bz7I_N43ixy0IEzfxRYnEb_vJx9kxXhmJxOQnuMijiAgiT4wWGGrXCTij2EMDe1TvyYgqOdtJZ6WBwwN8JhbTw-CeHnFE-j6Dzz0uhkrfw320X649QmnTkhOATultuH0Zq_RecRHFplWgSHvC5JVXQFqfOa87ylHaGQ5yCqNgPOU05y2gOlCA6x3QAkQ-DOcPGb0AgO35gdhHcIDn9VRdKNIwL6BYq6-vAFSrJIe8O3lNe0ZhuxTUuSZUALWm6OW55CX9RQtr0osh7yIhcF4dCVRU3LvqAbuQUCGUlJTighaZ7kXd_Roqq6shVpl1OUEXFiUiVRpMYOG-ncJLZlSWixUawVysXPEIClBQhfJHYbJ9JOgwsCl867K4KXXsVvl6CkIkP5HuWPc3S-xx9_xTMLmzfqgWOpcT_pLjCFz8xKFn71Xj1dspms2v5v1mJnYdSxuX8CAAD__6S5pe8">