Overflow while adding drop-check rules on a generic tree
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 119k
- Forks
- 16.1k
- PR merge metrics
- PR metrics pending
Description
I tried this code:
enum Tree<T: Scopable> {
Group(Vec<Tree<T>>),
Subtree(Box<Tree<T::SubType>>),
Leaf(T),
}
trait Scopable: Sized {
type SubType: Scopable;
}
impl<T: Scopable> Tree<T> {
fn foo(self) -> Self { // error[E0320]: overflow while adding drop-check rules for Tree<T>
self
}
}
I expected this to compile as it doesn't seem to unconditionally introduce a type of infinite length, but no luck, drop checking does not succeed.
When the type is not passed in as an argument, or passed by reference of course, there are no issues & the code compiles.
fn bar() {
let _ = Tree::Leaf(()); // no problem!
}
Meta
Reproduced on these versions,
rustc --version --verbose:
rustc 1.81.0 (eeb90cda1 2024-09-04)
binary: rustc
commit-hash: eeb90cda1969383f56a2637cbd3037bdf598841c
commit-date: 2024-09-04
host: aarch64-apple-darwin
release: 1.81.0
LLVM version: 18.1.7
rustc 1.83.0-nightly (1bc403daa 2024-10-11)
binary: rustc
commit-hash: 1bc403daadbebb553ccc211a0a8eebb73989665f
commit-date: 2024-10-11
host: aarch64-apple-darwin
release: 1.83.0-nightly
LLVM version: 19.1.1
Error
error[E0320]: overflow while adding drop-check rules for Tree<T>
--> src/main.rs:68:21
|
68 | fn foo(self) -> Self {
| ^^^^
|
= note: overflowed on Tree<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<T as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType as Scopable>::SubType>
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the generic Tree and Scopable reproducer shown in src/main.rs, using the listed rustc 1.81.0 or nightly versions, and confirm the E0320 drop-check overflow. Investigate the compiler's drop-check handling for the associated-type recursion; done means this valid example no longer overflows while genuinely infinitely sized types remain rejected.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 35/100