Skip to content

lazy_type_alias: trait bound no longer satisified #114218

Open
@matthiaskrgr

Description

@matthiaskrgr

I tried this code:
tests/ui/associated-types/param-env-normalize-cycle.rs

// Minimized case from typenum that didn't compile because:
// - We tried to normalize the ParamEnv of the second impl
// - This requires trying to normalize `GrEq<Self, Square<Square<U>>>`
// - This requires proving `Square<Square<U>>: Sized` so that the first impl
//   applies
// - This requires Providing `Square<Square<U>>` is well-formed, so that we
//   can use the `Sized` bound on `Mul::Output`
// - This requires proving `Square<U>: Mul`
// - But first we tried normalizing the whole obligation, including the
//   ParamEnv, which leads to a cycle error.

// check-pass

trait PrivateSquareRoot {}

pub trait Mul<Rhs = Self> {
    type Output;
}

pub trait IsGreaterOrEqual<Rhs> {
    type Output;
}

pub type Square<A> = <A as Mul>::Output;
pub type GrEq<A, B> = <A as IsGreaterOrEqual<B>>::Output;

impl<A, B> IsGreaterOrEqual<B> for A {
    type Output = ();
}

impl<U> PrivateSquareRoot for U
where
    U: Mul,
    Square<U>: Mul,
    GrEq<Self, Square<Square<U>>>: Sized,
{
}

fn main() {}

without `-Zcrate-attr=feature(lazy_type_alias)´: no warnings

with -Zcrate-attr=feature(lazy_type_alias):

error[E0277]: the trait bound `<U as Mul>::Output: Mul` is not satisfied
  --> tests/ui/associated-types/param-env-normalize-cycle.rs:31:1
   |
31 | impl<U> PrivateSquareRoot for U
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Mul` is not implemented for `<U as Mul>::Output`
   |
help: consider further restricting the associated type
   |
35 |     GrEq<Self, Square<Square<U>>>: Sized, <U as Mul>::Output: Mul
   |                                         ~~~~~~~~~~~~~~~~~~~~~~~~~

error[E0277]: the trait bound `<U as Mul>::Output: Mul` is not satisfied
  --> tests/ui/associated-types/param-env-normalize-cycle.rs:31:1
   |
31 | / impl<U> PrivateSquareRoot for U
32 | | where
33 | |     U: Mul,
34 | |     Square<U>: Mul,
35 | |     GrEq<Self, Square<Square<U>>>: Sized,
36 | | {
37 | | }
   | |_^ the trait `Mul` is not implemented for `<U as Mul>::Output`
   |
help: consider further restricting the associated type
   |
35 |     GrEq<Self, Square<Square<U>>>: Sized, <U as Mul>::Output: Mul
   |                                         ~~~~~~~~~~~~~~~~~~~~~~~~~

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0277`.
rustc 1.73.0-nightly (04abc370b 2023-07-28)
binary: rustc
commit-hash: 04abc370b9f3855b28172b65a7f7d5a433f41412
commit-date: 2023-07-28
host: x86_64-unknown-linux-gnu
release: 1.73.0-nightly
LLVM version: 16.0.5

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.F-lazy_type_alias`#![feature(lazy_type_alias)]`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.fixed-by-next-solverFixed by the next-generation trait solver, `-Znext-solver`.requires-nightlyThis issue requires a nightly compiler in some way.

    Type

    No type

    Projects

    Status

    Can Do

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions