`type retain_cycle_node````=` `{`

`rc_node_exp : InferIR.Exp.t;`
`rc_node_typ : InferIR.Typ.t;`

`}```
`type retain_cycle_field````=` `{`

`rc_field_name : InferIR.Typ.Fieldname.t;`
`rc_field_inst : InferIR.Sil.inst;`

`}```
`type retain_cycle_edge_obj````=` `{`

`rc_from : retain_cycle_node;`
`rc_field : retain_cycle_field;`

`}```
`type retain_cycle_edge````=`

`|` `Object of retain_cycle_edge_obj`
`|` `Block of InferIR.Typ.Procname.t * InferIR.Pvar.t`

``
`type t````=` `{`

`rc_head : retain_cycle_edge;`
`rc_elements : retain_cycle_edge list;`

`}```

A retain cycle is a non-empty list of paths. It also contains a pointer to the head of the list to model the cycle structure. The next element from the end of the list is the head.

`module Set : InferStdlib.IStd.Caml.Set.S with type Set.elt = t`

Set for retain cycles.

`val print_cycle : t ‑> unit`
`val create_cycle : retain_cycle_edge list ‑> t option`

Creates a cycle if the list is non-empty

`val pp_dotty : Format.formatter ‑> t ‑> unit`
`val write_dotty_to_file : string ‑> t ‑> unit`
`val _retain_cycle_edge_to_string : retain_cycle_edge ‑> string`
`val _retain_cycle_node_to_string : retain_cycle_node ‑> string`
`val _retain_cycle_to_string : t ‑> string`