diff options
| author | Corey Richardson <corey@octayn.net> | 2015-01-18 10:19:47 -0500 |
|---|---|---|
| committer | Corey Richardson <corey@octayn.net> | 2015-01-18 10:19:47 -0500 |
| commit | 2d30f2201409ce6b62af09342bb9b1cacb76681b (patch) | |
| tree | 13928a3e397ab845409ceb32c4a48bae334b693d /src/libsyntax | |
| parent | dcaeb6aa23ecba2dc2af870668a9239136d20fa3 (diff) | |
| download | rust-2d30f2201409ce6b62af09342bb9b1cacb76681b.tar.gz rust-2d30f2201409ce6b62af09342bb9b1cacb76681b.zip | |
syntax: allow bare sequences in lhs for follow checking
Closes #21350
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index fc341e3bd85..270df72eb0e 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -281,19 +281,22 @@ pub fn compile<'cx>(cx: &'cx mut ExtCtxt, } fn check_lhs_nt_follows(cx: &mut ExtCtxt, lhs: &NamedMatch, sp: Span) { - // lhs is going to be like MatchedNonterminal(NtTT(TtDelimited(...))), where - // the entire lhs is those tts. - // if ever we get box/deref patterns, this could turn into an `if let - // &MatchedNonterminal(NtTT(box TtDelimited(...))) = lhs` - let matcher = match lhs { + // lhs is going to be like MatchedNonterminal(NtTT(TtDelimited(...))), where the entire lhs is + // those tts. Or, it can be a "bare sequence", not wrapped in parens. + match lhs { &MatchedNonterminal(NtTT(ref inner)) => match &**inner { - &TtDelimited(_, ref tts) => tts.tts.as_slice(), - _ => cx.span_bug(sp, "wrong-structured lhs for follow check") + &TtDelimited(_, ref tts) => { + check_matcher(cx, tts.tts.iter(), &Eof); + }, + tt @ &TtSequence(..) => { + check_matcher(cx, Some(tt).into_iter(), &Eof); + }, + _ => cx.span_bug(sp, "wrong-structured lhs for follow check (didn't find \ + a TtDelimited or TtSequence)") }, - _ => cx.span_bug(sp, "wrong-structured lhs for follow check") + _ => cx.span_bug(sp, "wrong-structured lhs for follow check (didn't find a \ + MatchedNonterminal)") }; - - check_matcher(cx, matcher.iter(), &Eof); // we don't abort on errors on rejection, the driver will do that for us // after parsing/expansion. we can report every error in every macro this way. } |
