Skip to content

Commit

Permalink
Auto merge of #51480 - dtolnay:lifetime, r=kennytm
Browse files Browse the repository at this point in the history
Enable fall through past $:lifetime matcher

```rust
macro_rules! is_lifetime {
    ($lifetime:lifetime) => { true };
    ($other:tt) => { false };
}

fn main() {
    println!("{}", is_lifetime!('lifetime));
    println!("{}", is_lifetime!(@));
}
```

Before this fix, the `is_lifetime!` invocation would fail to compile with:

```
error: expected a lifetime, found `@`
 --> src/main.rs:8:33
  |
8 |     println!("{}", is_lifetime!(@));
  |                                 ^
```

Fixes #50903.
Fixes #51477.

r? @kennytm
  • Loading branch information
bors committed Jun 11, 2018
2 parents 18a00bd + 9870208 commit 13f8d07
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
8 changes: 8 additions & 0 deletions src/libsyntax/ext/tt/macro_parser.rs
Expand Up @@ -827,6 +827,14 @@ fn may_begin_with(name: &str, token: &Token) -> bool {
Token::Interpolated(ref nt) => may_be_ident(&nt.0),
_ => false,
},
"lifetime" => match *token {
Token::Lifetime(_) => true,
Token::Interpolated(ref nt) => match nt.0 {
token::NtLifetime(_) | token::NtTT(_) => true,
_ => false,
},
_ => false,
},
_ => match *token {
token::CloseDelim(_) => false,
_ => true,
Expand Down
2 changes: 1 addition & 1 deletion src/test/compile-fail/macro-non-lifetime.rs
Expand Up @@ -16,5 +16,5 @@ macro_rules! m { ($x:lifetime) => { } }

fn main() {
m!(a);
//~^ ERROR expected a lifetime, found `a`
//~^ ERROR no rules expected the token `a`
}
43 changes: 43 additions & 0 deletions src/test/run-pass/macro-first-set.rs
Expand Up @@ -199,6 +199,40 @@ fn test_24189() {

//}}}

//{{{ issue 50903 ==============================================================

macro_rules! foo_50903 {
($($lif:lifetime ,)* #) => {};
}

foo_50903!('a, 'b, #);
foo_50903!('a, #);
foo_50903!(#);

//}}}

//{{{ issue 51477 ==============================================================

macro_rules! foo_51477 {
($lifetime:lifetime) => {
"last token is lifetime"
};
($other:tt) => {
"last token is other"
};
($first:tt $($rest:tt)*) => {
foo_51477!($($rest)*)
};
}

fn test_51477() {
assert_eq!("last token is lifetime", foo_51477!('a));
assert_eq!("last token is other", foo_51477!(@));
assert_eq!("last token is lifetime", foo_51477!(@ {} 'a));
}

//}}}

//{{{ some more tests ==========================================================

macro_rules! test_block {
Expand Down Expand Up @@ -234,12 +268,21 @@ macro_rules! test_meta_block {

test_meta_block!(windows {});

macro_rules! test_lifetime {
(1. $($l:lifetime)* $($b:block)*) => {};
(2. $($b:block)* $($l:lifetime)*) => {};
}

test_lifetime!(1. 'a 'b {} {});
test_lifetime!(2. {} {} 'a 'b);

//}}}

fn main() {
test_26444();
test_40569();
test_35650();
test_24189();
test_51477();
}

0 comments on commit 13f8d07

Please sign in to comment.