diff options
| author | bors <bors@rust-lang.org> | 2014-02-23 15:37:05 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-02-23 15:37:05 -0800 |
| commit | 329fcd48e508ebe41e6d2425c0f54b2210af401d (patch) | |
| tree | b5297ad96ec683968e1b5dee486710be4a7c8ab3 /src/test | |
| parent | cbed3321f5bbe4375819dd82193bd4299fabafb9 (diff) | |
| parent | 386db05df8aa8349857ad6f5486db0bdcc79f3cd (diff) | |
| download | rust-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.rs | 19 | ||||
| -rw-r--r-- | src/test/compile-fail/hygienic-label-2.rs | 19 | ||||
| -rw-r--r-- | src/test/compile-fail/hygienic-label-3.rs | 21 | ||||
| -rw-r--r-- | src/test/compile-fail/hygienic-label-4.rs | 19 | ||||
| -rw-r--r-- | src/test/run-pass/hygienic-labels-in-let.rs | 59 | ||||
| -rw-r--r-- | src/test/run-pass/hygienic-labels.rs | 45 |
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"); + } +} |
