diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2016-04-16 01:16:43 +0530 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2016-04-16 01:16:43 +0530 |
| commit | 6a0cfbcac294faab2b8bcd95a04cda042101a2d8 (patch) | |
| tree | 9960209af7689edfe181a46e2958ccc461e06c92 /src/test | |
| parent | ccc7e95a964ece830caf66ad537e89ae6fb397a6 (diff) | |
| parent | ca1d29c4debb5a58d9c2a9322eea740ca558ade5 (diff) | |
| download | rust-6a0cfbcac294faab2b8bcd95a04cda042101a2d8.tar.gz rust-6a0cfbcac294faab2b8bcd95a04cda042101a2d8.zip | |
Rollup merge of #32923 - jseyfried:fix_hygiene, r=nrc
Fix macro hygiene bug
This fixes #32922 (EDIT: and fixes #31856), macro hygiene bugs.
It is a [breaking-change]. For example, the following would break:
```rust
fn main() {
let x = true;
macro_rules! foo { () => {
let x = 0;
macro_rules! bar { () => {x} }
let _: bool = bar!();
//^ `bar!()` used to resolve the first `x` (a bool),
//| but will now resolve to the second x (an i32).
}}
foo! {};
}
```
r? @nrc
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/compile-fail/issue-32922.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/test/compile-fail/issue-32922.rs b/src/test/compile-fail/issue-32922.rs new file mode 100644 index 00000000000..491c087c101 --- /dev/null +++ b/src/test/compile-fail/issue-32922.rs @@ -0,0 +1,41 @@ +// Copyright 2016 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(rustc_attrs)] +#![allow(warnings)] + +macro_rules! foo { () => { + let x = 1; + macro_rules! bar { () => {x} } + let _ = bar!(); +}} + +macro_rules! bar { // test issue #31856 + ($n:ident) => ( + let a = 1; + let $n = a; + ) +} + +macro_rules! baz { + ($i:ident) => { + let mut $i = 2; + $i = $i + 1; + } +} + +#[rustc_error] +fn main() { //~ ERROR compilation successful + foo! {}; + bar! {}; + + let mut a = true; + baz!(a); +} |
