OPAQUE_HIDDEN_INFERRED_BOUND in rustc_lint::opaque_hidden_inferred_bound - Rust
Description: The `opaque_hidden_inferred_bound` lint detects cases in which nested `impl Trait` in associated type bounds are not written generally enough to satisfy the bounds of the associated type.

Skip to main content

## OPAQUE_HIDDEN_INFERRED_BOUND

# Static OPAQUE_HIDDEN_INFERRED_BOUND

Source

    pub static OPAQUE_HIDDEN_INFERRED_BOUND: &Lint

Expand description

The `opaque_hidden_inferred_bound` lint detects cases in which nested `impl Trait` in associated type bounds are not written generally enough to satisfy the bounds of the associated type.

#### §Explanation

This functionality was removed in #97346, but then rolled back in #99860 because it caused regressions.

We plan on reintroducing this as a hard error, but in the meantime, this lint serves to warn and suggest fixes for any use-cases which rely on this behavior.

#### §Example

    #![feature(type_alias_impl_trait)]

    trait Duh {}

    impl Duh for i32 {}

    trait Trait {
        type Assoc: Duh;
    }

    impl<F: Duh> Trait for F {
        type Assoc = F;
    }

    type Tait = impl Sized;

    #[define_opaque(Tait)]
    fn test() -> impl Trait<Assoc = Tait> {
        42
    }

    fn main() {}

{{produces}}

In this example, `test` declares that the associated type `Assoc` for `impl Trait` is `impl Sized`, which does not satisfy the bound `Duh` on the associated type.

Although the hidden type, `i32` does satisfy this bound, we do not consider the return type to be well-formed with this lint. It can be fixed by changing `Tait = impl Sized` into `Tait = impl Sized + Duh`.