kees wrote:
> For __counted_by to work on a union, one of the following must be true:
>
> Homogeneous Sizes: All members of the union must have the exact same
> sizeof(). Byte-Size Semantics: The attribute would need to be __sized_by.
>
> Plus, I'm assuming if you have a union field that has `counted_by` or
> `sized_by`, all of the fields need the same annotation following the above
> rule.
>
> Requesting changes to add these restrictions.
This makes sense to me for FAMs, but not for pointer members. e.g.:
```C
struct foo {
int count;
union {
u16 a[] __counted_by(count);
s16 b[] __counted_by(count):
};
} *p;
```
With this, `__builtin_dynamic_object_size(p, 1)` will be unambiguous. If `b`
were an `int`, the compiler cannot know which member (`a` or `b`) to use to
figure out the object size.
For pointer members, though, it shouldn't matter. They can be anything:
```C
struct foo {
int count1, count2;
union {
int z;
char *buf __counted_by(count1);
short *weird __counted_by(count2);
};
} *p;
```
Both `p->buf` and `p->weird` have unambiguous sizes. Is the concern about
aliasing due to `buf` and `weird` having the same memory location?
https://github.com/llvm/llvm-project/pull/171996
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits