1 #[cfg(feature = "use_core")]
2 extern crate core;
3 
4 #[macro_use]
5 extern crate derivative;
6 
7 #[derive(Debug, Derivative, PartialEq)]
8 #[derivative(Default="new")]
9 struct Foo<T, U> {
10     foo: T,
11     #[derivative(Default(value="min()", bound="U: std::ops::Not<Output=U>, U: Default"))]
12     bar: U,
13 }
14 
15 #[derive(Debug, Derivative, PartialEq)]
16 #[derivative(Default(bound="T: Default, U: std::ops::Not<Output=U>, U: Default", new="true"))]
17 struct Bar<T, U> {
18     foo: T,
19     #[derivative(Default(value="min()"))]
20     bar: U,
21 }
22 
min<T: Default + std::ops::Not<Output=T>>() -> T23 fn min<T: Default + std::ops::Not<Output=T>>() -> T {
24     !T::default()
25 }
26 
27 #[derive(Debug, Derivative, PartialEq)]
28 #[derivative(Default(bound=""))]
29 struct WithOption<T> {
30     foo: Option<T>,
31 }
32 
33 struct NonDefault;
34 
35 #[test]
main()36 fn main() {
37     assert_eq!(Foo::default(), Foo { foo: 0u8, bar: 0xffu8 });
38     assert_eq!(Bar::default(), Bar { foo: 0u8, bar: 0xffu8 });
39     assert_eq!(Foo::new(), Foo { foo: 0u8, bar: 0xffu8 });
40     assert_eq!(Bar::new(), Bar { foo: 0u8, bar: 0xffu8 });
41     WithOption::<NonDefault>::default();
42 }
43