Spawning a new thread to answer this:
I don't see any of the above as a problem when that's what you want, and you can already accomplish this with a trivial wrapper struct. But what the current design of
weak accomplishes, as a declaration modifier, is what I believe most people want most of the time with with a weak reference: store it weak in a given place, but convert it to a strong reference any time you want to use it.
I actually think the analogy to IUO is very sound.
weak as we have now is both implicitly wrapping into a weak reference and unwrapping into a strong one as you assign and read to the variable. This wrapping/unwrapping is happening implicitly when accessing the variable, and we don't want this implicit behavior to propagate everywhere.
If you wanted to transform
weak to be a type, I'd insist this type should work as a property wrapper. That'd allow it to work as a declaration modifier (what I believe most people want), but also as a standalone type you can put in containers (with no implicit conversion to strong). That change sounds a bit pointless given we can already accomplish both parts easily, but it might make the language a bit more elegant.
(This reasoning also applies to