File tree 2 files changed +25
-1
lines changed
compiler/rustc_middle/src/ty
2 files changed +25
-1
lines changed Original file line number Diff line number Diff line change @@ -64,6 +64,30 @@ bitflags! {
64
64
/// Moreover, Rust only allows recursive data types through indirection.
65
65
///
66
66
/// [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.
67
91
pub struct AdtDef {
68
92
/// The `DefId` of the struct, enum or union item.
69
93
pub did : DefId ,
Original file line number Diff line number Diff line change @@ -1711,7 +1711,7 @@ impl ReprOptions {
1711
1711
1712
1712
impl < ' tcx > FieldDef {
1713
1713
/// 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`] .
1715
1715
pub fn ty ( & self , tcx : TyCtxt < ' tcx > , subst : SubstsRef < ' tcx > ) -> Ty < ' tcx > {
1716
1716
tcx. type_of ( self . did ) . subst ( tcx, subst)
1717
1717
}
You can’t perform that action at this time.
0 commit comments