<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/151236>151236</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`__builtin_dynamic_object_size` of pointer member marked with `counted_by` confused by extra parens
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
kees
</td>
</tr>
</table>
<pre>
Strangely, `__builtin_dynamic_object_size()` of a pointer member annotated with `counted_by` goes wrong if passed with wrapping parens. As in, the latter reports `SIZE_MAX`.
```
printf("%zu\n", __builtin_dynamic_object_size(fixed->a, 1));
printf("%zu\n", __builtin_dynamic_object_size((fixed->a), 1));
```
This should not be, and doesn't happen for any other similar constructions:
```
#include <stdio.h>
struct fixed_size {
int *a __attribute__((counted_by(a_count)));
short a_count;
};
struct dyn_size {
short b_count;
int b[] __attribute__((counted_by(b_count)));
};
void __attribute__((noinline))
foo(struct fixed_size *fixed, struct dyn_size *dyn)
{
int b;
int *p = &b;
printf("%zu\n", __builtin_dynamic_object_size(p, 1));
printf("%zu\n", __builtin_dynamic_object_size((p), 1));
printf("%zu\n", __builtin_dynamic_object_size(dyn->b, 1));
printf("%zu\n", __builtin_dynamic_object_size((dyn->b), 1));
printf("%zu\n", __builtin_dynamic_object_size(&fixed->a_count, 1));
printf("%zu\n", __builtin_dynamic_object_size((&fixed->a_count), 1));
printf("%zu\n", __builtin_dynamic_object_size(fixed->a, 1));
printf("%zu\n", __builtin_dynamic_object_size((fixed->a), 1));
}
int main(void)
{
struct fixed_size f = { .a_count = 0 };
struct dyn_size d = { .b_count = 0 };
foo(&f, &d);
return 0;
}
```
Prints:
```4
4
0
0
2
2
0
18446744073709551615
```
@bwendling
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUVk1v4zYQ_TXUZbAGPdSHfdBBiWOghwIFtoeiF4EUKYtdmRRIKl7vry8oKYl35SKHzR4qiAgVcx7fG84Mh3uvT0apkmQPJDskfAyddeUXpXwirLyWn4Pj5qT6K8FHIDmtazHqPmhTy6vhZ93UVvyjmlB7_U0R3BHck5yCbYHDYLUJysFZnYVywI2xgQcl4aJDF8EaO5qgZC2u0eZklYeLs-YEuoWBe_-y9OL4MGhzgoE7ZfwGKg_aREahU9DzEHdxarAu-Ij7-be_n-rfq79ITjeEVvHN6fLSCganTWgnskgw-zaS7NFM80d4T1-rvyr5ibAnHldvo1zcE_bws7g_QO9X6LcKCK3-7LQH39mxl2BsAKGiBTcSpFXeECwCdHwYlIHWRt9fwYZOOfD6rHvuoLHGBzc2QVvjCavWfiLItGn6USog7NEHqe2mI-xpXjkbw0R6EgGkmLywPNoEIFhxqGsegtNiDKquZ6U35447Xk-fi9ZXZy6P76wL8LJm9kRxWCavLOTV3OMwG4tb41t6Yg76dxmKuwxvaTxbLe_BGKtNr41a7GjVWktwd8d3WE1f8RBXmrCSVzPbr30s1roIVgMQdgCCuXjl-LLiZ6J0WAf9B6DOwOuQ_whseTUxpcSvIv6G_2v4E8zf6sJLHH5w4bm7xx05_8-6WRzm-I-Zcebx2tjFdL2XT-u8bOc8Kh5gs3hm-geF1-xfpat8MxH3TW52nOtBPIDpfsVcrqLHqTA6A_Q7Od9fBn9EB94p4imhVRx0GbiMON_u0jQv0pQWrKD7LNvm22yNTFIqLsrIPt6-iSyZ3LM9T1S5LTK2wzTLd0lXMppJLBgvGJepYEzxJkcqBLbpVrKiTXSJFDNa4B63uMfdppE5yzLEQhVMqrYlKVVnrvtN3z-fN9adEu39qMpttkWWJz0XqvdTk4Jo1AWmX2OIZIfEldHokxhPnqS01z74N5igQ6_KdxuXuWX5oWE5c_flP7uVxpp2jB2KuIL6GhxfmpNkdH3ZhTBM54FHgseTDt0oNo09EzxGZsufT4OzkQLB46THEzwugp9L_DcAAP__1YDaBQ">