Improve error message when std.fmt.format is missing arguments

Use fmt in fmt so the number in the error message is fmt'd
This commit is contained in:
Jarred Sumner 2021-06-08 20:42:29 -07:00 committed by Veikka Tuominen
parent b2879825d7
commit 540b52931a
3 changed files with 15 additions and 2 deletions

View File

@ -6262,7 +6262,7 @@ pub fn printValue(self: *Writer, value: anytype) !void {
<p>
And now, what happens if we give too many arguments to {#syntax#}printf{#endsyntax#}?
</p>
{#code_begin|test_err|Unused arguments#}
{#code_begin|test_err|Unused argument in "here is a string: '{s}' here is a number: {}#}
const print = @import("std").debug.print;
const a_number: i32 = 1234;

View File

@ -359,7 +359,12 @@ pub fn format(
}
if (comptime arg_state.hasUnusedArgs()) {
@compileError("Unused arguments");
const missing_count = arg_state.args_len - @popCount(ArgSetType, arg_state.used_args);
switch (missing_count) {
0 => unreachable,
1 => @compileError("Unused argument in \"" ++ fmt ++ "\""),
else => @compileError((comptime comptimePrint("{d}", .{missing_count})) ++ " unused arguments in \"" ++ fmt ++ "\""),
}
}
}

View File

@ -2,6 +2,14 @@ const tests = @import("tests.zig");
const std = @import("std");
pub fn addCases(cases: *tests.CompileErrorContext) void {
cases.add("std.fmt error for unused arguments",
\\pub fn main() !void {
\\ @import("std").debug.print("{d} {d} {d} {d} {d}", .{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15});
\\}
, &.{
\\error: 10 unused arguments in "{d} {d} {d} {d} {d}"
});
cases.add("lazy pointer with undefined element type",
\\export fn foo() void {
\\ comptime var T: type = undefined;