about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-12-30 23:20:12 +0000
committerbors <bors@rust-lang.org>2015-12-30 23:20:12 +0000
commit2370d461a648035b54aae492e7df66256f0f18c6 (patch)
tree0576b4d3f134c7eb91e0398795a78811ba5fa52d
parent0bd29f8461f75c33be95b706e081cd689bbd32d3 (diff)
parentcedd794d72ee1a9dbf7e55cf66f4a52393066e85 (diff)
downloadrust-2370d461a648035b54aae492e7df66256f0f18c6.tar.gz
rust-2370d461a648035b54aae492e7df66256f0f18c6.zip
Auto merge of #30375 - aaronkeen:issue_28777, r=eddyb
RESTRICTION_STMT_EXPR restriction to allow subsequent expressions to
contain braces.

https://github.com/rust-lang/rust/issues/28777
-rw-r--r--src/libsyntax/parse/parser.rs21
-rw-r--r--src/test/run-pass/assoc-oddities-3.rs (renamed from src/test/parse-fail/assoc-oddities-3.rs)13
-rw-r--r--src/test/run-pass/issue-28777.rs30
3 files changed, 54 insertions, 10 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 92ece0a2684..a65a6b4a9da 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2809,16 +2809,25 @@ impl<'a> Parser<'a> {
             }
 
             let rhs = try!(match op.fixity() {
-                Fixity::Right => self.with_res(restrictions, |this|{
-                    this.parse_assoc_expr_with(op.precedence(), LhsExpr::NotYetParsed)
+                Fixity::Right => self.with_res(
+                    restrictions - Restrictions::RESTRICTION_STMT_EXPR,
+                    |this| {
+                        this.parse_assoc_expr_with(op.precedence(),
+                            LhsExpr::NotYetParsed)
                 }),
-                Fixity::Left => self.with_res(restrictions, |this|{
-                    this.parse_assoc_expr_with(op.precedence() + 1, LhsExpr::NotYetParsed)
+                Fixity::Left => self.with_res(
+                    restrictions - Restrictions::RESTRICTION_STMT_EXPR,
+                    |this| {
+                        this.parse_assoc_expr_with(op.precedence() + 1,
+                            LhsExpr::NotYetParsed)
                 }),
                 // We currently have no non-associative operators that are not handled above by
                 // the special cases. The code is here only for future convenience.
-                Fixity::None => self.with_res(restrictions, |this|{
-                    this.parse_assoc_expr_with(op.precedence() + 1, LhsExpr::NotYetParsed)
+                Fixity::None => self.with_res(
+                    restrictions - Restrictions::RESTRICTION_STMT_EXPR,
+                    |this| {
+                        this.parse_assoc_expr_with(op.precedence() + 1,
+                            LhsExpr::NotYetParsed)
                 }),
             });
 
diff --git a/src/test/parse-fail/assoc-oddities-3.rs b/src/test/run-pass/assoc-oddities-3.rs
index 0d4f21f0dca..4913816ffe6 100644
--- a/src/test/parse-fail/assoc-oddities-3.rs
+++ b/src/test/run-pass/assoc-oddities-3.rs
@@ -8,9 +8,14 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-// compile-flags: -Z parse-only
+fn that_odd_parse(c: bool, n: usize) -> u32 {
+    let x = 2;
+    let a = [1, 2, 3, 4];
+    let b = [5, 6, 7, 7];
+    x + if c { a } else { b }[n]
+}
 
-fn that_odd_parse() {
-    // see assoc-oddities-1 for explanation
-    x + if c { a } else { b }[n]; //~ ERROR expected one of
+fn main() {
+    assert_eq!(4, that_odd_parse(true, 1));
+    assert_eq!(8, that_odd_parse(false, 1));
 }
diff --git a/src/test/run-pass/issue-28777.rs b/src/test/run-pass/issue-28777.rs
new file mode 100644
index 00000000000..ea5d4e4f3c2
--- /dev/null
+++ b/src/test/run-pass/issue-28777.rs
@@ -0,0 +1,30 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn main() {
+    let v1 = { 1 + {2} * {3} };
+    let v2 =   1 + {2} * {3}  ;
+
+    assert_eq!(7, v1);
+    assert_eq!(7, v2);
+
+    let v3;
+    v3 = { 1 + {2} * {3} };
+    let v4;
+    v4 = 1 + {2} * {3};
+    assert_eq!(7, v3);
+    assert_eq!(7, v4);
+
+    let v5 = { 1 + {2} * 3 };
+    assert_eq!(7, v5);
+
+    let v9 = { 1 + if 1 > 2 {1} else {2} * {3} };
+    assert_eq!(7, v9);
+}