| //@ check-pass | |
| // Basic usage patterns of free & associated generic const items. | |
| #![feature(generic_const_items)] | |
| #![allow(incomplete_features)] | |
| fn main() { | |
| const NULL<T>: Option<T> = None::<T>; | |
| const NOTHING<T>: Option<T> = None; // arg inferred | |
| let _ = NOTHING::<String>; | |
| let _: Option<u8> = NULL; // arg inferred | |
| const IDENTITY<const X: u64>: u64 = X; | |
| const COUNT: u64 = IDENTITY::<48>; | |
| const AMOUNT: u64 = IDENTITY::<COUNT>; | |
| const NUMBER: u64 = IDENTITY::<{ AMOUNT * 2 }>; | |
| let _ = NUMBER; | |
| let _ = IDENTITY::<0>; | |
| let _ = match 0 { | |
| IDENTITY::<1> => 2, | |
| IDENTITY::<{ 1 + 1 }> => 4, | |
| _ => 0, | |
| }; | |
| const CREATE<I: Inhabited>: I = I::PROOF; | |
| let _ = CREATE::<u64>; | |
| let _: u64 = CREATE; // arg inferred | |
| let _ = <() as Main<u64>>::MAKE::<u64>; | |
| let _: (u64, u64) = <()>::MAKE; // args inferred | |
| } | |
| pub fn usage<'any>() { | |
| const REGION_POLY<'a>: &'a () = &(); | |
| let _: &'any () = REGION_POLY::<'any>; | |
| let _: &'any () = REGION_POLY::<'_>; | |
| let _: &'static () = REGION_POLY; | |
| } | |
| trait Main<O> { | |
| type Output<I>; | |
| const MAKE<I: Inhabited>: Self::Output<I>; | |
| } | |
| impl<O: Inhabited> Main<O> for () { | |
| type Output<I> = (O, I); | |
| const MAKE<I: Inhabited>: Self::Output<I> = (O::PROOF, I::PROOF); | |
| } | |
| trait Inhabited { | |
| const PROOF: Self; | |
| } | |
| impl Inhabited for u64 { | |
| const PROOF: Self = 512; | |
| } |