Description
This discussion presupposes that "Do we have full recursive validity for references" (#412) is answered "no". This issue is only about references to uninhabited types; references to any other type are not relevant here.
So, in general we allow references to point to invalid data. Is the following UB?
let x: &! = transmute(&());
Since there is no recursive validity for references, the answer might be "no". However, the reason we could consider making this UB is that all of the arguments in #412 do not apply: to determine whether an &!
is valid, we do not have to check memory, do any potentially racy reads, or anything like that. We can just answer the question with "no". Recursive validity is tricky in part because references can "bounce" between being valid and invalid as the contents of memory change; but for references to uninhabited types, this concern does not apply.
Basically, we can think of !
having an impossible-to-satisfy alignment requirement, and therefore &!
is invalid since it is never properly aligned. (I don't really want to fold this into the alignment check, but the point is that we already have the validity of &T
depend on T
, namely via alignment -- I see no fundamental reason why we couldn't do the same with inhabitedness.)