Parse arbitrary self types as PatIdent
diff --git a/src/expr.rs b/src/expr.rs
index 1c883c8..7f43fb9 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -2531,16 +2531,20 @@
                             ahead.is_empty() || ahead.peek(Token![,])
                         }
                 })
+                || input.peek(Token![self]) && input.peek2(Token![::])
                 || input.peek(Token![::])
                 || input.peek(Token![<])
-                || input.peek(Token![self])
                 || input.peek(Token![Self])
                 || input.peek(Token![super])
                 || input.peek(Token![extern])
                 || input.peek(Token![crate])
             {
                 pat_path_or_macro_or_struct_or_range(input)
-            } else if input.peek(Token![ref]) || input.peek(Token![mut]) || input.peek(Ident) {
+            } else if input.peek(Token![ref])
+                || input.peek(Token![mut])
+                || input.peek(Token![self])
+                || input.peek(Ident)
+            {
                 input.call(pat_ident).map(Pat::Ident)
             } else if lookahead.peek(token::Paren) {
                 input.call(pat_tuple).map(Pat::Tuple)