Skip to content

Hitting the recursion limit when evaluating a type does not provide a useful error message #101747

Closed
@semicoleon

Description

Inspired by this incredible Twitter thread
Given the following code: Playground

type Byte = Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Option<Option<Option<Option< Option<Option<Option<Option<
Box<String>
>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>>

>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>>

>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>>

>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>>;

fn main() {
    println!("{}", std::mem::size_of::<Byte>());
}

The current output is:

error: overflow representing the type `Unique<String>`

This error message doesn't really communicate the problem to anyone who isn't aware of rustc internals. It also does not communicate the (fairly simple) fix of upping the recursion limit #![recursion_limit = "256"].

It would be nice to provide an actual diagnostic pointing out the location of the error in the source code (reconstructing that might be complicated, I'm not sure). The current error can be particularly confusing since the type in the error message can be private to another type that's being evaluated, as is the case in this example where an inner type in Box is printed in the error.

Rust analyzer does not show any similar warnings or errors.

Nightly prints a slightly different error message, but if anything it's even less helpful

error: queries overflow the depth limit!
rustc 1.63.0 (4b91a6ea7 2022-08-08)
binary: rustc
commit-hash: 4b91a6ea7258a947e59c6522cd5898e7c0a6a88f
commit-date: 2022-08-08
host: x86_64-pc-windows-msvc
release: 1.63.0
LLVM version: 14.0.5

rustc 1.65.0-nightly (fa6ee9375 2022-09-12)
binary: rustc
commit-hash: fa6ee9375242ae784dab1837dfc0b92f43e787ce
commit-date: 2022-09-12
host: x86_64-pc-windows-msvc
release: 1.65.0-nightly
LLVM version: 15.0.0

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions