| //@ known-bug: #138156 |
| |
| #![feature(generic_const_exprs)] |
| |
| #[derive(Default)] |
| pub struct GenId<const IDX: usize>; |
| |
| pub trait IndexTrait: Default { |
| const IDX: usize; |
| } |
| pub trait ToplogyIndex { |
| type Idx: IndexTrait; |
| } |
| |
| #[derive(Default)] |
| pub struct Expression<T: ToplogyIndex> { |
| pub data: T, |
| } |
| |
| fn i<T: ToplogyIndex, const IDX0: usize, const IDX1: usize>(s: Expression<T>) -> |
| Expression<GenId<{ IDX0 | IDX1 }>> |
| where |
| GenId<{ IDX0 | IDX1 }>: ToplogyIndex, |
| { |
| Expression::default() |
| } |
| |
| pub fn sum<In: ToplogyIndex>(s: Expression<In>) -> Expression<In> |
| where |
| [(); In::Idx::IDX]:, |
| { |
| s |
| } |
| |
| fn param_position<In: ToplogyIndex>(s: Expression<In>) |
| where |
| GenId<{ 1 | 2 }>: ToplogyIndex, |
| { |
| sum(i::<_, 1, 2>(s)); |
| } |
| |
| fn main() {} |