Skip to content

nested const-eval queries don't have a recursion limit or timeout, causing the compiler to freeze in an infinite loop #125718

Closed
@theemathas

Description

@theemathas
const fn foo<T>() {
    const { foo::<&T>() }
}

const X: () = foo::<i32>();

The above code causes the compiler to hang, apparently in an infinite loop. I expected it to report an error due to a recursion limit or a timeout.

Note that removing the const block causes the compiler to correctly report an error.

Code without the const block
const fn foo<T>() {
    foo::<&T>()
}

const X: () = foo::<i32>();

This code results in the following error:

   Compiling playground v0.0.1 (/playground)
warning: function cannot return without recursing
 --> src/lib.rs:1:1
  |
1 | const fn foo<T>() {
  | ^^^^^^^^^^^^^^^^^ cannot return without recursing
2 |     foo::<&T>()
  |     ----------- recursive call site
  |
  = help: a `loop` may express intention better if this is on purpose
  = note: `#[warn(unconditional_recursion)]` on by default

error[E0080]: evaluation of constant value failed
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^ reached the configured maximum number of stack frames
  |
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<&i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `foo::<i32>`
 --> src/lib.rs:2:5
  |
2 |     foo::<&T>()
  |     ^^^^^^^^^^^
note: inside `X`
 --> src/lib.rs:5:15
  |
5 | const X: () = foo::<i32>();
  |               ^^^^^^^^^^^^

For more information about this error, try `rustc --explain E0080`.
warning: `playground` (lib) generated 1 warning
error: could not compile `playground` (lib) due to 1 previous error; 1 warning emitted

Changing the infinite recursion into an infinite loop correctly causes a timeout.

Code with an infinite loop instead of an infinite recursion
const fn foo() {
    const { loop {} }
}

const X: () = foo();

This code results in the following error:

   Compiling playground v0.0.1 (/playground)
warning: unreachable expression
 --> src/lib.rs:2:5
  |
2 |     const { loop {} }
  |     ^^^^^^^^-------^^
  |     |       |
  |     |       any code following this expression is unreachable
  |     unreachable expression
  |
  = note: `#[warn(unreachable_code)]` on by default

error: constant evaluation is taking a long time
 --> src/lib.rs:2:13
  |
2 |     const { loop {} }
  |             ^^^^^^^
  |
  = note: this lint makes sure the compiler doesn't get stuck due to infinite loops in const eval.
          If your compilation actually takes a long time, you can safely allow the lint.
help: the constant being evaluated
 --> src/lib.rs:2:5
  |
2 |     const { loop {} }
  |     ^^^^^^^^^^^^^^^^^
  = note: `#[deny(long_running_const_eval)]` on by default

note: erroneous constant encountered
 --> src/lib.rs:2:5
  |
2 |     const { loop {} }
  |     ^^^^^^^^^^^^^^^^^

warning: function `foo` is never used
 --> src/lib.rs:1:10
  |
1 | const fn foo() {
  |          ^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: constant `X` is never used
 --> src/lib.rs:5:7
  |
5 | const X: () = foo();
  |       ^

warning: `playground` (lib) generated 3 warnings
error: could not compile `playground` (lib) due to 1 previous error; 3 warnings emitted

See also #125713

Meta

rustc --version --verbose:

rustc 1.80.0-nightly (da159eb33 2024-05-28)
binary: rustc
commit-hash: da159eb331b27df528185c616b394bb0e1d2a4bd
commit-date: 2024-05-28
host: aarch64-apple-darwin
release: 1.80.0-nightly
LLVM version: 18.1.6```

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)C-bugCategory: This is a bug.F-inline_constInline constants (aka: const blocks, const expressions, anonymous constants)I-crashIssue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics.I-hangIssue: The compiler never terminates, due to infinite loops, deadlock, livelock, etc.P-mediumMedium priorityT-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