about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2024-07-17 13:50:17 +0200
committerRalf Jung <post@ralfj.de>2024-07-17 13:56:25 +0200
commitf9c0d3370f04d08cda2da268a54bc543eb310fc7 (patch)
tree749e1111ac21e68c7f37f097d1350dc7dbe6b4cc
parent21dc49c587c7df282b8e96dc01c288c7d59bbd2c (diff)
downloadrust-f9c0d3370f04d08cda2da268a54bc543eb310fc7.tar.gz
rust-f9c0d3370f04d08cda2da268a54bc543eb310fc7.zip
ptr::metadata: update comment on vtable_ptr work-around
-rw-r--r--library/core/src/ptr/metadata.rs11
1 files changed, 7 insertions, 4 deletions
diff --git a/library/core/src/ptr/metadata.rs b/library/core/src/ptr/metadata.rs
index 21d1b7ea0ce..06f205c0f26 100644
--- a/library/core/src/ptr/metadata.rs
+++ b/library/core/src/ptr/metadata.rs
@@ -167,10 +167,13 @@ extern "C" {
 }
 
 impl<Dyn: ?Sized> DynMetadata<Dyn> {
-    /// One of the things that rustc_middle does with this being a lang item is
-    /// give it `FieldsShape::Primitive`, which means that as far as codegen can
-    /// tell, it *is* a reference, and thus doesn't have any fields.
-    /// That means we can't use field access, and have to transmute it instead.
+    /// When `DynMetadata` appears as the metadata field of a wide pointer, the rustc_middle layout
+    /// computation does magic and the resulting layout is *not* a `FieldsShape::Aggregate`, instead
+    /// it is a `FieldsShape::Primitive`. This means that the same type can have different layout
+    /// depending on whether it appears as the metadata field of a wide pointer or as a stand-alone
+    /// type, which understandably confuses codegen and leads to ICEs when trying to project to a
+    /// field of `DynMetadata`. To work around that issue, we use `transmute` instead of using a
+    /// field projection.
     #[inline]
     fn vtable_ptr(self) -> *const VTable {
         // SAFETY: this layout assumption is hard-coded into the compiler.