Skip to content

Commit 2c1cf5a

Browse files
committed
Document how recursion is handled for ty::Ty
Based on this forum discussion: https://internals.rust-lang.org/t/recursive-type-representation-in-rustc/15235/4
1 parent 473eaa4 commit 2c1cf5a

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

compiler/rustc_middle/src/ty/adt.rs

+22
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,28 @@ bitflags! {
6464
/// Moreover, Rust only allows recursive data types through indirection.
6565
///
6666
/// [adt]: https://en.wikipedia.org/wiki/Algebraic_data_type
67+
///
68+
/// # Recursive types
69+
///
70+
/// It may seem impossible to represent recursive types using [`Ty`],
71+
/// since [`TyKind::Adt`] includes [`AdtDef`], which includes its fields,
72+
/// creating a cycle. However, `AdtDef` does not actually include the *types*
73+
/// of its fields; it includes just their [`DefId`]s.
74+
///
75+
/// For example, the following type:
76+
///
77+
/// ```
78+
/// struct S { x: Box<S> }
79+
/// ```
80+
///
81+
/// is essentially represented with [`Ty`] as the following pseudocode:
82+
///
83+
/// ```
84+
/// struct S { x }
85+
/// ```
86+
///
87+
/// where `x` here represents the `DefId` of `S.x`. Then, the `DefId`
88+
/// can be used with [`TyCtxt::type_of()`] to get the type of the field.
6789
pub struct AdtDef {
6890
/// The `DefId` of the struct, enum or union item.
6991
pub did: DefId,

compiler/rustc_middle/src/ty/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1700,7 +1700,7 @@ impl ReprOptions {
17001700

17011701
impl<'tcx> FieldDef {
17021702
/// Returns the type of this field. The resulting type is not normalized. The `subst` is
1703-
/// typically obtained via the second field of `TyKind::AdtDef`.
1703+
/// typically obtained via the second field of [`TyKind::Adt`].
17041704
pub fn ty(&self, tcx: TyCtxt<'tcx>, subst: SubstsRef<'tcx>) -> Ty<'tcx> {
17051705
tcx.type_of(self.did).subst(tcx, subst)
17061706
}

0 commit comments

Comments
 (0)