diff --git a/src/comp/front/extfmt.rs b/src/comp/front/extfmt.rs index 8ef37b8536ca..58949518649c 100644 --- a/src/comp/front/extfmt.rs +++ b/src/comp/front/extfmt.rs @@ -499,6 +499,7 @@ fn pieces_to_expr(parser p, vec[piece] pieces, vec[@ast::expr] args) auto sp = args.(0).span; auto n = 0u; auto tmp_expr = make_new_str(p, sp, ""); + auto nargs = vec::len[@ast::expr](args); for (piece pc in pieces) { alt (pc) { @@ -507,7 +508,7 @@ fn pieces_to_expr(parser p, vec[piece] pieces, vec[@ast::expr] args) tmp_expr = make_add_expr(p, sp, tmp_expr, s_expr); } case (piece_conv(?conv)) { - if (n >= vec::len[@ast::expr](args)) { + if (n >= nargs) { log_err "too many conversions in #fmt string"; fail; } @@ -524,6 +525,13 @@ fn pieces_to_expr(parser p, vec[piece] pieces, vec[@ast::expr] args) } } + auto expected_nargs = n + 1u; // n conversions + the fmt string + if (expected_nargs < nargs) { + log_err #fmt("too many arguments to #fmt. found %u, expected %u", + nargs, expected_nargs); + fail; + } + // TODO: Remove this debug logging // log "dumping expanded ast:"; // log pretty::print_expr(tmp_expr); diff --git a/src/test/compile-fail/extfmt-too-many-args.rs b/src/test/compile-fail/extfmt-too-many-args.rs new file mode 100644 index 000000000000..c95217dcc0f4 --- /dev/null +++ b/src/test/compile-fail/extfmt-too-many-args.rs @@ -0,0 +1,8 @@ +// xfail-stage0 +// error-pattern:too many arguments + +use std; + +fn main() { + auto s = #fmt("%s", "test", "test"); +}