You're going to need to cite that.
I'm not familiar with C23 or many of the compiler-specific extensions, but in all the previous versions I worked with, there is no type visibility other than "fully exposed" or opaque and dangerous (void*).
You could try wrapping your Foo in
typedef struct {
Foo validated
} ValidFoo;
But nothing stops someone from being an idiot about it and constructing it by hand:
ValidFoo trustMeBro;
trustMeBro.validated = someFoo;
otherFunction(trustMeBro);
Or even just casting it.
Foo* someFoo;
otherFunction((ValidFoo*) someFoo);