File tree Expand file tree Collapse file tree 2 files changed +25
-1
lines changed
compiler/rustc_middle/src/ty Expand file tree Collapse file tree 2 files changed +25
-1
lines changed Original file line number Diff line number Diff line change @@ -64,6 +64,30 @@ 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+ /// [`TyKind::Adt`]: ty::TyKind::Adt
76+ ///
77+ /// For example, the following type:
78+ ///
79+ /// ```
80+ /// struct S { x: Box<S> }
81+ /// ```
82+ ///
83+ /// is essentially represented with [`Ty`] as the following pseudocode:
84+ ///
85+ /// ```
86+ /// struct S { x }
87+ /// ```
88+ ///
89+ /// where `x` here represents the `DefId` of `S.x`. Then, the `DefId`
90+ /// can be used with [`TyCtxt::type_of()`] to get the type of the field.
6791pub struct AdtDef {
6892 /// The `DefId` of the struct, enum or union item.
6993 pub did : DefId ,
Original file line number Diff line number Diff line change @@ -1711,7 +1711,7 @@ impl ReprOptions {
17111711
17121712impl < ' tcx > FieldDef {
17131713 /// Returns the type of this field. The resulting type is not normalized. The `subst` is
1714- /// typically obtained via the second field of `TyKind::AdtDef` .
1714+ /// typically obtained via the second field of [ `TyKind::Adt`] .
17151715 pub fn ty ( & self , tcx : TyCtxt < ' tcx > , subst : SubstsRef < ' tcx > ) -> Ty < ' tcx > {
17161716 tcx. type_of ( self . did ) . subst ( tcx, subst)
17171717 }
You can’t perform that action at this time.
0 commit comments