// Regression test for #66768. // check-pass #![allow(dead_code)] //-^ "dead code" is needed to reproduce the issue. use std::marker::PhantomData; use std::ops::{Add, Mul}; fn problematic_function(material_surface_element: Edge2dElement) where DefaultAllocator: FiniteElementAllocator, { let _: Point2 = material_surface_element.map_reference_coords().into(); } impl ArrayLength for UTerm { type ArrayType = (); } impl> ArrayLength for UInt { type ArrayType = GenericArrayImplEven; } impl> ArrayLength for UInt { type ArrayType = GenericArrayImplOdd; } impl Add for UTerm { type Output = U; fn add(self, _: U) -> Self::Output { unimplemented!() } } impl Add> for UInt where Ul: Add, { type Output = UInt, B1>; fn add(self, _: UInt) -> Self::Output { unimplemented!() } } impl Mul for UTerm { type Output = UTerm; fn mul(self, _: U) -> Self { unimplemented!() } } impl Mul> for UInt where Ul: Mul>, { type Output = UInt>, B0>; fn mul(self, _: UInt) -> Self::Output { unimplemented!() } } impl Mul> for UInt where Ul: Mul>, UInt>, B0>: Add>, { type Output = Sum>, B0>, UInt>; fn mul(self, _: UInt) -> Self::Output { unimplemented!() } } impl Allocator for DefaultAllocator where R: DimName, C: DimName, R::Value: Mul, Prod: ArrayLength, { type Buffer = ArrayStorage; fn allocate_uninitialized(_: R, _: C) -> Self::Buffer { unimplemented!() } fn allocate_from_iterator(_: R, _: C, _: I) -> Self::Buffer { unimplemented!() } } impl Allocator for DefaultAllocator { type Buffer = VecStorage; fn allocate_uninitialized(_: Dynamic, _: C) -> Self::Buffer { unimplemented!() } fn allocate_from_iterator(_: Dynamic, _: C, _: I) -> Self::Buffer { unimplemented!() } } impl DimName for DimU1 { type Value = U1; fn name() -> Self { unimplemented!() } } impl DimName for DimU2 { type Value = U2; fn name() -> Self { unimplemented!() } } impl From> for Point where DefaultAllocator: Allocator, { fn from(_: VectorN) -> Self { unimplemented!() } } impl FiniteElementAllocator for DefaultAllocator where DefaultAllocator: Allocator + Allocator { } impl ReferenceFiniteElement for Edge2dElement { type NodalDim = DimU1; } impl FiniteElement for Edge2dElement { fn map_reference_coords(&self) -> Vector2 { unimplemented!() } } type Owned = >::Buffer; type MatrixMN = Matrix>; type VectorN = MatrixMN; type Vector2 = VectorN; type Point2 = Point; type U1 = UInt; type U2 = UInt, B0>; type Sum = >::Output; type Prod = >::Output; struct GenericArray> { _data: U::ArrayType, } struct GenericArrayImplEven { _parent2: U, _marker: T, } struct GenericArrayImplOdd { _parent2: U, _data: T, } struct B0; struct B1; struct UTerm; struct UInt { _marker: PhantomData<(U, B)>, } struct DefaultAllocator; struct Dynamic; struct DimU1; struct DimU2; struct Matrix { _data: S, _phantoms: PhantomData<(N, R, C)>, } struct ArrayStorage where R: DimName, C: DimName, R::Value: Mul, Prod: ArrayLength, { _data: GenericArray>, } struct VecStorage { _data: N, _nrows: R, _ncols: C, } struct Point where DefaultAllocator: Allocator, { _coords: VectorN, } struct Edge2dElement; trait ArrayLength { type ArrayType; } trait Allocator { type Buffer; fn allocate_uninitialized(nrows: R, ncols: C) -> Self::Buffer; fn allocate_from_iterator(nrows: R, ncols: C, iter: I) -> Self::Buffer; } trait DimName { type Value; fn name() -> Self; } trait FiniteElementAllocator: Allocator + Allocator { } trait ReferenceFiniteElement { type NodalDim; } trait FiniteElement: ReferenceFiniteElement where DefaultAllocator: FiniteElementAllocator, { fn map_reference_coords(&self) -> VectorN; } fn main() {}