Allow indices as struct literal keys
diff --git a/src/expr.rs b/src/expr.rs
index 5ccb227..ece698c 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -312,7 +312,7 @@
          TokenTree, Ty, UnOp};
     use attr::parsing::outer_attr;
     use generics::parsing::lifetime;
-    use ident::parsing::ident;
+    use ident::parsing::{ident, wordlike};
     use item::parsing::item;
     use lit::parsing::{digits, lit};
     use mac::parsing::{mac, token_trees};
@@ -729,7 +729,7 @@
     ));
 
     named!(field_value -> FieldValue, do_parse!(
-        name: ident >>
+        name: wordlike >>
         punct!(":") >>
         value: expr >>
         (FieldValue {
@@ -984,7 +984,7 @@
 
     named!(field_pat -> FieldPat, alt!(
         do_parse!(
-            ident: ident >>
+            ident: wordlike >>
             punct!(":") >>
             pat: pat >>
             (FieldPat {
diff --git a/src/ident.rs b/src/ident.rs
index e61a11c..dec783a 100644
--- a/src/ident.rs
+++ b/src/ident.rs
@@ -90,6 +90,22 @@
 
         IResult::Done("", input.into())
     }
+
+    pub fn wordlike(mut input: &str) -> IResult<&str, Ident> {
+        input = skip_whitespace(input);
+
+        for (i, ch) in input.char_indices() {
+            if !UnicodeXID::is_xid_start(ch) && !UnicodeXID::is_xid_continue(ch) {
+                return if i == 0 {
+                    IResult::Error
+                } else {
+                    IResult::Done(&input[i..], input[..i].into())
+                };
+            }
+        }
+
+        IResult::Done("", input.into())
+    }
 }
 
 #[cfg(feature = "printing")]