Create 'delimited!' macro for tests
diff --git a/tests/common/mod.rs b/tests/common/mod.rs
index 4665ef7..723fab4 100644
--- a/tests/common/mod.rs
+++ b/tests/common/mod.rs
@@ -9,16 +9,6 @@
 
 use self::walkdir::DirEntry;
 
-macro_rules! errorf {
-    ($($tt:tt)*) => {
-        {
-            use ::std::io::Write;
-            let stderr = ::std::io::stderr();
-            write!(stderr.lock(), $($tt)*).unwrap();
-        }
-    };
-}
-
 pub mod parse;
 pub mod respan;
 
diff --git a/tests/macros/mod.rs b/tests/macros/mod.rs
new file mode 100644
index 0000000..86d40ca
--- /dev/null
+++ b/tests/macros/mod.rs
@@ -0,0 +1,27 @@
+#[macro_export]
+macro_rules! errorf {
+    ($($tt:tt)*) => {{
+        use ::std::io::Write;
+        let stderr = ::std::io::stderr();
+        write!(stderr.lock(), $($tt)*).unwrap();
+    }};
+}
+
+#[macro_export]
+macro_rules! delimited {
+    ($first:expr, $($rest:expr,)*) => {{
+        let mut d = ::syn::delimited::Delimited::new();
+        let mut last = $first;
+        $(
+            d.push(::std::mem::replace(&mut last, $rest));
+            d.push_trailing(::std::default::Default::default());
+        )*
+        last = last;
+        d.push(last);
+        d
+    }};
+
+    ($($e:expr),+) => {
+        delimited!($($e,)+)
+    };
+}
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index 8884137..4003263 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -9,6 +9,9 @@
 
 use std::iter::FromIterator;
 
+#[macro_use]
+mod macros;
+
 fn op(c: char) -> TokenTree {
     proc_macro2::TokenTree {
         span: Default::default(),
@@ -88,7 +91,7 @@
             semi_token: None,
             struct_token: Default::default(),
             data: VariantData::Struct(
-                vec![
+                delimited![
                     Field {
                         ident: Some("ident".into()),
                         colon_token: Some(Default::default()),
@@ -112,28 +115,28 @@
                             qself: None,
                             path: Path {
                                 leading_colon: None,
-                                segments: vec![
-                                PathSegment {
-                                    ident: "Vec".into(),
-                                    arguments: PathArguments::AngleBracketed(
-                                        AngleBracketedGenericArguments {
-                                            colon2_token: None,
-                                            lt_token: Default::default(),
-                                            args: vec![
-                                                GenericArgument::Type(Type::from(TypePath {
-                                                    qself: None,
-                                                    path: "Attribute".into(),
-                                                })),
-                                            ].into(),
-                                            gt_token: Default::default(),
-                                        },
-                                    ),
-                                }
-                            ].into(),
+                                segments: delimited![
+                                    PathSegment {
+                                        ident: "Vec".into(),
+                                        arguments: PathArguments::AngleBracketed(
+                                            AngleBracketedGenericArguments {
+                                                colon2_token: None,
+                                                lt_token: Default::default(),
+                                                args: delimited![
+                                                    GenericArgument::Type(Type::from(TypePath {
+                                                        qself: None,
+                                                        path: "Attribute".into(),
+                                                    })),
+                                                ],
+                                                gt_token: Default::default(),
+                                            },
+                                        ),
+                                    }
+                                ],
                             },
                         }.into(),
                     },
-                ].into(),
+                ],
                 Default::default(),
             ),
         }),
@@ -146,10 +149,10 @@
     let expected_meta_item: MetaItem = MetaItemList {
         ident: "derive".into(),
         paren_token: Default::default(),
-        nested: vec![
+        nested: delimited![
             NestedMetaItem::MetaItem(MetaItem::Term("Debug".into())),
             NestedMetaItem::MetaItem(MetaItem::Term("Clone".into())),
-        ].into(),
+        ],
     }.into();
 
     assert_eq!(expected_meta_item, actual.attrs[0].meta_item().unwrap());
