1 // check-pass
2 // Regression test for #48551. Covers a case where duplicate candidates
3 // arose during associated type projection.
4 
5 use std::ops::{Mul, MulAssign};
6 
7 pub trait ClosedMul<Right>: Sized + Mul<Right, Output = Self> + MulAssign<Right> {}
8 impl<T, Right> ClosedMul<Right> for T
9 where
10     T: Mul<Right, Output = T> + MulAssign<Right>,
11 {
12 }
13 
14 pub trait InnerSpace: ClosedMul<<Self as InnerSpace>::Real> {
15     type Real;
16 }
17 
18 pub trait FiniteDimVectorSpace: ClosedMul<<Self as FiniteDimVectorSpace>::Field> {
19     type Field;
20 }
21 
22 pub trait FiniteDimInnerSpace
23     : InnerSpace + FiniteDimVectorSpace<Field = <Self as InnerSpace>::Real> {
24 }
25 
26 pub trait EuclideanSpace: ClosedMul<<Self as EuclideanSpace>::Real> {
27     type Coordinates: FiniteDimInnerSpace<Real = Self::Real>
28         + Mul<Self::Real, Output = Self::Coordinates>
29         + MulAssign<Self::Real>;
30 
31     type Real;
32 }
33 
34 fn main() {}
35