Open
Description
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
Labels
Type
Projects
Status
Can Do