diff --git a/src/item.rs b/src/item.rs
index aaa99f9..d4a2a86 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -767,13 +767,12 @@
 
     impl Parse for Item {
         fn parse(input: ParseStream) -> Result<Self> {
-            // TODO: optimize using advance_to
+            let mut attrs = input.call(Attribute::parse_outer)?;
             let ahead = input.fork();
-            ahead.call(Attribute::parse_outer)?;
             let vis: Visibility = ahead.parse()?;
 
             let lookahead = ahead.lookahead1();
-            if lookahead.peek(Token![extern]) {
+            let mut item = if lookahead.peek(Token![extern]) {
                 ahead.parse::<Token![extern]>()?;
                 let lookahead = ahead.lookahead1();
                 if lookahead.peek(Token![crate]) {
@@ -865,7 +864,34 @@
                 input.parse().map(Item::Macro)
             } else {
                 Err(lookahead.error())
+            }?;
+
+            {
+                let item_attrs = match item {
+                    Item::ExternCrate(ref mut item) => &mut item.attrs,
+                    Item::Use(ref mut item) => &mut item.attrs,
+                    Item::Static(ref mut item) => &mut item.attrs,
+                    Item::Const(ref mut item) => &mut item.attrs,
+                    Item::Fn(ref mut item) => &mut item.attrs,
+                    Item::Mod(ref mut item) => &mut item.attrs,
+                    Item::ForeignMod(ref mut item) => &mut item.attrs,
+                    Item::Type(ref mut item) => &mut item.attrs,
+                    Item::Existential(ref mut item) => &mut item.attrs,
+                    Item::Struct(ref mut item) => &mut item.attrs,
+                    Item::Enum(ref mut item) => &mut item.attrs,
+                    Item::Union(ref mut item) => &mut item.attrs,
+                    Item::Trait(ref mut item) => &mut item.attrs,
+                    Item::TraitAlias(ref mut item) => &mut item.attrs,
+                    Item::Impl(ref mut item) => &mut item.attrs,
+                    Item::Macro(ref mut item) => &mut item.attrs,
+                    Item::Macro2(ref mut item) => &mut item.attrs,
+                    Item::Verbatim(_) => unreachable!(),
+                };
+                attrs.extend(item_attrs.drain(..));
+                *item_attrs = attrs;
             }
+
+            Ok(item)
         }
     }
 
@@ -1276,13 +1302,12 @@
 
     impl Parse for ForeignItem {
         fn parse(input: ParseStream) -> Result<Self> {
-            // TODO: optimize using advance_to
+            let mut attrs = input.call(Attribute::parse_outer)?;
             let ahead = input.fork();
-            ahead.call(Attribute::parse_outer)?;
             let vis: Visibility = ahead.parse()?;
 
             let lookahead = ahead.lookahead1();
-            if lookahead.peek(Token![fn]) {
+            let mut item = if lookahead.peek(Token![fn]) {
                 input.parse().map(ForeignItem::Fn)
             } else if lookahead.peek(Token![static]) {
                 input.parse().map(ForeignItem::Static)
@@ -1299,7 +1324,21 @@
                 input.parse().map(ForeignItem::Macro)
             } else {
                 Err(lookahead.error())
+            }?;
+
+            {
+                let item_attrs = match item {
+                    ForeignItem::Fn(ref mut item) => &mut item.attrs,
+                    ForeignItem::Static(ref mut item) => &mut item.attrs,
+                    ForeignItem::Type(ref mut item) => &mut item.attrs,
+                    ForeignItem::Macro(ref mut item) => &mut item.attrs,
+                    ForeignItem::Verbatim(_) => unreachable!(),
+                };
+                attrs.extend(item_attrs.drain(..));
+                *item_attrs = attrs;
             }
+
+            Ok(item)
         }
     }
 
@@ -1668,12 +1707,11 @@
 
     impl Parse for TraitItem {
         fn parse(input: ParseStream) -> Result<Self> {
-            // TODO: optimize using advance_to
+            let mut attrs = input.call(Attribute::parse_outer)?;
             let ahead = input.fork();
-            ahead.call(Attribute::parse_outer)?;
 
             let lookahead = ahead.lookahead1();
-            if lookahead.peek(Token![const]) {
+            let mut item = if lookahead.peek(Token![const]) {
                 ahead.parse::<Token![const]>()?;
                 let lookahead = ahead.lookahead1();
                 if lookahead.peek(Ident) {
@@ -1703,7 +1741,21 @@
                 input.parse().map(TraitItem::Macro)
             } else {
                 Err(lookahead.error())
+            }?;
+
+            {
+                let item_attrs = match item {
+                    TraitItem::Const(ref mut item) => &mut item.attrs,
+                    TraitItem::Method(ref mut item) => &mut item.attrs,
+                    TraitItem::Type(ref mut item) => &mut item.attrs,
+                    TraitItem::Macro(ref mut item) => &mut item.attrs,
+                    TraitItem::Verbatim(_) => unreachable!(),
+                };
+                attrs.extend(item_attrs.drain(..));
+                *item_attrs = attrs;
             }
+
+            Ok(item)
         }
     }
 
@@ -1914,9 +1966,8 @@
 
     impl Parse for ImplItem {
         fn parse(input: ParseStream) -> Result<Self> {
-            // TODO: optimize using advance_to
+            let mut attrs = input.call(Attribute::parse_outer)?;
             let ahead = input.fork();
-            ahead.call(Attribute::parse_outer)?;
             let vis: Visibility = ahead.parse()?;
 
             let mut lookahead = ahead.lookahead1();
@@ -1928,7 +1979,7 @@
                 None
             };
 
-            if lookahead.peek(Token![const]) {
+            let mut item = if lookahead.peek(Token![const]) {
                 ahead.parse::<Token![const]>()?;
                 let lookahead = ahead.lookahead1();
                 if lookahead.peek(Ident) {
@@ -1967,7 +2018,22 @@
                 input.parse().map(ImplItem::Macro)
             } else {
                 Err(lookahead.error())
+            }?;
+
+            {
+                let item_attrs = match item {
+                    ImplItem::Const(ref mut item) => &mut item.attrs,
+                    ImplItem::Method(ref mut item) => &mut item.attrs,
+                    ImplItem::Type(ref mut item) => &mut item.attrs,
+                    ImplItem::Existential(ref mut item) => &mut item.attrs,
+                    ImplItem::Macro(ref mut item) => &mut item.attrs,
+                    ImplItem::Verbatim(_) => unreachable!(),
+                };
+                attrs.extend(item_attrs.drain(..));
+                *item_attrs = attrs;
             }
+
+            Ok(item)
         }
     }
 
