2023-04-16 11:12:37 +00:00
|
|
|
//@ known-bug: #110395
|
|
|
|
|
|
2022-09-24 06:02:49 +00:00
|
|
|
#![feature(const_trait_impl, min_specialization, rustc_attrs)]
|
|
|
|
|
|
2024-12-21 20:25:43 +00:00
|
|
|
use std::fmt::Debug;
|
|
|
|
|
|
2022-09-24 06:02:49 +00:00
|
|
|
#[rustc_specialization_trait]
|
|
|
|
|
#[const_trait]
|
|
|
|
|
pub unsafe trait Sup {
|
|
|
|
|
fn foo() -> u32;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[rustc_specialization_trait]
|
|
|
|
|
#[const_trait]
|
2025-03-11 12:08:45 +00:00
|
|
|
pub unsafe trait Sub: [const] Sup {}
|
2022-09-24 06:02:49 +00:00
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-21 20:25:43 +00:00
|
|
|
impl<T: [const] Debug> const A for T {
|
2022-09-24 06:02:49 +00:00
|
|
|
default fn a() -> u32 {
|
|
|
|
|
2
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-21 20:25:43 +00:00
|
|
|
impl<T: [const] Debug + [const] Sup> const A for T {
|
2022-09-24 06:02:49 +00:00
|
|
|
default fn a() -> u32 {
|
|
|
|
|
3
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-21 20:25:43 +00:00
|
|
|
impl<T: [const] Debug + [const] Sub> const A for T {
|
2022-09-24 06:02:49 +00:00
|
|
|
fn a() -> u32 {
|
|
|
|
|
T::foo()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const _: () = assert!(<()>::a() == 42);
|
|
|
|
|
const _: () = assert!(<u8>::a() == 3);
|
|
|
|
|
const _: () = assert!(<u16>::a() == 2);
|
|
|
|
|
|
|
|
|
|
fn main() {}
|