Parse impl qpath
diff --git a/src/generics.rs b/src/generics.rs
index afcf9a4..78c447f 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -490,19 +490,13 @@
 
     impl Parse for Generics {
         fn parse(input: ParseStream) -> Result<Self> {
-            let mut params = Punctuated::new();
-
             if !input.peek(Token![<]) {
-                return Ok(Generics {
-                    lt_token: None,
-                    params: params,
-                    gt_token: None,
-                    where_clause: None,
-                });
+                return Ok(Generics::default());
             }
 
             let lt_token: Token![<] = input.parse()?;
 
+            let mut params = Punctuated::new();
             let mut has_type_param = false;
             loop {
                 if input.peek(Token![>]) {
diff --git a/src/item.rs b/src/item.rs
index 39bd3cb..a851560 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -1719,7 +1719,19 @@
             let defaultness: Option<Token![default]> = input.parse()?;
             let unsafety: Option<Token![unsafe]> = input.parse()?;
             let impl_token: Token![impl ] = input.parse()?;
-            let generics: Generics = input.parse()?;
+
+            let has_generics = input.peek(Token![<])
+                && (input.peek2(Token![>])
+                    || input.peek2(Token![#])
+                    || (input.peek2(Ident) || input.peek2(Lifetime))
+                        && (input.peek3(Token![:]) || input.peek3(Token![,]) || input.peek3(Token![>]))
+                );
+            let generics: Generics = if has_generics {
+                input.parse()?
+            } else {
+                Generics::default()
+            };
+
             let trait_ = {
                 let ahead = input.fork();
                 if ahead.parse::<Option<Token![!]>>().is_ok()