Resolving an opaque type in llvm-assembly

According to the Assembly language reference: "In LLVM, opaque types can
eventually be resolved to any type (not just a structure type)." But
the only way I can think of to do so is to give it a type name, then
later redeclare the name. But that gives an error:

%TO = type opaque
%TF = type i32 ( %TO* )
%TO = type %TF

gives:

$ llvm-as types1.ll
llvm-as: types1.ll:3:1: error: redefinition of type
%TO = type %TF
^

Also, what is the set of things that can be done with an as-yet unresolved
opaque type?

In the textual form of LLVM IR, forward references are legal, so you shouldn’t need this kind of redeclaration. You example could be:
%TF = type i32 (%TO*)
%TO = type %TF

However, llvm-as rejects it with “error: forward references to non-struct type”, but that’s a different issue.

In the textual form of LLVM IR, forward references are legal, so you shouldn't need this kind of redeclaration. You example could be:
%TF = type i32 (%TO*)
%TO = type %TF

However, llvm-as rejects it with "error: forward references to non-struct type", but that's a different issue.

Thanks, that helps. I am seeing some of this now by doing experiments with handwritten IR assembly.
It looks like I will have to artificially wrap some types in a one-member struct.