What seems to be the real issue to me here is that you are even able to make a *opaque block. Have you tried actually using this PointerQueue? I’ve done a quick test in the playground:
main.zig:4:16: error: parameter of opaque type ‘main.Foo__opaque_3387’ not allowed
main.zig:3:14: note: opaque declared here (exit status 1)
This makes sense to me insofar as *opaque {} shouldn’t even be a thing, in the same way that *struct {} or *enum {} aren’t. That the compiler doesn’t signal the problem at the level of PointerQueue definition seems like a bug, since, like I said, the methods you put into this weird namespace cannot really be used.
In your particular case, fnTakesPointerOpaque could be put into anOpaque directly if both opaques refer to the same conceptual FFI type. Otherwise you should just define the second block as regular opaque{} and have the method take a *@This() parameter (i.e., a pointer).
A bare @This() refers to the (dereferenced) value of the opaque type, which is not representable because its size is unknown. If you change it to *const @This() your code compiles and runs.