@@ -986,18 +986,15 @@ pub type AssertMessage<'tcx> = AssertKind<Operand<'tcx>>;
986
986
/// pointee's type. The resulting address is the address that was stored in the pointer. If the
987
987
/// pointee type is unsized, the pointer additionally stored the value of the metadata.
988
988
///
989
- /// Computing a place may cause UB. One possibility is that the pointer used for a `Deref` may not
990
- /// be suitably aligned. Another possibility is that the place is not in bounds, meaning it does not
991
- /// point to an actual allocation.
992
- ///
993
- /// However, if this is actually UB and when the UB kicks in is undecided. This is being discussed
994
- /// in [UCG#319]. The options include that every place must obey those rules, that only some places
995
- /// must obey them, or that places impose no rules of their own.
996
- ///
997
- /// [UCG#319]: https://github.com/rust-lang/unsafe-code-guidelines/issues/319
998
- ///
999
- /// Rust currently requires that every place obey those two rules. This is checked by Miri and taken
1000
- /// advantage of by codegen (via `gep inbounds`). That is possibly subject to change.
989
+ /// The "validity invariant" of places is the same as that of raw pointers, meaning that e.g.
990
+ /// `*ptr` on a dangling or unaligned pointer is never UB. (Later doing a load/store on that place
991
+ /// or turning it into a reference can be UB though!) The only ways for a place computation can
992
+ /// cause UB are:
993
+ /// - On a `Deref` projection, we do an actual load of the inner place, with all the usual
994
+ /// consequences (the inner place must be based on an aligned pointer, it must point to allocated
995
+ /// memory, the aliasig model must allow reads, this must not be a data race).
996
+ /// - For the projections that perform pointer arithmetic, the offset must in-bounds of an
997
+ /// allocation (i.e., the preconditions of `ptr::offset` must be met).
1001
998
#[ derive( Copy , Clone , PartialEq , Eq , Hash , TyEncodable , HashStable , TypeFoldable , TypeVisitable ) ]
1002
999
pub struct Place < ' tcx > {
1003
1000
pub local : Local ,
0 commit comments