@@ -202,7 +205,7 @@
         ],
         generics: Generics {
             lt_token: Some(Default::default()),
-            params: vec![
+            params: delimited![
                 GenericParam::Type(TypeParam {
                     attrs: Vec::new(),
                     ident: "T".into(),
@@ -219,17 +222,17 @@
                     eq_token: None,
                     default: None,
                 }),
-            ].into(),
+            ],
             gt_token: Some(Default::default()),
             where_clause: None,
         },
         body: Body::Enum(BodyEnum {
-            variants: vec![
+            variants: delimited![
                 Variant {
                     ident: "Ok".into(),
                     attrs: Vec::new(),
                     data: VariantData::Tuple(
-                        vec![
+                        delimited![
                             Field {
                                 colon_token: None,
                                 ident: None,
@@ -240,7 +243,7 @@
                                     path: "T".into(),
                                 }.into(),
                             },
-                        ].into(),
+                        ],
                         Default::default(),
                     ),
                     discriminant: None,
@@ -249,7 +252,7 @@
                     ident: "Err".into(),
                     attrs: Vec::new(),
                     data: VariantData::Tuple(
-                        vec![
+                        delimited![
                             Field {
                                 ident: None,
                                 colon_token: None,
@@ -260,7 +263,7 @@
                                     path: "E".into(),
                                 }.into(),
                             },
-                        ].into(),
+                        ],
                         Default::default(),
                     ),
                     discriminant: None,
@@ -291,7 +294,7 @@
                             base: Box::new(Expr::Tuple(ExprTuple {
                                 attrs: Vec::new(),
                                 paren_token: Default::default(),
-                                elems: vec![
+                                elems: delimited![
                                     Expr::Lit(ExprLit {
                                         attrs: Vec::new(),
                                         lit: Lit {
@@ -306,7 +309,7 @@
                                             span: Default::default(),
                                         },
                                     }),
-                                ].into(),
+                                ],
                             })),
                             dot_token: Default::default(),
                             member: Member::Unnamed(Index {
@@ -316,7 +319,7 @@
                         }),
                     )),
                 },
-            ].into(),
+            ],
             brace_token: Default::default(),
             enum_token: Default::default(),
         }),
