Skip to content
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

Recursive impl-trait type causes compiler stack overflow #43263

Closed
Arnavion opened this issue Jul 16, 2017 · 2 comments
Closed

Recursive impl-trait type causes compiler stack overflow #43263

Arnavion opened this issue Jul 16, 2017 · 2 comments
Labels
A-impl-trait Area: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.

Comments

@Arnavion
Copy link

rustc 1.20.0-nightly (086eaa78e 2017-07-15)
binary: rustc
commit-hash: 086eaa78ea70075abe4e6b7fb9dc76259867b4be
commit-date: 2017-07-15
host: x86_64-pc-windows-msvc
release: 1.20.0-nightly
LLVM version: 4.0
#![feature(conservative_impl_trait)]

trait Future {
    type Item;

    fn and_then<M>(self, m: M) -> AndThen<Self, M> where Self: Sized {
        AndThen(self, m)
    }
}

struct AndThen<F, M>(F, M);

impl<F, M, F2> Future for AndThen<F, M> where F: Future, M: FnOnce(F::Item) -> F2, F2: Future {
    type Item = F2::Item;
}

struct FutureOk<T>(T);

impl<T> Future for FutureOk<T> {
    type Item = T;
}

fn foo(x: i32) -> impl Future<Item = i32> {
    FutureOk(x)
    .and_then(foo)
}

fn main() {
    let _ = foo(5);
}

This crashes the compiler with:

thread 'rustc' has overflowed its stack

because of the recursive return type of foo (X = AndThen<FutureOk<i32>, fn(i32) -> X>). Of course without impl trait I could not have written the type in the first place.

Replace .and_then(foo) with .and_then(|x| foo(x)) fixes it, possibly because the type then becomes AndThen<FutureOk<i32>, [closure]> so the recursive part is separated into the closure type.

@Mark-Simulacrum Mark-Simulacrum added the A-impl-trait Area: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch. label Jul 19, 2017
@Mark-Simulacrum
Copy link
Member

Closing in favor of #39639.

@Arnavion
Copy link
Author

Ah, I didn't find it because it wasn't tagged with the A-impl-trait label.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-impl-trait Area: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.
Projects
None yet
Development

No branches or pull requests

2 participants