diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index fc341e3bd8559..7047a7e61679e 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -19,7 +19,7 @@ use ext::tt::macro_parser::{parse, parse_or_else}; use parse::lexer::{new_tt_reader, new_tt_reader_with_doc_flag}; use parse::parser::Parser; use parse::attr::ParserAttr; -use parse::token::{special_idents, gensym_ident, NtTT, Token}; +use parse::token::{special_idents, gensym_ident, NtTT, Token, BinOpToken}; use parse::token::Token::*; use parse::token; use print; @@ -433,7 +433,7 @@ fn is_in_follow(cx: &ExtCtxt, tok: &Token, frag: &str) -> bool { }, "pat" => { match *tok { - FatArrow | Comma | Eq => true, + FatArrow | Comma | Eq | BinOp(BinOpToken::Or) => true, _ => false } }, diff --git a/src/test/compile-fail/macro-input-future-proofing.rs b/src/test/compile-fail/macro-input-future-proofing.rs index 15f6d88fd8998..2f3693fcb474b 100644 --- a/src/test/compile-fail/macro-input-future-proofing.rs +++ b/src/test/compile-fail/macro-input-future-proofing.rs @@ -18,7 +18,6 @@ macro_rules! errors_everywhere { ($bl:block < ) => (); ($pa:pat >) => (); //~ ERROR `$pa:pat` is followed by `>`, which is not allowed for `pat` ($pa:pat , ) => (); - ($pa:pat | ) => (); //~ ERROR `$pa:pat` is followed by `|` ($pa:pat $pb:pat $ty:ty ,) => (); //~^ ERROR `$pa:pat` is followed by `$pb:pat`, which is not allowed //~^^ ERROR `$pb:pat` is followed by `$ty:ty`, which is not allowed diff --git a/src/test/run-pass/matches-macro.rs b/src/test/run-pass/matches-macro.rs new file mode 100644 index 0000000000000..f8aa49b4db1c5 --- /dev/null +++ b/src/test/run-pass/matches-macro.rs @@ -0,0 +1,34 @@ +// 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. + + +//! https://github.com/rust-lang/rust/pull/20824 + +// ignore-pretty + +macro_rules! matches { + ($expression: expr, $($pattern:pat)|+) => { + matches!($expression, $($pattern)|+ if true) + }; + ($expression: expr, $($pattern:pat)|+ if $guard: expr) => { + match $expression { + $($pattern)|+ => $guard, + _ => false + } + }; +} + +pub fn main() { + let foo = Some("-12"); + assert!(matches!(foo, Some(bar) if + matches!(bar.char_at(0), '+' | '-') && + matches!(bar.char_at(1), '0'...'9') + )); +}