From fd40d0cf5b873ebc94b64fb1abcf2e14fd38dcf7 Mon Sep 17 00:00:00 2001 From: Keegan McAllister Date: Mon, 19 May 2014 15:14:23 -0700 Subject: [PATCH] Test pattern macros --- .../compile-fail/macro-incomplete-parse.rs | 8 ++ .../compile-fail/pattern-macro-hygeine.rs | 18 +++++ src/test/run-pass/macro-pat.rs | 75 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 src/test/compile-fail/pattern-macro-hygeine.rs create mode 100644 src/test/run-pass/macro-pat.rs diff --git a/src/test/compile-fail/macro-incomplete-parse.rs b/src/test/compile-fail/macro-incomplete-parse.rs index 43ba2c8a8a5..94386858d29 100644 --- a/src/test/compile-fail/macro-incomplete-parse.rs +++ b/src/test/compile-fail/macro-incomplete-parse.rs @@ -22,8 +22,16 @@ macro_rules! ignored_expr { () => ( 1, 2 ) //~ ERROR macro expansion ignores token `,` } +macro_rules! ignored_pat { + () => ( 1, 2 ) //~ ERROR macro expansion ignores token `,` +} + ignored_item!() fn main() { ignored_expr!() + match 1 { + ignored_pat!() => (), + _ => (), + } } diff --git a/src/test/compile-fail/pattern-macro-hygeine.rs b/src/test/compile-fail/pattern-macro-hygeine.rs new file mode 100644 index 00000000000..0b6a14c0fc9 --- /dev/null +++ b/src/test/compile-fail/pattern-macro-hygeine.rs @@ -0,0 +1,18 @@ +// Copyright 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(macro_rules)] + +macro_rules! foo ( () => ( x ) ) + +fn main() { + let foo!() = 2; + x + 1; //~ ERROR unresolved name `x` +} diff --git a/src/test/run-pass/macro-pat.rs b/src/test/run-pass/macro-pat.rs new file mode 100644 index 00000000000..6dc663c5620 --- /dev/null +++ b/src/test/run-pass/macro-pat.rs @@ -0,0 +1,75 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(macro_rules)] + +macro_rules! mypat( + () => ( + Some('y') + ) +) + +macro_rules! char_x( + () => ( + 'x' + ) +) + +macro_rules! some( + ($x:pat) => ( + Some($x) + ) +) + +macro_rules! indirect( + () => ( + some!(char_x!()) + ) +) + +macro_rules! ident_pat( + ($x:ident) => ( + $x + ) +) + +fn f(c: Option) -> uint { + match c { + Some('x') => 1, + mypat!() => 2, + _ => 3, + } +} + +pub fn main() { + assert_eq!(1, f(Some('x'))); + assert_eq!(2, f(Some('y'))); + assert_eq!(3, f(None)); + + assert_eq!(1, match Some('x') { + Some(char_x!()) => 1, + _ => 2, + }); + + assert_eq!(1, match Some('x') { + some!(char_x!()) => 1, + _ => 2, + }); + + assert_eq!(1, match Some('x') { + indirect!() => 1, + _ => 2, + }); + + assert_eq!(3, { + let ident_pat!(x) = 2; + x+1 + }); +}