| #![feature(generic_const_exprs)] |
| #![allow(incomplete_features)] |
| |
| trait TensorDimension { |
| const DIM: usize; |
| } |
| |
| trait TensorSize: TensorDimension { |
| fn size(&self) -> [usize; Self::DIM]; |
| } |
| |
| trait Broadcastable: TensorSize + Sized { |
| type Element; |
| fn lazy_updim<const NEWDIM: usize>(&self, size: [usize; NEWDIM]) {} |
| } |
| |
| struct BMap<'a, R, T: Broadcastable, F: Fn(T::Element) -> R, const DIM: usize> { |
| reference: &'a T, |
| closure: F, |
| } |
| |
| impl<'a, R, T: Broadcastable, F: Fn(T::Element) -> R, const DIM: usize> TensorDimension |
| for BMap<'a, R, T, F, DIM> |
| { |
| const DIM: usize = DIM; |
| } |
| impl<'a, R, T: Broadcastable, F: Fn(T::Element) -> R, const DIM: usize> TensorSize |
| for BMap<'a, R, T, F, DIM> |
| { |
| fn size(&self) -> [usize; DIM] { |
| //~^ ERROR: method not compatible with trait [E0308] |
| self.reference.size() |
| //~^ ERROR: unconstrained generic constant |
| //~| ERROR: mismatched types |
| } |
| } |
| |
| fn main() {} |