Support derive(Default) on structs
diff --git a/macro/src/derive.rs b/macro/src/derive.rs
index 91a5d9d..be8ad82 100644
--- a/macro/src/derive.rs
+++ b/macro/src/derive.rs
@@ -14,6 +14,7 @@
             Trait::Copy => expanded.extend(struct_copy(strct, span)),
             Trait::Clone => expanded.extend(struct_clone(strct, span)),
             Trait::Debug => expanded.extend(struct_debug(strct, span)),
+            Trait::Default => expanded.extend(struct_default(strct, span)),
             Trait::Eq => traits.push(quote_spanned!(span=> ::std::cmp::Eq)),
             Trait::Ord => expanded.extend(struct_ord(strct, span)),
             Trait::PartialEq => traits.push(quote_spanned!(span=> ::std::cmp::PartialEq)),
@@ -50,6 +51,7 @@
                 has_clone = true;
             }
             Trait::Debug => expanded.extend(enum_debug(enm, span)),
+            Trait::Default => unreachable!(),
             Trait::Eq => {
                 traits.push(quote_spanned!(span=> ::std::cmp::Eq));
                 has_eq = true;
@@ -136,6 +138,23 @@
     }
 }
 
+fn struct_default(strct: &Struct, span: Span) -> TokenStream {
+    let ident = &strct.name.rust;
+    let fields = strct.fields.iter().map(|field| &field.ident);
+
+    quote_spanned! {span=>
+        impl ::std::default::Default for #ident {
+            fn default() -> Self {
+                #ident {
+                    #(
+                        #fields: ::std::default::Default::default(),
+                    )*
+                }
+            }
+        }
+    }
+}
+
 fn struct_ord(strct: &Struct, span: Span) -> TokenStream {
     let ident = &strct.name.rust;
     let fields = strct.fields.iter().map(|field| &field.ident);
diff --git a/syntax/check.rs b/syntax/check.rs
index 85db2480..725105d 100644
--- a/syntax/check.rs
+++ b/syntax/check.rs
@@ -3,7 +3,7 @@
 use crate::syntax::types::TrivialReason;
 use crate::syntax::{
     error, ident, Api, Array, Enum, ExternFn, ExternType, Impl, Lang, Receiver, Ref, Signature,
-    SliceRef, Struct, Ty1, Type, Types,
+    SliceRef, Struct, Trait, Ty1, Type, Types,
 };
 use proc_macro2::{Delimiter, Group, Ident, TokenStream};
 use quote::{quote, ToTokens};
@@ -256,6 +256,15 @@
             "explicit #[repr(...)] is required for enum without any variants",
         );
     }
+
+    for derive in &enm.derives {
+        if derive.what == Trait::Default {
+            cx.error(
+                derive,
+                "derive(Default) on shared enums is not supported yet",
+            );
+        }
+    }
 }
 
 fn check_api_type(cx: &mut Check, ety: &ExternType) {
diff --git a/syntax/derive.rs b/syntax/derive.rs
index 813cf26..a8b6bde 100644
--- a/syntax/derive.rs
+++ b/syntax/derive.rs
@@ -11,6 +11,7 @@
     Clone,
     Copy,
     Debug,
+    Default,
     Eq,
     Ord,
     PartialEq,
@@ -23,6 +24,7 @@
             "Clone" => Trait::Clone,
             "Copy" => Trait::Copy,
             "Debug" => Trait::Debug,
+            "Default" => Trait::Default,
             "Eq" => Trait::Eq,
             "Ord" => Trait::Ord,
             "PartialEq" => Trait::PartialEq,
@@ -46,6 +48,7 @@
             Trait::Clone => "Clone",
             Trait::Copy => "Copy",
             Trait::Debug => "Debug",
+            Trait::Default => "Default",
             Trait::Eq => "Eq",
             Trait::Ord => "Ord",
             Trait::PartialEq => "PartialEq",