xref: /DragonOS/kernel/crates/intertrait/tests/ui/on-generic-type.rs (revision bd70d2d1f490aabd570a5301b858bd5eb04149fa)
1*bd70d2d1SLoGin use intertrait::*;
2*bd70d2d1SLoGin use intertrait::cast::*;
3*bd70d2d1SLoGin use std::marker::PhantomData;
4*bd70d2d1SLoGin 
5*bd70d2d1SLoGin #[cast_to(Greet)]
6*bd70d2d1SLoGin struct Data<T: 'static> {
7*bd70d2d1SLoGin     phantom: PhantomData<T>,
8*bd70d2d1SLoGin }
9*bd70d2d1SLoGin 
10*bd70d2d1SLoGin trait Source: CastFrom {}
11*bd70d2d1SLoGin 
12*bd70d2d1SLoGin trait Greet {
greet(&self)13*bd70d2d1SLoGin     fn greet(&self);
14*bd70d2d1SLoGin }
15*bd70d2d1SLoGin 
16*bd70d2d1SLoGin impl<T: 'static> Greet for Data<T> {
greet(&self)17*bd70d2d1SLoGin     fn greet(&self) {
18*bd70d2d1SLoGin         println!("Hello");
19*bd70d2d1SLoGin     }
20*bd70d2d1SLoGin }
21*bd70d2d1SLoGin 
22*bd70d2d1SLoGin impl<T: 'static> Source for Data<T> {}
23*bd70d2d1SLoGin 
main()24*bd70d2d1SLoGin fn main() {
25*bd70d2d1SLoGin     let data = Data::<i32> {
26*bd70d2d1SLoGin         phantom: PhantomData,
27*bd70d2d1SLoGin     };
28*bd70d2d1SLoGin     let source: &dyn Source = &data;
29*bd70d2d1SLoGin     let greet = source.cast::<dyn Greet>();
30*bd70d2d1SLoGin     greet.unwrap().greet();
31*bd70d2d1SLoGin }
32