Skip to content

Exponential compile times for chained RPITIT #102527

@Artemis21

Description

@Artemis21

I tried this code:

#![feature(return_position_impl_trait_in_trait)] trait Nest: FnOnce() -> () { fn nest(self) -> impl Nest; } impl<P: FnOnce() -> ()> Nest for P { fn nest(self) -> impl Nest { || self() } } fn inner(val: &'static str) -> impl Nest { move || { val; } } fn main() { inner("") .nest().nest().nest().nest().nest() .nest().nest().nest().nest().nest() .nest().nest().nest().nest().nest() .nest().nest().nest().nest().nest() .nest().nest().nest().nest().nest(); }

I expected this to compile reasonably quickly.

Instead the above example took about a minute and a half. With 20 .nest()s in sequence, it takes between two and three seconds. For each subsequent .nest(), it takes about twice the time.

When I replace || self() with just self, it compiles almost instantly. The same happens when I remove the apparently inconsequential val; statement, or when I use an owned type instead of a &'static str.

Meta

rustc --version --verbose:

rustc 1.66.0-nightly (3f83906b3 2022-09-24) binary: rustc commit-hash: 3f83906b30798bf61513fa340524cebf6676f9db commit-date: 2022-09-24 host: x86_64-unknown-linux-gnu release: 1.66.0-nightly LLVM version: 15.0.0 

Metadata

Metadata

Labels

A-impl-traitArea: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.C-bugCategory: This is a bug.F-impl_trait_in_assoc_type`#![feature(impl_trait_in_assoc_type)]`I-compiletimeIssue: Problems and improvements with respect to compile times.requires-nightlyThis issue requires a nightly compiler in some way.

Type

No type

Projects

Status

Non-blocking

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions