Trait macro semicolon fixes
diff --git a/src/item.rs b/src/item.rs
index 3379d95..0066003 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -229,7 +229,7 @@
 #[cfg(feature = "parsing")]
 pub mod parsing {
     use super::*;
-    use {FunctionRetTy, Generics, Ident, Mac, TokenTree, VariantData, Visibility};
+    use {DelimToken, FunctionRetTy, Generics, Ident, Mac, TokenTree, VariantData, Visibility};
     use attr::parsing::outer_attr;
     use data::parsing::{struct_like_body, visibility};
     use expr::parsing::{block, expr, pat};
@@ -577,6 +577,10 @@
         id: ident >>
         punct!("!") >>
         body: delimited >>
+        cond!(match body.delim {
+            DelimToken::Paren | DelimToken::Bracket => true,
+            DelimToken::Brace => false,
+        }, punct!(";")) >>
         (TraitItem {
             ident: id.clone(),
             attrs: attrs,
@@ -798,6 +802,12 @@
                 }
                 TraitItemKind::Macro(ref mac) => {
                     mac.to_tokens(tokens);
+                    match mac.tts.last() {
+                        Some(&TokenTree::Delimited(Delimited { delim: DelimToken::Brace, .. })) => {
+                            // no semicolon
+                        }
+                        _ => tokens.append(";"),
+                    }
                 }
             }
         }
diff --git a/tests/cases/traits.rs b/tests/cases/traits.rs
index 18d34f9..09ee72c 100644
--- a/tests/cases/traits.rs
+++ b/tests/cases/traits.rs
@@ -25,3 +25,10 @@
     type X = ();
     type X: 'a + B = ();
 }
+
+trait T {
+    mac!();
+    mac!{}
+    mac!();
+    mac!{}
+}