ptr::metadata: update comment on vtable_ptr work-around · model-checking/verify-rust-std@89cd225 (original) (raw)
`@@ -167,10 +167,13 @@ extern "C" {
`
167
167
`}
`
168
168
``
169
169
`impl<Dyn: ?Sized> DynMetadata {
`
170
``
`-
/// One of the things that rustc_middle does with this being a lang item is
`
171
``
`` -
/// give it FieldsShape::Primitive
, which means that as far as codegen can
``
172
``
`-
/// tell, it is a reference, and thus doesn't have any fields.
`
173
``
`-
/// That means we can't use field access, and have to transmute it instead.
`
``
170
`` +
/// When DynMetadata
appears as the metadata field of a wide pointer, the rustc_middle layout
``
``
171
`` +
/// computation does magic and the resulting layout is not a FieldsShape::Aggregate
, instead
``
``
172
`` +
/// it is a FieldsShape::Primitive
. This means that the same type can have different layout
``
``
173
`+
/// depending on whether it appears as the metadata field of a wide pointer or as a stand-alone
`
``
174
`+
/// type, which understandably confuses codegen and leads to ICEs when trying to project to a
`
``
175
`` +
/// field of DynMetadata
. To work around that issue, we use transmute
instead of using a
``
``
176
`+
/// field projection.
`
174
177
`#[inline]
`
175
178
`fn vtable_ptr(self) -> *const VTable {
`
176
179
`// SAFETY: this layout assumption is hard-coded into the compiler.
`