Check for word boundary after numeric suffixes
diff --git a/src/stable.rs b/src/stable.rs
index 02cd626..297177a 100644
--- a/src/stable.rs
+++ b/src/stable.rs
@@ -11,7 +11,7 @@
 
 use proc_macro;
 use unicode_xid::UnicodeXID;
-use strnom::{PResult, skip_whitespace, block_comment, whitespace};
+use strnom::{PResult, skip_whitespace, block_comment, whitespace, word_break};
 
 use {TokenTree, TokenKind, Delimiter, OpKind};
 
@@ -721,19 +721,17 @@
     true
 }
 
-named!(float -> (), do_parse!(
-    float_string >>
-    alt!(
-        tag!("f32") => { |_| () }
-        |
-        tag!("f64") => { |_| () }
-        |
-        epsilon!()
-    ) >>
-    (())
-));
+fn float(input: &str) -> PResult<()> {
+    let (rest, ()) = float_digits(input)?;
+    for suffix in &["f32", "f64"] {
+        if rest.starts_with(suffix) {
+            return word_break(&rest[suffix.len()..]);
+        }
+    }
+    word_break(rest)
+}
 
-fn float_string(input: &str) -> PResult<()> {
+fn float_digits(input: &str) -> PResult<()> {
     let mut chars = input.chars().peekable();
     match chars.next() {
         Some(ch) if ch >= '0' && ch <= '9' => {}
@@ -808,37 +806,28 @@
     Ok((&input[len..], ()))
 }
 
-named!(int -> (), do_parse!(
-    digits >>
-    alt!(
-        tag!("isize") => { |_| () }
-        |
-        tag!("i8") => { |_| () }
-        |
-        tag!("i16") => { |_| () }
-        |
-        tag!("i32") => { |_| () }
-        |
-        tag!("i64") => { |_| () }
-        |
-        tag!("i128") => { |_| () }
-        |
-        tag!("usize") => { |_| () }
-        |
-        tag!("u8") => { |_| () }
-        |
-        tag!("u16") => { |_| () }
-        |
-        tag!("u32") => { |_| () }
-        |
-        tag!("u64") => { |_| () }
-        |
-        tag!("u128") => { |_| () }
-        |
-        epsilon!()
-    ) >>
-    (())
-));
+fn int(input: &str) -> PResult<()> {
+    let (rest, ()) = digits(input)?;
+    for suffix in &[
+        "isize",
+        "i8",
+        "i16",
+        "i32",
+        "i64",
+        "i128",
+        "usize",
+        "u8",
+        "u16",
+        "u32",
+        "u64",
+        "u128",
+    ] {
+        if rest.starts_with(suffix) {
+            return word_break(&rest[suffix.len()..]);
+        }
+    }
+    word_break(rest)
+}
 
 fn digits(mut input: &str) -> PResult<()> {
     let base = if input.starts_with("0x") {
@@ -996,4 +985,16 @@
             0xffffffffffffffffffffffffffffffff
         ");
     }
+
+    #[test]
+    fn fail() {
+        fn fail(p: &str) {
+            if p.parse::<TokenStream>().is_ok() {
+                panic!("should have failed to parse: {}", p);
+            }
+        }
+        fail("1x");
+        fail("1u80");
+        fail("1f320");
+    }
 }