| // ICE unexpected inference var | |
| // issue: rust-lang/rust#116599 | |
| //@ check-pass | |
| pub trait EvaluateConstMethods { | |
| type Trait: TraitWithConstMethods; | |
| /// **This block breaks** | |
| const DATA_3: Data3 = { | |
| <<<Self::Trait as TraitWithConstMethods>::Method2 as ConstFn<_, _>>::Body< | |
| <<Self::Trait as TraitWithConstMethods>::Method1 as ConstFn<_, _>>::Body<ContainsData1>, | |
| > as Contains<_>>::ITEM | |
| }; | |
| } | |
| pub trait TraitWithConstMethods { | |
| /// "const trait method" of signature `fn(Data1) -> Data2` | |
| type Method1: ConstFn<Data1, Data2>; | |
| /// "const trait method" of signature `fn(Data2) -> Data3` | |
| type Method2: ConstFn<Data2, Data3>; | |
| } | |
| /// A trait which tries to implement const methods in traits | |
| pub trait ConstFn<Arg, Ret> { | |
| type Body<T: Contains<Arg>>: Contains<Ret>; | |
| } | |
| /// A ZST which represents / "contains" a const value which can be pass to a [`ConstFn`] | |
| pub trait Contains<T> { | |
| const ITEM: T; | |
| } | |
| pub struct ContainsData1; | |
| impl Contains<Data1> for ContainsData1 { | |
| const ITEM: Data1 = Data1 {}; | |
| } | |
| // Arbitrary data | |
| pub struct Data1 {} | |
| pub struct Data2 {} | |
| pub struct Data3 {} | |
| pub fn main() {} |