diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index fb9eca8640df..b2aa0e7b4dc8 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -948,15 +948,13 @@ fn parse_bottom_expr(&parser p) -> @ast::expr { hi = e.span.hi; ex = ast::expr_check(ast::unchecked, e); } else if (eat_word(p, "ret")) { - alt (p.peek()) { - case (token::SEMI) { ex = ast::expr_ret(none); } - // Handle ret as the block result expression - case (token::RBRACE) { ex = ast::expr_ret(none); } - case (_) { - auto e = parse_expr(p); - hi = e.span.hi; - ex = ast::expr_ret(some(e)); - } + if (can_begin_expr(p.peek())) { + auto e = parse_expr(p); + hi = e.span.hi; + ex = ast::expr_ret(some(e)); + } + else { + ex = ast::expr_ret(none); } } else if (eat_word(p, "break")) { ex = ast::expr_break; diff --git a/src/test/run-pass/if-ret.rs b/src/test/run-pass/if-ret.rs new file mode 100644 index 000000000000..7d0d165d0116 --- /dev/null +++ b/src/test/run-pass/if-ret.rs @@ -0,0 +1,6 @@ +// xfail-stage0 +fn foo() { + if (ret) { } +} + +fn main() { foo(); }