From ddb2466f6a1bb66f22824334022a4cee61c73bdc Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 14 Nov 2014 09:18:10 -0800 Subject: librustc: Always parse `macro!()`/`macro![]` as expressions if not followed by a semicolon. This allows code like `vec![1i, 2, 3].len();` to work. This breaks code that uses macros as statements without putting semicolons after them, such as: fn main() { ... assert!(a == b) assert!(c == d) println(...); } It also breaks code that uses macros as items without semicolons: local_data_key!(foo) fn main() { println("hello world") } Add semicolons to fix this code. Those two examples can be fixed as follows: fn main() { ... assert!(a == b); assert!(c == d); println(...); } local_data_key!(foo); fn main() { println("hello world") } RFC #378. Closes #18635. [breaking-change] --- src/libstd/io/extensions.rs | 4 ++-- src/libstd/io/fs.rs | 8 ++++---- src/libstd/io/net/ip.rs | 4 ++-- src/libstd/io/stdio.rs | 8 +++++--- 4 files changed, 13 insertions(+), 11 deletions(-) (limited to 'src/libstd/io') diff --git a/src/libstd/io/extensions.rs b/src/libstd/io/extensions.rs index 24a000adef2..c1f1a5b7869 100644 --- a/src/libstd/io/extensions.rs +++ b/src/libstd/io/extensions.rs @@ -511,7 +511,7 @@ mod bench { use self::test::Bencher; // why is this a macro? wouldn't an inlined function work just as well? - macro_rules! u64_from_be_bytes_bench_impl( + macro_rules! u64_from_be_bytes_bench_impl { ($b:expr, $size:expr, $stride:expr, $start_index:expr) => ({ use super::u64_from_be_bytes; @@ -526,7 +526,7 @@ mod bench { } }); }) - ) + } #[bench] fn u64_from_be_bytes_4_aligned(b: &mut Bencher) { diff --git a/src/libstd/io/fs.rs b/src/libstd/io/fs.rs index f8df7e9b1f3..fd3bae73cd3 100644 --- a/src/libstd/io/fs.rs +++ b/src/libstd/io/fs.rs @@ -828,20 +828,20 @@ mod test { use ops::Drop; use str::StrPrelude; - macro_rules! check( ($e:expr) => ( + macro_rules! check { ($e:expr) => ( match $e { Ok(t) => t, Err(e) => panic!("{} failed with: {}", stringify!($e), e), } - ) ) + ) } - macro_rules! error( ($e:expr, $s:expr) => ( + macro_rules! error { ($e:expr, $s:expr) => ( match $e { Ok(_) => panic!("Unexpected success. Should've been: {}", $s), Err(ref err) => assert!(err.to_string().contains($s.as_slice()), format!("`{}` did not contain `{}`", err, $s)) } - ) ) + ) } pub struct TempDir(Path); diff --git a/src/libstd/io/net/ip.rs b/src/libstd/io/net/ip.rs index 092410fbc8e..5a3f5bd4668 100644 --- a/src/libstd/io/net/ip.rs +++ b/src/libstd/io/net/ip.rs @@ -478,7 +478,7 @@ fn resolve_socket_addr(s: &str, p: u16) -> IoResult> { } fn parse_and_resolve_socket_addr(s: &str) -> IoResult> { - macro_rules! try_opt( + macro_rules! try_opt { ($e:expr, $msg:expr) => ( match $e { Some(r) => r, @@ -489,7 +489,7 @@ fn parse_and_resolve_socket_addr(s: &str) -> IoResult> { }) } ) - ) + } // split the string by ':' and convert the second part to u16 let mut parts_iter = s.rsplitn(2, ':'); diff --git a/src/libstd/io/stdio.rs b/src/libstd/io/stdio.rs index 844814fbfdd..73be389bb91 100644 --- a/src/libstd/io/stdio.rs +++ b/src/libstd/io/stdio.rs @@ -95,9 +95,11 @@ fn src(fd: libc::c_int, _readable: bool, f: F) -> T where } } -thread_local!(static LOCAL_STDOUT: RefCell>> = { - RefCell::new(None) -}) +thread_local! { + static LOCAL_STDOUT: RefCell>> = { + RefCell::new(None) + } +} /// A synchronized wrapper around a buffered reader from stdin #[deriving(Clone)] -- cgit 1.4.1-3-g733a5