Parse paren and bracket macros in statement position as expressions
diff --git a/src/expr.rs b/src/expr.rs
index 49d31c2..3074b99 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -293,14 +293,14 @@
 #[cfg(feature = "parsing")]
 pub mod parsing {
     use super::*;
-    use {BinOp, Delimited, DelimToken, FnArg, FnDecl, FunctionRetTy, Ident, Lifetime, TokenTree,
-         Ty};
+    use {BinOp, Delimited, DelimToken, FnArg, FnDecl, FunctionRetTy, Ident, Lifetime, Mac,
+         TokenTree, Ty};
     use attr::parsing::outer_attr;
     use generics::parsing::lifetime;
     use ident::parsing::ident;
     use item::parsing::item;
     use lit::parsing::{digits, lit};
-    use mac::parsing::mac;
+    use mac::parsing::{mac, token_trees};
     use nom::IResult::{self, Error};
     use op::parsing::{assign_op, binop, unop};
     use ty::parsing::{mutability, path, qpath, ty};
@@ -803,21 +803,24 @@
 
     named!(stmt_mac -> Stmt, do_parse!(
         attrs: many0!(outer_attr) >>
-        mac: mac >>
-        semi: option!(punct!(";")) >>
-        ({
-            let style = if semi.is_some() {
-                MacStmtStyle::Semicolon
-            } else if let Some(&TokenTree::Delimited(Delimited { delim, .. })) = mac.tts.last() {
-                match delim {
-                    DelimToken::Paren | DelimToken::Bracket => MacStmtStyle::NoBraces,
-                    DelimToken::Brace => MacStmtStyle::Braces,
-                }
-            } else {
-                MacStmtStyle::NoBraces
-            };
-            Stmt::Mac(Box::new((mac, style, attrs)))
-        })
+        name: ident >>
+        punct!("!") >>
+    // Only parse braces here; paren and bracket will get parsed as
+    // expression statements
+        punct!("{") >>
+        tts: token_trees >>
+        punct!("}") >>
+        (Stmt::Mac(Box::new((
+            Mac {
+                path: name.into(),
+                tts: vec![TokenTree::Delimited(Delimited {
+                    delim: DelimToken::Brace,
+                    tts: tts,
+                })],
+            },
+            MacStmtStyle::Braces,
+            attrs,
+        ))))
     ));
 
     named!(stmt_local -> Stmt, do_parse!(
diff --git a/src/mac.rs b/src/mac.rs
index 7e6e05c..091b226 100644
--- a/src/mac.rs
+++ b/src/mac.rs
@@ -133,19 +133,19 @@
     named!(pub delimited -> Delimited, alt!(
         delimited!(
             punct!("("),
-            many0!(token_tree),
+            token_trees,
             punct!(")")
         ) => { |tts| Delimited { delim: DelimToken::Paren, tts: tts } }
         |
         delimited!(
             punct!("["),
-            many0!(token_tree),
+            token_trees,
             punct!("]")
         ) => { |tts| Delimited { delim: DelimToken::Bracket, tts: tts } }
         |
         delimited!(
             punct!("{"),
-            many0!(token_tree),
+            token_trees,
             punct!("}")
         ) => { |tts| Delimited { delim: DelimToken::Brace, tts: tts } }
     ));
diff --git a/src/nom.rs b/src/nom.rs
index c20fb68..50a3381 100644
--- a/src/nom.rs
+++ b/src/nom.rs
@@ -61,12 +61,13 @@
     };
 }
 
+// This is actually nom's cond_with_error.
 macro_rules! cond {
     ($i:expr, $cond:expr, $submac:ident!( $($args:tt)* )) => {
         if $cond {
             match $submac!($i, $($args)*) {
                 $crate::nom::IResult::Done(i, o) => $crate::nom::IResult::Done(i, ::std::option::Option::Some(o)),
-                $crate::nom::IResult::Error => $crate::nom::IResult::Done($i, ::std::option::Option::None),
+                $crate::nom::IResult::Error => $crate::nom::IResult::Error,
             }
         } else {
             $crate::nom::IResult::Done($i, ::std::option::Option::None)