Associated type bound has requirement overflow with impossible type
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 119k
- Forks
- 16.1k
- PR merge metrics
- PR metrics pending
Description
Unfortunately I do not have a minimal reproducer, but I do have a reproducer... on MacOS systems.
If you clone the Polars repository and check out 908c99a654fb9c46c63635c211962ac57ffc3719 on the main branch and try to run (the repository contains rust-toolchain.toml):
cargo check --all-features --bin dsl-schema
compilation fails with the following error:
error[E0275]: overflow evaluating the requirement `&itertools::groupbylazy::ChunkBy<_, _, _>: IntoIterator`
--> crates/polars-ops/src/frame/join/hash_join/single_keys_dispatch.rs:331:49
|
331 | ...rhs)) => group_join_inner(&lhs, &rhs, validate, nulls_equal),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`polars_ops`)
= note: required for `&Retained<ChunkBy<_, _, _>>` to implement `IntoIterator`
= note: 125 redundant requirements hidden
= note: required for `&Retained<Retained<Retained<...>>>` to implement `for<'a> IntoIterator`
note: required by a bound in `group_join_inner`
--> crates/polars-ops/src/frame/join/hash_join/single_keys_dispatch.rs:470:27
|
462 | fn group_join_inner<T>(
| ---------------- required by a bound in this function
...
470 | for<'a> &'a T::Array: IntoIterator<Item = Option<&'a T::Physical<'a>>>,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `group_join_inner`
= note: the full name for the type has been written to '...'
where the full type is
&objc2::rc::retained::Retained<itertools::groupbylazy::ChunkBy<_, _, _>>
&'a objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<objc2::rc::retained::Retained<itertools::groupbylazy::ChunkBy<_, _, _>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
The thing is... there is no way that T::Array could ever be objc2::rc::retained::Retained. Polars only has an indirect dependency on objc2 through arboard for clipboard support, and T::Array here comes from T: PolarsDataType which is only implemented for a handful for Polars-specific types. They are in completely different parts of the codebase and do not interact. These are the relevant bounds:
T: PolarsDataType,
for<'a> &'a T::Array: IntoIterator<Item = Option<&'a T::Physical<'a>>>,
Meta
The rust-toolchain.toml of the reproducer specifies nightly-2026-01-09, but I've tested it with nightly-2026-01-15 as well, still reproducing.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Check out Polars commit 908c99a654fb9c46c63635c211962ac57ffc3719 and run cargo check --all-features --bin dsl-schema on macOS. Start with crates/polars-ops/src/frame/join/hash_join/single_keys_dispatch.rs at lines 331 and 462-470, focusing on the IntoIterator bound and reported objc2 type. Done means the reproducer no longer produces the requirement-overflow error without weakening the stated bounds.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100