rust-lang / rust-lang/rust

Associated type bound has requirement overflow with impossible type

Open
#151,206 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

A-type-system C-bug E-needs-mcve needs-triage
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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.