@@ -367,10 +370,10 @@
                 style: AttrStyle::Outer,
                 path: Path {
                     leading_colon: Some(Default::default()),
-                    segments: vec![
+                    segments: delimited![
                         PathSegment::from("attr_args"),
                         PathSegment::from("identity"),
-                    ].into(),
+                    ],
                 },
                 tts: TokenStream::from_iter(vec![
                     word("fn"),
@@ -429,7 +432,7 @@
                 style: AttrStyle::Outer,
                 path: Path {
                     leading_colon: None,
-                    segments: vec![PathSegment::from("inert")].into(),
+                    segments: delimited![PathSegment::from("inert")],
                 },
                 tts: TokenStream::from_iter(vec![op('<'), word("T"), op('>')]),
                 is_sugared_doc: false,
@@ -467,7 +470,7 @@
                 style: AttrStyle::Outer,
                 path: Path {
                     leading_colon: None,
-                    segments: vec![PathSegment::from("foo"), PathSegment::from("self")].into(),
+                    segments: delimited![PathSegment::from("foo"), PathSegment::from("self")],
                 },
                 tts: TokenStream::empty(),
                 is_sugared_doc: false,
@@ -507,14 +510,13 @@
         generics: Generics::default(),
         body: Body::Struct(BodyStruct {
             data: VariantData::Tuple(
-                vec![
+                delimited![
                     Field {
                         ident: None,
                         vis: Visibility::Restricted(VisRestricted {
                             path: Box::new(Path {
                                 leading_colon: None,
-                                segments: vec![PathSegment::from("m"), PathSegment::from("n")]
-                                    .into(),
+                                segments: delimited![PathSegment::from("m"), PathSegment::from("n")],
                             }),
                             in_token: Some(Default::default()),
                             paren_token: Default::default(),
@@ -527,7 +529,7 @@
                             path: "u8".into(),
                         }.into(),
                     },
-                ].into(),
+                ],
                 Default::default(),
             ),
             semi_token: Some(Default::default()),
diff --git a/tests/test_generics.rs b/tests/test_generics.rs
index 8cdb4a2..4b55b15 100644
--- a/tests/test_generics.rs
+++ b/tests/test_generics.rs
@@ -10,6 +10,9 @@
 extern crate proc_macro2;
 use proc_macro2::{Span, Term, TokenStream};
 
+#[macro_use]
+mod macros;
+
 mod common;
 
 #[test]
@@ -18,7 +21,7 @@
     let generics = Generics {
         gt_token: Some(Default::default()),
         lt_token: Some(Default::default()),
-        params: vec![
+        params: delimited![
             GenericParam::Lifetime(LifetimeDef {
                 attrs: Default::default(),
                 lifetime: Lifetime::new(Term::intern("'a"), Span::default()),
@@ -28,7 +31,7 @@
             GenericParam::Lifetime(LifetimeDef {
                 attrs: Default::default(),
                 lifetime: Lifetime::new(Term::intern("'b"), Span::default()),
-                bounds: vec![Lifetime::new(Term::intern("'a"), Span::default())].into(),
+                bounds: delimited![Lifetime::new(Term::intern("'a"), Span::default())],
                 colon_token: Some(token::Colon::default()),
             }),
             GenericParam::Type(TypeParam {
@@ -43,9 +46,9 @@
                     },
                 ],
                 ident: "T".into(),
-                bounds: vec![
+                bounds: delimited![
                     TypeParamBound::Region(Lifetime::new(Term::intern("'a"), Span::default())),
-                ].into(),
+                ],
                 default: Some(
                     TypeTuple {
                         elems: Default::default(),
@@ -55,10 +58,10 @@
                 colon_token: Some(Default::default()),
                 eq_token: Default::default(),
             }),
-        ].into(),
+        ],
         where_clause: Some(WhereClause {
             where_token: Default::default(),
-            predicates: vec![
+            predicates: delimited![
                 WherePredicate::BoundPredicate(WhereBoundPredicate {
                     bound_lifetimes: None,
                     colon_token: Default::default(),
@@ -66,7 +69,7 @@
                         qself: None,
                         path: "T".into(),
                     }.into(),
-                    bounds: vec![
+                    bounds: delimited![
                         TypeParamBound::Trait(
                             PolyTraitRef {
                                 bound_lifetimes: None,
@@ -74,9 +77,9 @@
                             },
                             TraitBoundModifier::None,
                         ),
-                    ].into(),
+                    ],
                 }),
-            ].into(),
+            ],
         }),
     };
 
diff --git a/tests/test_grouping.rs b/tests/test_grouping.rs
index b09225e..7d031d2 100644
--- a/tests/test_grouping.rs
+++ b/tests/test_grouping.rs
@@ -9,6 +9,9 @@
 extern crate proc_macro2;
 use proc_macro2::*;
 
+#[macro_use]
+mod macros;
+
 mod common;
 
 fn tt(k: TokenNode) -> TokenTree {
diff --git a/tests/test_meta_item.rs b/tests/test_meta_item.rs
index efb11ae..4784edd 100644
--- a/tests/test_meta_item.rs
+++ b/tests/test_meta_item.rs
@@ -7,6 +7,9 @@
 use syn::synom::SynomBuffer;
 use proc_macro2::{Literal, TokenStream};
 
+#[macro_use]
+mod macros;
+
 fn lit<T: Into<Literal>>(t: T) -> Lit {
     Lit {
         value: LitKind::Other(t.into()),
@@ -38,7 +41,7 @@
         MetaItemList {
             ident: "foo".into(),
             paren_token: Default::default(),
-            nested: vec![NestedMetaItem::Literal(lit(Literal::integer(5)))].into(),
+            nested: delimited![NestedMetaItem::Literal(lit(Literal::integer(5)))],
         },
     )
 }
@@ -50,7 +53,7 @@
         MetaItemList {
             ident: "foo".into(),
             paren_token: Default::default(),
-            nested: vec![NestedMetaItem::MetaItem(MetaItem::Term("bar".into()))].into(),
+            nested: delimited![NestedMetaItem::MetaItem(MetaItem::Term("bar".into()))],
         },
     )
 }
@@ -62,7 +65,7 @@
         MetaItemList {
             ident: "foo".into(),
             paren_token: Default::default(),
-            nested: vec![
+            nested: delimited![
                 NestedMetaItem::MetaItem(
                     MetaNameValue {
                         ident: "bar".into(),
@@ -70,7 +73,7 @@
                         lit: lit(Literal::integer(5)),
                     }.into(),
                 ),
-            ].into(),
+            ],
         },
     )
 }
@@ -82,7 +85,7 @@
         MetaItemList {
             ident: "foo".into(),
             paren_token: Default::default(),
-            nested: vec![
+            nested: delimited![
                 NestedMetaItem::MetaItem(MetaItem::Term("word".into())),
                 NestedMetaItem::MetaItem(
                     MetaNameValue {
@@ -95,7 +98,7 @@
                     MetaItemList {
                         ident: "list".into(),
                         paren_token: Default::default(),
-                        nested: vec![
+                        nested: delimited![
                             NestedMetaItem::MetaItem(
                                 MetaNameValue {
                                     ident: "name2".into(),
@@ -103,11 +106,11 @@
                                     lit: lit(Literal::integer(6)),
                                 }.into(),
                             ),
-                        ].into(),
+                        ],
                     }.into(),
                 ),
                 NestedMetaItem::MetaItem(MetaItem::Term("word2".into())),
-            ].into(),
+            ],
         },
     )
 }
diff --git a/tests/test_precedence.rs b/tests/test_precedence.rs
index fbe27e8..8af0941 100644
--- a/tests/test_precedence.rs
+++ b/tests/test_precedence.rs
@@ -31,8 +31,10 @@
 
 use common::{parse, respan};
 
-#[allow(dead_code)]
 #[macro_use]
+mod macros;
+
+#[allow(dead_code)]
 mod common;
 
 /// Test some pre-set expressions chosen by us.
diff --git a/tests/test_round_trip.rs b/tests/test_round_trip.rs
index c5b82f9..b1a5164 100644
--- a/tests/test_round_trip.rs
+++ b/tests/test_round_trip.rs
@@ -23,8 +23,10 @@
 use std::sync::atomic::{AtomicUsize, Ordering};
 use std::time::Instant;
 
-#[allow(dead_code)]
 #[macro_use]
+mod macros;
+
+#[allow(dead_code)]
 mod common;
 
 #[test]