================
@@ -221,3 +221,49 @@ struct on_void_ty {
   // expected-error@+1{{field has incomplete type 'void'}}
   void wrong_ty __counted_by(count);
 };
+
+//==============================================================================
+// __counted_by on pointer members in unions
+//==============================================================================
+
+// Pointer in anonymous union with count in parent struct - OK
+struct ptr_in_anon_union_count_in_parent {
+  int count;
+  union {
+    int a;
+    struct size_known *buf __counted_by(count);
+  };
+};
----------------
hnrklssn wrote:

I'm curious on how assignment analysis would work for this case, as well as the 
case of:
```
struct ptr_in_anon_union_count_in_parent2 {
  int count;
  union {
    int *buf1 __counted_by(count);
    struct size_known *buf2 __counted_by(count);
  };
};
```

In the case of full `-fbounds-safety`, what are intended the compile-time 
restrictions when assigning to `count` for each of these structs? Normally when 
assigning to a count field we stipulate that the user **must** assign to each 
field referring to that count. In the case of 
`ptr_in_anon_union_count_in_parent2`, it's obviously not reasonable to assign 
to both `buf1` and `buf2`. In the case of `ptr_in_anon_union_count_in_parent`, 
is the user allowed to use the `count` field when the `buf` field isn't used? 
That would make it impossible to prevent `count` from falling out of sync with 
`buf`, in the case when `buf` is actually used. But if `count` is useless when 
`buf` isn't used, then the user may as well put them in a struct in the union:
```
struct ptr_in_anon_union_count_in_parent3 {
  union {
    int a;
    struct {
      int count;
      struct size_known *buf __counted_by(count);
    };
  };
};
```

CC @rapidsna 

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