The implementation of an object need only be hidden if all pointers to that type in a translation unit are never dereferenced and there are no other reasons for the internal details of the structure/union to be known.

In the above example "ptrX a" is complaint, because member â€œi1â€ from â€œstruct Xâ€ is accessed elsewhere in the translation unit.