-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Open
Labels
C-bugCategory: This is a bug.Category: This is a bug.F-lazy_type_alias`#![feature(lazy_type_alias)]``#![feature(lazy_type_alias)]`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant 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`.Fixed by the next-generation trait solver, `-Znext-solver`.requires-nightlyThis issue requires a nightly compiler in some way.This issue requires a nightly compiler in some way.
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
C-bugCategory: This is a bug.Category: This is a bug.F-lazy_type_alias`#![feature(lazy_type_alias)]``#![feature(lazy_type_alias)]`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant 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`.Fixed by the next-generation trait solver, `-Znext-solver`.requires-nightlyThis issue requires a nightly compiler in some way.This issue requires a nightly compiler in some way.
Type
Projects
Status
Can Do