> On Apr 10, 2024, at 14:44, Joseph Myers <[email protected]> wrote:
>
> On Wed, 10 Apr 2024, Qing Zhao wrote:
>
>> A stupid question first, the same scope means the same file? (Or same
>> function)
>
> struct X { int a; };
> struct X { int a; };
>
> is an example of the same scope (file scope, in this case). The
> structures must have the same contents (in an appropriate sense) and are
> then considered the same type.
>
> struct X { int a; };
> void f() { struct X { int a; }; }
>
> is not the same scope - but C23 makes the types compatible (not the same).
> It's OK to have incompatible types with the same tag in different scopes
> as well
>
> struct X { int a; };
> void f() { struct X { long b; }; }
>
> but if you use them in a way requiring compatibility, then the contents
> must be compatible
>
> struct X { int a; } v;
> void f() { struct X { int a; } *p = &v; }
Okay, the above is very clear, thanks a lot for the explanation.
So, basically, for “counted-by” attribute:
**The following is good:
struct f {
int b;
int c;
int a[] __attribute__ ((counted_by (b))) };
struct f {
int b;
int c;
int a[] __attribute__ ((counted_by (b))) };
**The following should error:
struct f {
int b;
int c;
int a[] __attribute__ ((counted_by (b))) };
struct f {
int b;
int c;
int a[] __attribute__ ((counted_by (c))) }; /* error here */
For the same tag in different scopes case:
struct f {
int b;
int c;
int a[] __attribute__ ((counted_by (b))) } y0;
void test1(void)
{
struct f {
int b;
int c;
int a[] __attribute__ ((counted_by (c))) } x;
y0 = x; /* will report incompatible type error here */
}
Are the above complete?
>
>> Is there a testing case for this feature in current GCC source tree I can
>> take a look? (and
>> Then I can use it to construct the new testing case for the counted-by
>> attribute).
>
> See gcc.dg/c23-tag-*.c for many tests of different cases involving the tag
> compatibility rules (and gcc.dg/gnu23-tag-* where GNU extensions are
> involved).
Got it. Will take a look on them.
thanks.
Qing
>
> --
> Joseph S. Myers
> [email protected]
>