Skip to content

Bad error message for infinite type recursion #121090

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
pacak opened this issue Feb 14, 2024 · 2 comments
Open

Bad error message for infinite type recursion #121090

pacak opened this issue Feb 14, 2024 · 2 comments
Labels
A-const-eval Area: Constant evaluation, covers all const contexts (static, const fn, ...) A-diagnostics Area: Messages for errors, warnings, and lints A-trait-system Area: Trait system D-confusing Diagnostics: Confusing error or lint that should be reworked. D-terse Diagnostics: An error or lint that doesn't give enough information about the problem at hand. fixed-by-next-solver Fixed by the next-generation trait solver, `-Znext-solver`. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@pacak
Copy link
Contributor

pacak commented Feb 14, 2024

Code

#![recursion_limit = "5"]
#![allow(unconditional_recursion)]

fn quicksort<It, I>(i: I) -> Vec<i32>
where
    It: Iterator<Item = i32>,
    I: IntoIterator<IntoIter = It>,
{
    quicksort(i.into_iter().filter(|_| true))
}

pub fn bar(xs: Vec<i32>) -> Vec<i32> {
    quicksort(xs)
}

Current output

relevant error:

error[E0275]: overflow evaluating the requirement `Filter<Filter<Filter<Filter<Filter<std::vec::IntoIter<i32>, ...>, ...>, ...>, ...>, ...>: Iterator`
  |
  = help: consider increasing the recursion limit by adding a `#![recursion_limit = "10"]` attribute to your crate (`qsort`)
  = note: required for `Filter<Filter<Filter<Filter<Filter<std::vec::IntoIter<i32>, {closure@src/lib.rs:8:36: 8:39}>, {closure@src/lib.rs:8:36: 8:39}>, {closure@src/lib.rs:8:36: 8:39}>, {closure@src/lib.rs:8:36: 8:39}>, {closure@src/lib.rs:8:36: 8:39}>` to implement `IntoIterator`

Desired output

something-something infinite recursion

Rationale and extra context

Suggestion to increase recursion limit is wrong

Other cases

No response

Rust Version

rustc 1.76.0 (07dca489a 2024-02-04)
binary: rustc
commit-hash: 07dca489ac2d933c78d3c5158e3f43beefeb02ce
commit-date: 2024-02-04
host: x86_64-unknown-linux-gnu
release: 1.76.0
LLVM version: 17.0.6

Anything else?

No response

@pacak pacak added A-diagnostics Area: Messages for errors, warnings, and lints T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Feb 14, 2024
@estebank estebank added A-trait-system Area: Trait system D-confusing Diagnostics: Confusing error or lint that should be reworked. D-terse Diagnostics: An error or lint that doesn't give enough information about the problem at hand. A-const-prop Area: Constant propagation labels Feb 14, 2024
@oli-obk oli-obk added A-const-eval Area: Constant evaluation, covers all const contexts (static, const fn, ...) and removed A-const-prop Area: Constant propagation labels Feb 14, 2024
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this issue Feb 15, 2024
…ow, r=oli-obk

Do not report overflow errors on ConstArgHasType goals

This is 10% of a fix for rust-lang#121090, since it at least means that we no longer mention the `ConstArgHasType` goal as the cause for the overflow. Instead, now we mention:
```
overflow evaluating the requirement `{closure@$DIR/overflow-during-mono.rs:13:41: 13:44}: Sized`
```
which is not much better, but slightly.

r? oli-obk
rust-timer added a commit to rust-lang-ci/rust that referenced this issue Feb 15, 2024
Rollup merge of rust-lang#121105 - compiler-errors:no-const-ty-overflow, r=oli-obk

Do not report overflow errors on ConstArgHasType goals

This is 10% of a fix for rust-lang#121090, since it at least means that we no longer mention the `ConstArgHasType` goal as the cause for the overflow. Instead, now we mention:
```
overflow evaluating the requirement `{closure@$DIR/overflow-during-mono.rs:13:41: 13:44}: Sized`
```
which is not much better, but slightly.

r? oli-obk
@pacak
Copy link
Contributor Author

pacak commented Apr 6, 2024

New error message is as following:

