1
Fork 0

improve error message when two-arg assert_eq! receives a trailing comma

Previously, `assert_eq!(left, right,)` (respectively, `assert_ne!(left,
right,)`; note the trailing comma) would result in a confusing "requires
at least a format string argument" error. In reality, a format string is
optional, but the trailing comma puts us into the "match a token tree of
zero or more tokens" branch of the macro (in order to support the
optional format string), and passing the empty token tree into
`format_args!` results in the confusing error. If instead we match a
token tree of one or more tokens, we get a much more sensible
"unexpected end of macro invocation" error.

While we're here, fix up a stray space before a comma in the match
guards.

Resolves #39369.
This commit is contained in:
Zack M. Davis 2017-02-04 22:47:46 -08:00
parent d7777ae682
commit 65435e14fe
5 changed files with 44 additions and 6 deletions

View file

@ -103,7 +103,7 @@ macro_rules! assert {
#[macro_export] #[macro_export]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
macro_rules! assert_eq { macro_rules! assert_eq {
($left:expr , $right:expr) => ({ ($left:expr, $right:expr) => ({
match (&$left, &$right) { match (&$left, &$right) {
(left_val, right_val) => { (left_val, right_val) => {
if !(*left_val == *right_val) { if !(*left_val == *right_val) {
@ -113,13 +113,13 @@ macro_rules! assert_eq {
} }
} }
}); });
($left:expr , $right:expr, $($arg:tt)*) => ({ ($left:expr, $right:expr, $($arg:tt)+) => ({
match (&($left), &($right)) { match (&($left), &($right)) {
(left_val, right_val) => { (left_val, right_val) => {
if !(*left_val == *right_val) { if !(*left_val == *right_val) {
panic!("assertion failed: `(left == right)` \ panic!("assertion failed: `(left == right)` \
(left: `{:?}`, right: `{:?}`): {}", left_val, right_val, (left: `{:?}`, right: `{:?}`): {}", left_val, right_val,
format_args!($($arg)*)) format_args!($($arg)+))
} }
} }
} }
@ -146,7 +146,7 @@ macro_rules! assert_eq {
#[macro_export] #[macro_export]
#[stable(feature = "assert_ne", since = "1.12.0")] #[stable(feature = "assert_ne", since = "1.12.0")]
macro_rules! assert_ne { macro_rules! assert_ne {
($left:expr , $right:expr) => ({ ($left:expr, $right:expr) => ({
match (&$left, &$right) { match (&$left, &$right) {
(left_val, right_val) => { (left_val, right_val) => {
if *left_val == *right_val { if *left_val == *right_val {
@ -156,13 +156,13 @@ macro_rules! assert_ne {
} }
} }
}); });
($left:expr , $right:expr, $($arg:tt)*) => ({ ($left:expr, $right:expr, $($arg:tt)+) => ({
match (&($left), &($right)) { match (&($left), &($right)) {
(left_val, right_val) => { (left_val, right_val) => {
if *left_val == *right_val { if *left_val == *right_val {
panic!("assertion failed: `(left != right)` \ panic!("assertion failed: `(left != right)` \
(left: `{:?}`, right: `{:?}`): {}", left_val, right_val, (left: `{:?}`, right: `{:?}`): {}", left_val, right_val,
format_args!($($arg)*)) format_args!($($arg)+))
} }
} }
} }

View file

@ -0,0 +1,13 @@
// Copyright 2017 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn main() {
assert_eq!(1, 1,);
}

View file

@ -0,0 +1,6 @@
error: unexpected end of macro invocation
--> $DIR/assert_eq_trailing_comma.rs:12:20
|
12 | assert_eq!(1, 1,);
| ^

View file

@ -0,0 +1,13 @@
// Copyright 2017 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn main() {
assert_ne!(1, 2,);
}

View file

@ -0,0 +1,6 @@
error: unexpected end of macro invocation
--> $DIR/assert_ne_trailing_comma.rs:12:20
|
12 | assert_ne!(1, 2,);
| ^