56 lines
908 B
Rust
56 lines
908 B
Rust
|
// check-pass
|
||
|
#![feature(const_trait_impl, min_specialization, rustc_attrs)]
|
||
|
|
||
|
#[rustc_specialization_trait]
|
||
|
#[const_trait]
|
||
|
pub unsafe trait Sup {
|
||
|
fn foo() -> u32;
|
||
|
}
|
||
|
|
||
|
#[rustc_specialization_trait]
|
||
|
#[const_trait]
|
||
|
pub unsafe trait Sub: ~const Sup {}
|
||
|
|
||
|
unsafe impl const Sup for u8 {
|
||
|
default fn foo() -> u32 {
|
||
|
1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
unsafe impl const Sup for () {
|
||
|
fn foo() -> u32 {
|
||
|
42
|
||
|
}
|
||
|
}
|
||
|
|
||
|
unsafe impl const Sub for () {}
|
||
|
|
||
|
#[const_trait]
|
||
|
pub trait A {
|
||
|
fn a() -> u32;
|
||
|
}
|
||
|
|
||
|
impl<T: ~const Default> const A for T {
|
||
|
default fn a() -> u32 {
|
||
|
2
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl<T: ~const Default + ~const Sup> const A for T {
|
||
|
default fn a() -> u32 {
|
||
|
3
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl<T: ~const Default + ~const Sub> const A for T {
|
||
|
fn a() -> u32 {
|
||
|
T::foo()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const _: () = assert!(<()>::a() == 42);
|
||
|
const _: () = assert!(<u8>::a() == 3);
|
||
|
const _: () = assert!(<u16>::a() == 2);
|
||
|
|
||
|
fn main() {}
|