rapidsna wrote:

> With this PR I get:
> 
> ```
> $ clang -O2 ~/llvm/bdos.c
> $ ./a.out
> 400
> 400
> 404
> ```

Oh I see. 

> I think the first two `printf` s in your code seem correct with 40, because 
> they're both looking at only the FAM, not the entire struct.

Interesting. So this sounds different from non-fam array cases. When the struct 
is not a flexible array member, e.g., `struct s {int a; int arr[3]; int b;};`  
`__bdos(&p->arr[0], 0)` would return the whole object size instead of the 
array-only size (12). https://godbolt.org/z/1e9nKPYb4 Was this difference part 
of the specification?

> struct flex *p = (struct flex *)malloc(sizeof(struct flex) + sizeof(int) * 
> 10);

I just wanted to call out that this case is interesting because the size 
derived from malloc and __counted_by compete each other. And __counted_by 
always wins. This conforms to how `-fbounds-safety` will see the size of 
objects, so sounds like we are all happy with it.

Similarly, this will also mean that , when we support `__counted_by` for 
pointers, the following will be the case.

```
int arr[10];
int *__counted_by(4) p = arr;

__bdos(arr, 0); // returns 4 * sizeof(int) instead of 10 * sizeof(int)

``` 

https://github.com/llvm/llvm-project/pull/70606
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to