diff --git a/src/libsyntax/ext/format.rs b/src/libsyntax/ext/format.rs index 786fd953f8901..4b245f2c9fd48 100644 --- a/src/libsyntax/ext/format.rs +++ b/src/libsyntax/ext/format.rs @@ -215,12 +215,21 @@ impl<'a, 'b> Context<'a, 'b> { } } + fn describe_num_args(&self) -> String { + match self.args.len() { + 0 => "no arguments given".to_string(), + 1 => "there is 1 argument".to_string(), + x => format!("there are {} arguments", x), + } + } + fn verify_arg_type(&mut self, arg: Position, ty: ArgumentType) { match arg { Exact(arg) => { if self.args.len() <= arg { - let msg = format!("invalid reference to argument `{}` (there \ - are {} arguments)", arg, self.args.len()); + let msg = format!("invalid reference to argument `{}` ({:s})", + arg, self.describe_num_args()); + self.ecx.span_err(self.fmtsp, msg.as_slice()); return; } diff --git a/src/test/compile-fail/ifmt-bad-arg.rs b/src/test/compile-fail/ifmt-bad-arg.rs index 84735ec78ce7e..6829b1e2721a7 100644 --- a/src/test/compile-fail/ifmt-bad-arg.rs +++ b/src/test/compile-fail/ifmt-bad-arg.rs @@ -29,6 +29,21 @@ fn main() { format!("{foo}", foo=1, foo=2); //~ ERROR: duplicate argument format!("", foo=1, 2); //~ ERROR: positional arguments cannot follow + // bad number of arguments, see #15780 + + format!("{0}"); + //~^ ERROR invalid reference to argument `0` (no arguments given) + + format!("{0} {1}", 1); + //~^ ERROR invalid reference to argument `1` (there is 1 argument) + + format!("{0} {1} {2}", 1, 2); + //~^ ERROR invalid reference to argument `2` (there are 2 arguments) + + format!("{0} {1}"); + //~^ ERROR invalid reference to argument `0` (no arguments given) + //~^^ ERROR invalid reference to argument `1` (no arguments given) + // bad syntax of the format string format!("{"); //~ ERROR: expected `}` but string was terminated