]> git.proxmox.com Git - rustc.git/blame - src/librustc_error_codes/error_codes/E0072.md
New upstream version 1.47.0+dfsg1
[rustc.git] / src / librustc_error_codes / error_codes / E0072.md
CommitLineData
60c5eb7d
XL
1A recursive type has infinite size because it doesn't have an indirection.
2
3Erroneous code example:
4
5```compile_fail,E0072
6struct ListNode {
7 head: u8,
8 tail: Option<ListNode>, // error: no indirection here so impossible to
9 // compute the type's size
10}
11```
12
13When defining a recursive struct or enum, any use of the type being defined
14from inside the definition must occur behind a pointer (like `Box`, `&` or
15`Rc`). This is because structs and enums must have a well-defined size, and
16without the pointer, the size of the type would need to be unbounded.
17
18In the example, the type cannot have a well-defined size, because it needs to be
19arbitrarily large (since we would be able to nest `ListNode`s to any depth).
20Specifically,
21
22```plain
23size of `ListNode` = 1 byte for `head`
24 + 1 byte for the discriminant of the `Option`
25 + size of `ListNode`
26```
27
28One way to fix this is by wrapping `ListNode` in a `Box`, like so:
29
30```
31struct ListNode {
32 head: u8,
33 tail: Option<Box<ListNode>>,
34}
35```
36
37This works because `Box` is a pointer, so its size is well-known.