diff options
Diffstat (limited to '')
-rw-r--r-- | tests/ui/generic-const-items/basic.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/ui/generic-const-items/basic.rs b/tests/ui/generic-const-items/basic.rs new file mode 100644 index 000000000..73bfa803a --- /dev/null +++ b/tests/ui/generic-const-items/basic.rs @@ -0,0 +1,61 @@ +// 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; +} |