about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-02-23 15:37:05 -0800
committerbors <bors@rust-lang.org>2014-02-23 15:37:05 -0800
commit329fcd48e508ebe41e6d2425c0f54b2210af401d (patch)
treeb5297ad96ec683968e1b5dee486710be4a7c8ab3 /src/test
parentcbed3321f5bbe4375819dd82193bd4299fabafb9 (diff)
parent386db05df8aa8349857ad6f5486db0bdcc79f3cd (diff)
downloadrust-329fcd48e508ebe41e6d2425c0f54b2210af401d.tar.gz
rust-329fcd48e508ebe41e6d2425c0f54b2210af401d.zip
auto merge of #12338 : edwardw/rust/hygienic-break-continue, r=cmr
Makes labelled loops hygiene by performing renaming of the labels defined in e.g. `'x: loop { ... }` and then used in break and continue statements within loop body so that they act hygienically when used with macros.
    
Closes #12262.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/compile-fail/hygienic-label-1.rs19
-rw-r--r--src/test/compile-fail/hygienic-label-2.rs19
-rw-r--r--src/test/compile-fail/hygienic-label-3.rs21
-rw-r--r--src/test/compile-fail/hygienic-label-4.rs19
-rw-r--r--src/test/run-pass/hygienic-labels-in-let.rs59
-rw-r--r--src/test/run-pass/hygienic-labels.rs45
6 files changed, 182 insertions, 0 deletions
diff --git a/src/test/compile-fail/hygienic-label-1.rs b/src/test/compile-fail/hygienic-label-1.rs
new file mode 100644
index 00000000000..d2720bc4570
--- /dev/null
+++ b/src/test/compile-fail/hygienic-label-1.rs
@@ -0,0 +1,19 @@
+// Copyright 2012-2014 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.
+
+#[feature(macro_rules)];
+
+macro_rules! foo {
+    () => { break 'x; }
+}
+
+pub fn main() {
+    'x: loop { foo!() } //~ ERROR use of undeclared label `x`
+}
diff --git a/src/test/compile-fail/hygienic-label-2.rs b/src/test/compile-fail/hygienic-label-2.rs
new file mode 100644
index 00000000000..c97317217fc
--- /dev/null
+++ b/src/test/compile-fail/hygienic-label-2.rs
@@ -0,0 +1,19 @@
+// Copyright 2012-2014 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.
+
+#[feature(macro_rules)];
+
+macro_rules! foo {
+    ($e: expr) => { 'x: loop { $e } }
+}
+
+pub fn main() {
+    foo!(break 'x); //~ ERROR use of undeclared label `x`
+}
diff --git a/src/test/compile-fail/hygienic-label-3.rs b/src/test/compile-fail/hygienic-label-3.rs
new file mode 100644
index 00000000000..d5284f5766e
--- /dev/null
+++ b/src/test/compile-fail/hygienic-label-3.rs
@@ -0,0 +1,21 @@
+// Copyright 2012-2014 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.
+
+#[feature(macro_rules)];
+
+macro_rules! foo {
+    () => { break 'x; }
+}
+
+pub fn main() {
+    'x: for _ in range(0,1) {
+        foo!() //~ ERROR use of undeclared label `x`
+    };
+}
diff --git a/src/test/compile-fail/hygienic-label-4.rs b/src/test/compile-fail/hygienic-label-4.rs
new file mode 100644
index 00000000000..79ac46ac59a
--- /dev/null
+++ b/src/test/compile-fail/hygienic-label-4.rs
@@ -0,0 +1,19 @@
+// Copyright 2012-2014 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.
+
+#[feature(macro_rules)];
+
+macro_rules! foo {
+    ($e: expr) => { 'x: for _ in range(0,1) { $e } }
+}
+
+pub fn main() {
+    foo!(break 'x); //~ ERROR use of undeclared label `x`
+}
diff --git a/src/test/run-pass/hygienic-labels-in-let.rs b/src/test/run-pass/hygienic-labels-in-let.rs
new file mode 100644
index 00000000000..125160c3685
--- /dev/null
+++ b/src/test/run-pass/hygienic-labels-in-let.rs
@@ -0,0 +1,59 @@
+// Copyright 2012-2014 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.
+
+#[feature(macro_rules)];
+
+macro_rules! loop_x {
+    ($e: expr) => {
+        // $e shouldn't be able to interact with this 'x
+        'x: loop { $e }
+    }
+}
+
+macro_rules! run_once {
+    ($e: expr) => {
+        // ditto
+        'x: for _ in range(0, 1) { $e }
+    }
+}
+
+pub fn main() {
+    let mut i = 0i;
+
+    let j = {
+        'x: loop {
+            // this 'x should refer to the outer loop, lexically
+            loop_x!(break 'x);
+            i += 1;
+        }
+        i + 1
+    };
+    assert_eq!(j, 1i);
+
+    let k = {
+        'x: for _ in range(0, 1) {
+            // ditto
+            loop_x!(break 'x);
+            i += 1;
+        }
+        i + 1
+    };
+    assert_eq!(k, 1i);
+
+    let n = {
+        'x: for _ in range(0, 1) {
+            // ditto
+            run_once!(continue 'x);
+            i += 1;
+        }
+        i + 1
+    };
+    assert_eq!(n, 1i);
+}
diff --git a/src/test/run-pass/hygienic-labels.rs b/src/test/run-pass/hygienic-labels.rs
new file mode 100644
index 00000000000..7d341a67623
--- /dev/null
+++ b/src/test/run-pass/hygienic-labels.rs
@@ -0,0 +1,45 @@
+// Copyright 2012-2014 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.
+
+#[feature(macro_rules)];
+
+macro_rules! loop_x {
+    ($e: expr) => {
+        // $e shouldn't be able to interact with this 'x
+        'x: loop { $e }
+    }
+}
+
+macro_rules! run_once {
+    ($e: expr) => {
+        // ditto
+        'x: for _ in range(0, 1) { $e }
+    }
+}
+
+pub fn main() {
+    'x: for _ in range(0, 1) {
+        // this 'x should refer to the outer loop, lexically
+        loop_x!(break 'x);
+        fail!("break doesn't act hygienically inside for loop");
+    }
+
+    'x: loop {
+        // ditto
+        loop_x!(break 'x);
+        fail!("break doesn't act hygienically inside infinite loop");
+    }
+
+    'x: for _ in range(0, 1) {
+        // ditto
+        run_once!(continue 'x);
+        fail!("continue doesn't act hygienically inside for loop");
+    }
+}