diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index fb9eca8640df9ed1fb09add4e38163c54b69ad71..b2aa0e7b4dc89a66f78a01cea870071a74d7414d 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -948,15 +948,13 @@ fn parse_expr_opt(&parser p) -> option::t[@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 0000000000000000000000000000000000000000..7d0d165d0116dd3affb0b4bf7a724231bb598e73 --- /dev/null +++ b/src/test/run-pass/if-ret.rs @@ -0,0 +1,6 @@ +// xfail-stage0 +fn foo() { + if (ret) { } +} + +fn main() { foo(); }