Compiling playground v0.0.1 (/playground)
error[[E0275]](https://doc.rust-lang.org/nightly/error_codes/E0275.html): overflow evaluating the requirement `{closure@src/main.rs:6:41: 6:44}: Sized`
  |
  = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`playground`)
  = note: required for `Filter<std::array::IntoIter<i32, 11>, {closure@src/main.rs:6:41: 6:44}>` to implement `Iterator`
  = note: 127 redundant requirements hidden
  = note: required for `Filter<Filter<Filter<Filter<Filter<Filter<Filter<Filter<..., ...>, ...>, ...>, ...>, ...>, ...>, ...>, ...>` to implement `Iterator`
  = note: required for `Filter<Filter<Filter<Filter<Filter<Filter<Filter<Filter<..., ...>, ...>, ...>, ...>, ...>, ...>, ...>, ...>` to implement `IntoIterator`
  = note: the full name for the type has been written to '/playground/target/debug/deps/playground-22e77209e34c162a.long-type-15773489000561340382.txt'
  = note: consider using `--verbose` to print the full type name to the console
  = note: the full name for the type has been written to '/playground/target/debug/deps/playground-22e77209e34c162a.long-type-15773489000561340382.txt'
  = note: consider using `--verbose` to print the full type name to the console

For more information about this error, try `rustc --explain E0275`.
error: could not compile `playground` (bin "playground") due to 1 previous error

Suggestion to increase recursion limit is wrong.

@pacak pacak changed the title Bad error message for strange looking recursion Bad error message for infinite type recursion Apr 6, 2024
@oli-obk
Copy link
Contributor

oli-obk commented Apr 8, 2024

Under the new solver this gives the following output:

error[E0283]: type annotations needed
 --> <source>:9:5
  |
9 |     quicksort(i.into_iter().filter(|_| true))
  |     ^^^^^^^^^ cannot infer type of the type parameter `It` declared on the function `quicksort`
  |
  = note: cannot satisfy `_: Iterator`
note: required by a bound in `quicksort`
 --> <source>:6:9
  |
4 | fn quicksort<It, I>(i: I) -> Vec<i32>
  |    --------- required by a bound in this function
5 | where
6 |     It: Iterator<Item = i32>,
  |         ^^^^^^^^^^^^^^^^^^^^ required by this bound in `quicksort`
help: consider specifying the generic arguments
  |
9 |     quicksort::<It, _>(i.into_iter().filter(|_| true))
  |              +++++++++

error[E0275]: overflow evaluating the requirement `Filter<It, {closure@<source>:9:36: 9:39}>: IntoIterator`
 --> <source>:9:15
  |
9 |     quicksort(i.into_iter().filter(|_| true))
  |     --------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |     |
  |     required by a bound introduced by this call
  |
  = help: consider increasing the recursion limit by adding a `#![recursion_limit = "10"]` attribute to your crate (`example`)
note: required by a bound in `quicksort`
 --> <source>:7:8
  |
4 | fn quicksort<It, I>(i: I) -> Vec<i32>
  |    --------- required by a bound in this function
...
7 |     I: IntoIterator<IntoIter = It>,
  |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `quicksort`
help: consider removing this method call, as the receiver has type `<I as IntoIterator>::IntoIter` and `<I as IntoIterator>::IntoIter: IntoIterator` trivially holds
  |
9 -     quicksort(i.into_iter().filter(|_| true))
9 +     quicksort(i.into_iter())
  |

error[E0275]: overflow evaluating the requirement `<Filter<It, {closure@<source>:9:36: 9:39}> as IntoIterator>::IntoIter == It`
 --> <source>:9:15
  |
9 |     quicksort(i.into_iter().filter(|_| true))
  |     --------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |     |
  |     required by a bound introduced by this call
  |
  = help: consider increasing the recursion limit by adding a `#![recursion_limit = "10"]` attribute to your crate (`example`)
note: required by a bound in `quicksort`
 --> <source>:7:21
  |
4 | fn quicksort<It, I>(i: I) -> Vec<i32>
  |    --------- required by a bound in this function
...
7 |     I: IntoIterator<IntoIter = It>,
  |                     ^^^^^^^^^^^^^ required by this bound in `quicksort`

@oli-obk oli-obk added the fixed-by-next-solver Fixed by the next-generation trait solver, `-Znext-solver`. label Apr 8, 2024
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-const-eval Area: Constant evaluation, covers all const contexts (static, const fn, ...) A-diagnostics Area: Messages for errors, warnings, and lints A-trait-system Area: Trait system D-confusing Diagnostics: Confusing error or lint that should be reworked. D-terse Diagnostics: An error or lint that doesn't give enough information about the problem at hand. fixed-by-next-solver Fixed by the next-generation trait solver, `-Znext-solver`. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

3 participants