Skip to content

Document metadata of ptrs to indirectly unsized types#2289

Open
traviscross wants to merge 5 commits into
masterfrom
TC/document-metadata-of-pointers-to-indirectly-sized-types
Open

Document metadata of ptrs to indirectly unsized types#2289
traviscross wants to merge 5 commits into
masterfrom
TC/document-metadata-of-pointers-to-indirectly-sized-types

Conversation

@traviscross

@traviscross traviscross commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

We say that pointers to DSTs store metadata and what that metadata is for pointers to slices, str, and trait objects. But a struct or tuple with an unsized tail is itself a DST, and we hadn't said what the metadata is for pointers to these unsized types.

Now that we've defined metadata and unsized tail, let's complete this enumeration.


I'm breaking this out from #2282 so that we can merge the prerequisites before considering the new lang guarantees.

This is stacked on #2286 and #2287 and #2288 and #2290 (yes, that one is out of order) and those should be merged first.

cc @ehuss @RalfJung @Mark-Simulacrum

The pointer-to-pointer cast rules and the wide-pointer validity rule
both speak of the *metadata* of a pointer, but we hadn't explicitly
defined the term (even though we had defined the contents of that
metadata).  Let's do that and link to it.
We refer to the unsized tail of a type, but we hadn't defined it.
Let's do that and link to the definition.
The validity rule for the metadata of a wide reference, `Box<T>`,
or raw pointer mentions `dyn Trait` and slice but had omitted
`str`.  Let's fix that.
We document that, for references and `Box<T>`, pointed-to values
with slice or `str` metadata must be no larger than `isize::MAX`.  We
hadn't required this for pointed-to values with `dyn` metadata.  It's
tempting to think this isn't necessary since we separately require
that the metadata point to a vtable generated by the compiler, which
ensures the encoded size of the erased type is OK.

But the bound is on the total size of the pointed-to value, including
any sized prefix of a type with an unsized tail.  Since the prefix
combined with the size in the vtable can push us past the limit, we
need the separate restriction.

Let's apply the rule to both cases and add an admonition to remind
ourselves of why this is needed.
We say that pointers to DSTs store metadata and what that metadata
is for pointers to slices, `str`, and trait objects.  But a struct or
tuple with an unsized tail is itself a DST, and we hadn't said what
the metadata is for pointers to these unsized types.

Now that we've defined *metadata* and *unsized tail*, let's complete
this enumeration.
@rustbot rustbot added the S-waiting-on-review Status: The marked PR is awaiting review from a maintainer label Jun 16, 2026
@traviscross traviscross force-pushed the TC/document-metadata-of-pointers-to-indirectly-sized-types branch from d94966e to 6da94b1 Compare June 16, 2026 04:42
@traviscross traviscross changed the title Generalize the wide-pointer total-size bound Document metadata of ptrs to indirectly unsized types Jun 16, 2026
@traviscross traviscross force-pushed the TC/document-metadata-of-pointers-to-indirectly-sized-types branch 2 times, most recently from 0442f1d to f0c3d8c Compare June 16, 2026 04:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-review Status: The marked PR is awaiting review from a maintainer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants