Disallow numbers in Ident
diff --git a/src/expr.rs b/src/expr.rs
index e50cf3a..6ce0390 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -1,8 +1,7 @@
 use super::*;
 use delimited::Delimited;
-#[cfg(feature = "full")]
 use proc_macro2::Span;
-#[cfg(feature = "full")]
+#[cfg(feature = "extra-traits")]
 use std::hash::{Hash, Hasher};
 
 ast_enum_of_structs! {
@@ -423,7 +422,6 @@
     }
 }
 
-#[cfg(feature = "full")]
 ast_enum! {
     /// A struct or tuple struct field accessed in a struct literal or field
     /// expression.
@@ -435,7 +433,6 @@
     }
 }
 
-#[cfg(feature = "full")]
 ast_struct! {
     /// The index of an unnamed tuple struct field.
     pub struct Index #manual_extra_traits {
@@ -444,17 +441,27 @@
     }
 }
 
-#[cfg(feature = "full")]
+impl From<usize> for Index {
+    fn from(index: usize) -> Index {
+        assert!(index < std::u32::MAX as usize);
+        Index {
+            index: index as u32,
+            span: Span::default(),
+        }
+    }
+}
+
+#[cfg(feature = "extra-traits")]
 impl Eq for Index {}
 
-#[cfg(feature = "full")]
+#[cfg(feature = "extra-traits")]
 impl PartialEq for Index {
     fn eq(&self, other: &Self) -> bool {
         self.index == other.index
     }
 }
 
