Skip to content

docs: add long error explanation for error E0320 #105792

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compiler/rustc_error_codes/src/error_codes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ E0311: include_str!("./error_codes/E0311.md"),
E0312: include_str!("./error_codes/E0312.md"),
E0316: include_str!("./error_codes/E0316.md"),
E0317: include_str!("./error_codes/E0317.md"),
E0320: include_str!("./error_codes/E0320.md"),
E0321: include_str!("./error_codes/E0321.md"),
E0322: include_str!("./error_codes/E0322.md"),
E0323: include_str!("./error_codes/E0323.md"),
Expand Down Expand Up @@ -575,7 +576,6 @@ E0791: include_str!("./error_codes/E0791.md"),
// E0314, // closure outlives stack frame
// E0315, // cannot invoke closure outside of its lifetime
// E0319, // trait impls for defaulted traits allowed just for structs/enums
E0320, // recursive overflow during dropck
// E0372, // coherence not object safe
E0377, // the trait `CoerceUnsized` may only be implemented for a coercion
// between structures with the same definition
Expand Down
27 changes: 27 additions & 0 deletions compiler/rustc_error_codes/src/error_codes/E0320.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Recursion limit reached while creating drop-check rules.

Example of erroneous code:

```compile_fail,E0320
enum A<T> {
B,
C(T, Box<A<(T, T)>>)
}

fn foo<T>() {
A::<T>::B; // error: overflow while adding drop-check rules for A<T>
}
```

The Rust compiler must be able to reason about how a type is [`Drop`]ped, and
by extension the types of its fields, to be able to generate the glue to
properly drop a value. The code example above shows a type where this inference
is impossible because it is recursive. Note that this is *not* the same as
[E0072](E0072.html), where a type has an infinite size; the type here has a
finite size but any attempt to `Drop` it would recurse infinitely. For more
information, read [the `Drop` docs](../std/ops/trait.Drop.html).

It is not possible to define a type with recursive drop-check rules. All such
recursion must be removed.

[`Drop`]: ../std/ops/trait.Drop.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ LL | let ft =

error: aborting due to previous error

For more information about this error, try `rustc --explain E0320`.
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ LL | let ft =

error: aborting due to previous error

For more information about this error, try `rustc --explain E0320`.
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ LL | Some(Wrapper::Simple::<u32>);

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0320`.
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ LL | fn f(x: S<u32>) {}

error: aborting due to previous error

For more information about this error, try `rustc --explain E0320`.