about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2011-07-13 15:00:59 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2011-07-13 15:00:59 -0700
commit5e1a6dac4409ba2f584fb41d0759e6c79ec8a8c4 (patch)
tree94f411bec7c364cf41e6361e6e93d0df33dd3b49
parent0c913e63d926fc8cf1dd06260546b16f5aa90402 (diff)
Parse nullary ret correctly
ret is similar to fail: if not followed by an expression, it
should be parsed as a ret without an argument. The old version would
fail if ret was followed by a close paren (for example). Fixed it.

Closes #676.
-rw-r--r--src/comp/syntax/parse/parser.rs16
-rw-r--r--src/test/run-pass/if-ret.rs6
2 files changed, 13 insertions, 9 deletions
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index fb9eca8640d..b2aa0e7b4dc 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 00000000000..7d0d165d011
--- /dev/null
+++ b/src/test/run-pass/if-ret.rs
@@ -0,0 +1,6 @@
+// xfail-stage0
+fn foo() {
+    if (ret) { }
+}
+
+fn main() { foo(); }