From 65ea9110bd930dc74b0fc37bf151dbbce80fe4ee Mon Sep 17 00:00:00 2001 From: Keegan McAllister Date: Wed, 25 Feb 2015 17:11:36 -0800 Subject: [PATCH] Always error on invalid macro fragment specifiers Fixes #21370. unused-macro-with-follow-violation.rs was already handled correctly. That test is just for good measure. :) --- src/libsyntax/ext/tt/macro_rules.rs | 8 ++++---- .../unused-macro-with-bad-frag-spec.rs | 17 +++++++++++++++++ .../unused-macro-with-follow-violation.rs | 15 +++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 src/test/compile-fail/unused-macro-with-bad-frag-spec.rs create mode 100644 src/test/compile-fail/unused-macro-with-follow-violation.rs diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index fa6d934a457..67011ad21a6 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -334,6 +334,10 @@ fn check_matcher<'a, I>(cx: &mut ExtCtxt, matcher: I, follow: &Token) let tok = if let TtToken(_, ref tok) = *token { tok } else { unreachable!() }; // If T' is in the set FOLLOW(NT), continue. Else, reject. match (&next_token, is_in_follow(cx, &next_token, frag_spec.as_str())) { + (_, Err(msg)) => { + cx.span_err(sp, &msg); + continue + } (&Eof, _) => return Some((sp, tok.clone())), (_, Ok(true)) => continue, (next, Ok(false)) => { @@ -343,10 +347,6 @@ fn check_matcher<'a, I>(cx: &mut ExtCtxt, matcher: I, follow: &Token) token_to_string(next))); continue }, - (_, Err(msg)) => { - cx.span_err(sp, &msg); - continue - } } }, TtSequence(sp, ref seq) => { diff --git a/src/test/compile-fail/unused-macro-with-bad-frag-spec.rs b/src/test/compile-fail/unused-macro-with-bad-frag-spec.rs new file mode 100644 index 00000000000..b868b79365d --- /dev/null +++ b/src/test/compile-fail/unused-macro-with-bad-frag-spec.rs @@ -0,0 +1,17 @@ +// Copyright 2015 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. + +// Issue #21370 + +macro_rules! test { + ($wrong:t_ty) => () //~ ERROR invalid fragment specifier `t_ty` +} + +fn main() { } diff --git a/src/test/compile-fail/unused-macro-with-follow-violation.rs b/src/test/compile-fail/unused-macro-with-follow-violation.rs new file mode 100644 index 00000000000..e9d09bb6ad9 --- /dev/null +++ b/src/test/compile-fail/unused-macro-with-follow-violation.rs @@ -0,0 +1,15 @@ +// Copyright 2015 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. + +macro_rules! test { + ($e:expr +) => () //~ ERROR not allowed for `expr` fragments +} + +fn main() { }