Store passthrough attributes for diagnostic lint levels
diff --git a/syntax/parse.rs b/syntax/parse.rs
index 1ea4db4..87f43b2 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -57,15 +57,14 @@
 }
 
 fn parse_struct(cx: &mut Errors, mut item: ItemStruct, namespace: &Namespace) -> Result<Api> {
-    let attrs = mem::take(&mut item.attrs);
     let mut doc = Doc::new();
     let mut derives = Vec::new();
     let mut namespace = namespace.clone();
     let mut cxx_name = None;
     let mut rust_name = None;
-    attrs::parse(
+    let attrs = attrs::parse(
         cx,
-        attrs,
+        mem::take(&mut item.attrs),
         attrs::Parser {
             doc: Some(&mut doc),
             derives: Some(&mut derives),
@@ -100,7 +99,7 @@
     for field in named_fields.named {
         let ident = field.ident.unwrap();
         let mut doc = Doc::new();
-        attrs::parse(
+        let attrs = attrs::parse(
             cx,
             field.attrs,
             attrs::Parser {
@@ -123,6 +122,7 @@
         });
         fields.push(Var {
             doc,
+            attrs,
             visibility,
             ident,
             ty,
@@ -142,6 +142,7 @@
     Ok(Api::Struct(Struct {
         doc,
         derives,
+        attrs,
         visibility,
         struct_token,
         name,
@@ -157,7 +158,7 @@
     let mut namespace = namespace.clone();
     let mut cxx_name = None;
     let mut rust_name = None;
-    attrs::parse(
+    let attrs = attrs::parse(
         cx,
         item.attrs,
         attrs::Parser {
@@ -213,6 +214,7 @@
     Ok(Api::Enum(Enum {
         doc,
         derives,
+        attrs,
         enum_token,
         name,
         brace_token,
@@ -228,13 +230,12 @@
     mut variant: RustVariant,
     discriminants: &mut DiscriminantSet,
 ) -> Result<Variant> {
-    let attrs = mem::take(&mut variant.attrs);
     let mut doc = Doc::new();
     let mut cxx_name = None;
     let mut rust_name = None;
-    attrs::parse(
+    let attrs = attrs::parse(
         cx,
-        attrs,
+        mem::take(&mut variant.attrs),
         attrs::Parser {
             doc: Some(&mut doc),
             cxx_name: Some(&mut cxx_name),
@@ -266,6 +267,7 @@
 
     Ok(Variant {
         doc,
+        attrs,
         name,
         discriminant,
         expr,
@@ -403,7 +405,7 @@
     let mut namespace = namespace.clone();
     let mut cxx_name = None;
     let mut rust_name = None;
-    attrs::parse(
+    let attrs = attrs::parse(
         cx,
         foreign_type.attrs,
         attrs::Parser {
@@ -434,6 +436,7 @@
         lang,
         doc,
         derives,
+        attrs,
         type_token,
         name,
         generics,
@@ -451,14 +454,13 @@
     trusted: bool,
     namespace: &Namespace,
 ) -> Result<Api> {
-    let attrs = mem::take(&mut foreign_fn.attrs);
     let mut doc = Doc::new();
     let mut namespace = namespace.clone();
     let mut cxx_name = None;
     let mut rust_name = None;
-    attrs::parse(
+    let attrs = attrs::parse(
         cx,
-        attrs,
+        mem::take(&mut foreign_fn.attrs),
         attrs::Parser {
             doc: Some(&mut doc),
             namespace: Some(&mut namespace),
@@ -542,9 +544,11 @@
                 let ty = parse_type(&arg.ty)?;
                 if ident != "self" {
                     let doc = Doc::new();
+                    let attrs = Vec::new();
                     let visibility = Token![pub](ident.span());
                     args.push_value(Var {
                         doc,
+                        attrs,
                         visibility,
                         ident,
                         ty,
@@ -591,6 +595,7 @@
     }(ExternFn {
         lang,
         doc,
+        attrs,
         name,
         sig: Signature {
             unsafety,
@@ -701,7 +706,7 @@
     let mut namespace = namespace.clone();
     let mut cxx_name = None;
     let mut rust_name = None;
-    attrs::parse(
+    let attrs = attrs::parse(
         cx,
         attrs,
         attrs::Parser {
@@ -725,6 +730,7 @@
     Ok(Api::TypeAlias(TypeAlias {
         doc,
         derives,
+        attrs,
         type_token,
         name,
         generics,
@@ -783,7 +789,7 @@
     let mut namespace = namespace.clone();
     let mut cxx_name = None;
     let mut rust_name = None;
-    attrs::parse(
+    let attrs = attrs::parse(
         cx,
         attrs,
         attrs::Parser {
@@ -805,6 +811,7 @@
         lang,
         doc,
         derives,
+        attrs,
         type_token,
         name,
         generics,
@@ -1115,9 +1122,11 @@
                 None => format_ident!("arg{}", i),
             };
             let doc = Doc::new();
+            let attrs = Vec::new();
             let visibility = Token![pub](ident.span());
             Ok(Var {
                 doc,
+                attrs,
                 visibility,
                 ident,
                 ty,