use serde::{Deserialize, Serialize}; #[test] fn test_self() { macro_rules! mac { ($($tt:tt)*) => { $($tt)* }; } pub trait Trait { type Assoc; } #[derive(Deserialize, Serialize)] pub struct Generics> where Self: Trait, ::Assoc: Sized, mac!(Self): Trait, { _f: T, } impl> Trait for Generics { type Assoc = Self; } #[derive(Deserialize, Serialize)] pub struct Struct { _f1: Box, _f2: Box<::Assoc>, _f3: Box, _f4: [(); Self::ASSOC], _f5: [(); Self::assoc()], _f6: [(); mac!(Self::assoc())], } impl Struct { const ASSOC: usize = 1; const fn assoc() -> usize { 0 } } impl Trait for Struct { type Assoc = Self; } #[derive(Deserialize, Serialize)] struct Tuple( Box, Box<::Assoc>, Box, [(); Self::ASSOC], [(); Self::assoc()], [(); mac!(Self::assoc())], ); impl Tuple { const ASSOC: usize = 1; const fn assoc() -> usize { 0 } } impl Trait for Tuple { type Assoc = Self; } #[derive(Deserialize, Serialize)] enum Enum { Struct { _f1: Box, _f2: Box<::Assoc>, _f3: Box, _f4: [(); Self::ASSOC], _f5: [(); Self::assoc()], _f6: [(); mac!(Self::assoc())], }, Tuple( Box, Box<::Assoc>, Box, [(); Self::ASSOC], [(); Self::assoc()], [(); mac!(Self::assoc())], ), } impl Enum { const ASSOC: usize = 1; const fn assoc() -> usize { 0 } } impl Trait for Enum { type Assoc = Self; } }