From 5a8bbf12023db80568cdf6a1d8851a5623a7e42a Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Wed, 13 Apr 2016 00:13:44 +0000 Subject: [PATCH 1/4] Fixes #32922, a macro hygiene bug --- src/libsyntax/ext/expand.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 8550617560df3..cd7b0fcfb0044 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -504,6 +504,13 @@ pub fn expand_item_mac(it: P, /// Expand a stmt fn expand_stmt(stmt: Stmt, fld: &mut MacroExpander) -> SmallVector { + // perform all pending renames + let stmt = { + let pending_renames = &mut fld.cx.syntax_env.info().pending_renames; + let mut rename_fld = IdentRenamer{renames:pending_renames}; + rename_fld.fold_stmt(stmt).expect_one("rename_fold didn't return one value") + }; + let (mac, style, attrs) = match stmt.node { StmtKind::Mac(mac, style, attrs) => (mac, style, attrs), _ => return expand_non_macro_stmt(stmt, fld) @@ -717,14 +724,8 @@ pub fn expand_block(blk: P, fld: &mut MacroExpander) -> P { pub fn expand_block_elts(b: P, fld: &mut MacroExpander) -> P { b.map(|Block {id, stmts, expr, rules, span}| { let new_stmts = stmts.into_iter().flat_map(|x| { - // perform all pending renames - let renamed_stmt = { - let pending_renames = &mut fld.cx.syntax_env.info().pending_renames; - let mut rename_fld = IdentRenamer{renames:pending_renames}; - rename_fld.fold_stmt(x).expect_one("rename_fold didn't return one value") - }; - // expand macros in the statement - fld.fold_stmt(renamed_stmt).into_iter() + // perform pending renames and expand macros in the statement + fld.fold_stmt(x).into_iter() }).collect(); let new_expr = expr.map(|x| { let expr = { From f08f75f25c2177748a1ebd6f22f14874c47939e2 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Wed, 13 Apr 2016 00:15:37 +0000 Subject: [PATCH 2/4] Add regression test --- src/test/compile-fail/issue-32922.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/compile-fail/issue-32922.rs diff --git a/src/test/compile-fail/issue-32922.rs b/src/test/compile-fail/issue-32922.rs new file mode 100644 index 0000000000000..fdf5cbfd3c400 --- /dev/null +++ b/src/test/compile-fail/issue-32922.rs @@ -0,0 +1,20 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(rustc_attrs)] + +macro_rules! foo { () => { + let x = 1; + macro_rules! bar { () => {x} } + let _ = bar!(); +}} + +#[rustc_error] +fn main() { foo! {}; } //~ ERROR compilation successful From 974f1eff58d01ce0bb5583adf0066a84d8eed812 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Thu, 14 Apr 2016 01:20:22 +0000 Subject: [PATCH 3/4] Add test for issue #31856 --- src/test/compile-fail/issue-32922.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/test/compile-fail/issue-32922.rs b/src/test/compile-fail/issue-32922.rs index fdf5cbfd3c400..4206b16a41952 100644 --- a/src/test/compile-fail/issue-32922.rs +++ b/src/test/compile-fail/issue-32922.rs @@ -9,6 +9,7 @@ // except according to those terms. #![feature(rustc_attrs)] +#![allow(warnings)] macro_rules! foo { () => { let x = 1; @@ -16,5 +17,15 @@ macro_rules! foo { () => { let _ = bar!(); }} +macro_rules! bar { // test issue #31856 + ($n:ident) => ( + let a = 1; + let $n = a; + ) +} + #[rustc_error] -fn main() { foo! {}; } //~ ERROR compilation successful +fn main() { //~ ERROR compilation successful + foo! {}; + bar! {}; +} From ca1d29c4debb5a58d9c2a9322eea740ca558ade5 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Fri, 15 Apr 2016 02:22:34 +0000 Subject: [PATCH 4/4] Add another test for issue #31856 --- src/test/compile-fail/issue-32922.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/compile-fail/issue-32922.rs b/src/test/compile-fail/issue-32922.rs index 4206b16a41952..491c087c101de 100644 --- a/src/test/compile-fail/issue-32922.rs +++ b/src/test/compile-fail/issue-32922.rs @@ -24,8 +24,18 @@ macro_rules! bar { // test issue #31856 ) } +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); }