Consume attributes in attr parser
diff --git a/syntax/attrs.rs b/syntax/attrs.rs
index 2bc03ea..8740d3d 100644
--- a/syntax/attrs.rs
+++ b/syntax/attrs.rs
@@ -39,7 +39,7 @@
     pub(crate) _more: (),
 }
 
-pub(super) fn parse(cx: &mut Errors, attrs: &[Attribute], mut parser: Parser) {
+pub(super) fn parse(cx: &mut Errors, attrs: Vec<Attribute>, mut parser: Parser) {
     for attr in attrs {
         if attr.path.is_ident("doc") {
             match parse_doc_attribute.parse2(attr.tokens.clone()) {
diff --git a/syntax/parse.rs b/syntax/parse.rs
index 3d970d8..1ea4db4 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -9,6 +9,7 @@
 };
 use proc_macro2::{Delimiter, Group, Span, TokenStream, TokenTree};
 use quote::{format_ident, quote, quote_spanned};
+use std::mem;
 use syn::parse::{ParseStream, Parser};
 use syn::punctuated::Punctuated;
 use syn::{
@@ -55,7 +56,8 @@
     apis
 }
 
-fn parse_struct(cx: &mut Errors, item: ItemStruct, namespace: &Namespace) -> Result<Api> {
+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();
@@ -63,7 +65,7 @@
     let mut rust_name = None;
     attrs::parse(
         cx,
-        &item.attrs,
+        attrs,
         attrs::Parser {
             doc: Some(&mut doc),
             derives: Some(&mut derives),
@@ -100,7 +102,7 @@
         let mut doc = Doc::new();
         attrs::parse(
             cx,
-            &field.attrs,
+            field.attrs,
             attrs::Parser {
                 doc: Some(&mut doc),
                 ..Default::default()
@@ -157,7 +159,7 @@
     let mut rust_name = None;
     attrs::parse(
         cx,
-        &item.attrs,
+        item.attrs,
         attrs::Parser {
             doc: Some(&mut doc),
             derives: Some(&mut derives),
@@ -223,15 +225,16 @@
 
 fn parse_variant(
     cx: &mut Errors,
-    variant: RustVariant,
+    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(
         cx,
-        &variant.attrs,
+        attrs,
         attrs::Parser {
             doc: Some(&mut doc),
             cxx_name: Some(&mut cxx_name),
@@ -298,7 +301,7 @@
     let mut namespace = namespace.clone();
     attrs::parse(
         cx,
-        &foreign_mod.attrs,
+        foreign_mod.attrs,
         attrs::Parser {
             namespace: Some(&mut namespace),
             ..Default::default()
@@ -306,7 +309,7 @@
     );
 
     let mut items = Vec::new();
-    for foreign in &foreign_mod.items {
+    for foreign in foreign_mod.items {
         match foreign {
             ForeignItem::Type(foreign) => {
                 let ety = parse_extern_type(cx, foreign, lang, trusted, &namespace);
@@ -390,7 +393,7 @@
 
 fn parse_extern_type(
     cx: &mut Errors,
-    foreign_type: &ForeignItemType,
+    foreign_type: ForeignItemType,
     lang: Lang,
     trusted: bool,
     namespace: &Namespace,
@@ -402,7 +405,7 @@
     let mut rust_name = None;
     attrs::parse(
         cx,
-        &foreign_type.attrs,
+        foreign_type.attrs,
         attrs::Parser {
             doc: Some(&mut doc),
             derives: Some(&mut derives),
@@ -443,18 +446,19 @@
 
 fn parse_extern_fn(
     cx: &mut Errors,
-    foreign_fn: &ForeignItemFn,
+    mut foreign_fn: ForeignItemFn,
     lang: Lang,
     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(
         cx,
-        &foreign_fn.attrs,
+        attrs,
         attrs::Parser {
             doc: Some(&mut doc),
             namespace: Some(&mut namespace),
@@ -606,7 +610,7 @@
 
 fn parse_extern_verbatim(
     cx: &mut Errors,
-    tokens: &TokenStream,
+    tokens: TokenStream,
     lang: Lang,
     trusted: bool,
     namespace: &Namespace,
@@ -675,7 +679,7 @@
             Err(lookahead.error())
         }
     }
-    .parse2(tokens.clone())
+    .parse2(tokens)
 }
 
 fn parse_type_alias(
@@ -699,7 +703,7 @@
     let mut rust_name = None;
     attrs::parse(
         cx,
-        &attrs,
+        attrs,
         attrs::Parser {
             doc: Some(&mut doc),
             derives: Some(&mut derives),
@@ -781,7 +785,7 @@
     let mut rust_name = None;
     attrs::parse(
         cx,
-        &attrs,
+        attrs,
         attrs::Parser {
             doc: Some(&mut doc),
             derives: Some(&mut derives),