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

Reply via email to