-#[cfg(feature = "full")]
+#[cfg(feature = "extra-traits")]
 impl Hash for Index {
     fn hash<H: Hasher>(&self, state: &mut H) {
         self.index.hash(state);
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 90a3393..9f4f9cb 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -209,7 +209,7 @@
 fn fold_impl_item_type(&mut self, i: ImplItemType) -> ImplItemType { fold_impl_item_type(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn fold_impl_polarity(&mut self, i: ImplPolarity) -> ImplPolarity { fold_impl_polarity(self, i) }
-# [ cfg ( feature = "full" ) ]
+
 fn fold_index(&mut self, i: Index) -> Index { fold_index(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn fold_item(&mut self, i: Item) -> Item { fold_item(self, i) }
@@ -255,7 +255,7 @@
 fn fold_local(&mut self, i: Local) -> Local { fold_local(self, i) }
 
 fn fold_macro(&mut self, i: Macro) -> Macro { fold_macro(self, i) }
-# [ cfg ( feature = "full" ) ]
+
 fn fold_member(&mut self, i: Member) -> Member { fold_member(self, i) }
 
 fn fold_meta_item(&mut self, i: MetaItem) -> MetaItem { fold_meta_item(self, i) }
@@ -1660,7 +1660,7 @@
         }
     }
 }
-# [ cfg ( feature = "full" ) ]
+
 pub fn fold_index<V: Folder + ?Sized>(_visitor: &mut V, _i: Index) -> Index {
     Index {
         index: _i . index,
@@ -2003,7 +2003,7 @@
         tokens: _i . tokens,
     }
 }
-# [ cfg ( feature = "full" ) ]
+
 pub fn fold_member<V: Folder + ?Sized>(_visitor: &mut V, _i: Member) -> Member {
     use ::Member::*;
     match _i {
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 1a9609e..3e57446 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -205,7 +205,7 @@
 fn visit_impl_item_type(&mut self, i: &'ast ImplItemType) { visit_impl_item_type(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_impl_polarity(&mut self, i: &'ast ImplPolarity) { visit_impl_polarity(self, i) }
-# [ cfg ( feature = "full" ) ]
+
 fn visit_index(&mut self, i: &'ast Index) { visit_index(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_item(&mut self, i: &'ast Item) { visit_item(self, i) }
@@ -251,7 +251,7 @@
 fn visit_local(&mut self, i: &'ast Local) { visit_local(self, i) }
 
 fn visit_macro(&mut self, i: &'ast Macro) { visit_macro(self, i) }
-# [ cfg ( feature = "full" ) ]
+
 fn visit_member(&mut self, i: &'ast Member) { visit_member(self, i) }
 
 fn visit_meta_item(&mut self, i: &'ast MetaItem) { visit_meta_item(self, i) }
@@ -1320,7 +1320,7 @@
         }
     }
 }
-# [ cfg ( feature = "full" ) ]
+
 pub fn visit_index<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Index) {
     // Skipped field _i . index;
     _visitor.visit_span(& _i . span);
@@ -1587,7 +1587,7 @@
     tokens_helper(_visitor, &(& _i . bang_token).0);
     // Skipped field _i . tokens;
 }
-# [ cfg ( feature = "full" ) ]
+
 pub fn visit_member<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Member) {
     use ::Member::*;
     match *_i {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index a82f430..ec32603 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -205,7 +205,7 @@
 fn visit_impl_item_type_mut(&mut self, i: &mut ImplItemType) { visit_impl_item_type_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_impl_polarity_mut(&mut self, i: &mut ImplPolarity) { visit_impl_polarity_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
+
 fn visit_index_mut(&mut self, i: &mut Index) { visit_index_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_item_mut(&mut self, i: &mut Item) { visit_item_mut(self, i) }
@@ -251,7 +251,7 @@
 fn visit_local_mut(&mut self, i: &mut Local) { visit_local_mut(self, i) }
 
 fn visit_macro_mut(&mut self, i: &mut Macro) { visit_macro_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
+
 fn visit_member_mut(&mut self, i: &mut Member) { visit_member_mut(self, i) }
 
 fn visit_meta_item_mut(&mut self, i: &mut MetaItem) { visit_meta_item_mut(self, i) }
@@ -1320,7 +1320,7 @@
         }
     }
 }
-# [ cfg ( feature = "full" ) ]
+
 pub fn visit_index_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Index) {
     // Skipped field _i . index;
     _visitor.visit_span_mut(& mut _i . span);
@@ -1587,7 +1587,7 @@
     tokens_helper(_visitor, &mut (& mut _i . bang_token).0);
     // Skipped field _i . tokens;
 }
-# [ cfg ( feature = "full" ) ]
+
 pub fn visit_member_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Member) {
     use ::Member::*;
     match *_i {
diff --git a/src/ident.rs b/src/ident.rs
index 3861b41..5d85b48 100644
--- a/src/ident.rs
+++ b/src/ident.rs
@@ -109,6 +109,10 @@
             panic!("`_` is not a valid ident; use syn::token::Underscore");
         }
 
+        if s.bytes().all(|digit| digit >= b'0' && digit <= b'9') {
+            panic!("ident cannot be a number, use syn::Index instead");
+        }
+
         fn xid_ok(s: &str) -> bool {
             let mut chars = s.chars();
             let first = chars.next().unwrap();
@@ -123,11 +127,7 @@
             true
         }
 
-        fn integer_ok(s: &str) -> bool {
-            s.bytes().all(|digit| digit >= b'0' && digit <= b'9')
-        }
-
-        if !(xid_ok(s) || integer_ok(s)) {
+        if !xid_ok(s) {
             panic!("{:?} is not a valid ident", s);
         }
 
diff --git a/src/lib.rs b/src/lib.rs
index 8350b7b..71f47cc 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -38,11 +38,11 @@
                ExprField, ExprForLoop, ExprGroup, ExprIf, ExprIfLet, ExprInPlace, ExprIndex,
                ExprLit, ExprLoop, ExprMacro, ExprMatch, ExprMethodCall, ExprParen, ExprPath, ExprRange,
                ExprRepeat, ExprReturn, ExprStruct, ExprTry, ExprTuple, ExprType,
-               ExprUnary, ExprUnsafe, ExprWhile, ExprWhileLet, ExprYield};
+               ExprUnary, ExprUnsafe, ExprWhile, ExprWhileLet, ExprYield, Index, Member};
 
 #[cfg(feature = "full")]
-pub use expr::{Arm, BindingMode, Block, CaptureBy, FieldPat, FieldValue, GenericMethodArgument, Index, Local,
-               Member, MethodTurbofish, Pat, PatBox, PatIdent, PatLit, PatPath, PatRange, PatRef, PatSlice,
+pub use expr::{Arm, BindingMode, Block, CaptureBy, FieldPat, FieldValue, GenericMethodArgument, Local,
+               MethodTurbofish, Pat, PatBox, PatIdent, PatLit, PatPath, PatRange, PatRef, PatSlice,
                PatStruct, PatTuple, PatTupleStruct, PatWild, RangeLimits, Stmt};
 
 mod generics;