I have the following code:
int main(void)
{
struct { int x; } a, b;
struct { int x; } c;
struct { int x; } *p;
b = a; /* OK */
c = a;
Looking at the draft specification I'm guessing you're relying on the conditions that come after the statement:
Moreover, two structure, union, or enumerated types declared in separate translation units are compatible if their tags and members satisfy the following requirements ...
I think that the fact that these are all decared in the same C file means that they are in a single translation unit.
At a guess it would seem that this guarantees that when two C files include a header that declares a type then instances of that type will be compatible.