diff --git a/src/ir.cpp b/src/ir.cpp index ef3426d111f8e111b4878706dd8b631a7bed1cb3..0687d18ef2f12f7c47ed3b99e05836b949c14ad1 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -11864,7 +11864,7 @@ static ConstCastOnly types_match_const_cast_only(IrAnalyze *ira, ZigType *wanted } assert(wanted_type->data.fn.is_generic || wanted_type->data.fn.fn_type_id.next_param_index == wanted_type->data.fn.fn_type_id.param_count); - for (size_t i = 0; i < wanted_type->data.fn.fn_type_id.next_param_index; i += 1) { + for (size_t i = 0; i < wanted_type->data.fn.fn_type_id.param_count; i += 1) { // note it's reversed for parameters FnTypeParamInfo *actual_param_info = &actual_type->data.fn.fn_type_id.param_info[i]; FnTypeParamInfo *expected_param_info = &wanted_type->data.fn.fn_type_id.param_info[i]; @@ -30285,7 +30285,7 @@ static ZigType *ir_resolve_lazy_fn_type(IrAnalyze *ira, AstNode *source_node, La if (param_is_var_args) { if (fn_type_id.cc == CallingConventionC) { fn_type_id.param_count = fn_type_id.next_param_index; - continue; + break; } else if (fn_type_id.cc == CallingConventionUnspecified) { return get_generic_fn_type(ira->codegen, &fn_type_id); } else { diff --git a/src/parser.cpp b/src/parser.cpp index a4dc324b2fe26da94c7a75933d8207cb5a2a1a68..0da7aac6399bd688aa1d647773d236c72c158be0 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -806,7 +806,7 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc) { if (param_decl->data.param_decl.is_var_args) res->data.fn_proto.is_var_args = true; if (i != params.length - 1 && res->data.fn_proto.is_var_args) - ast_error(pc, first, "Function prototype have varargs as a none last paramter."); + ast_error(pc, first, "Function prototype have varargs as a none last parameter."); } return res; } diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 341062e161f5d26dfbc04c76e3e4bf43caef0c0d..0af07d3ecebfbfa778fb336e1ac03faa177ec5c9 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -3,6 +3,17 @@ const builtin = @import("builtin"); const Target = @import("std").Target; pub fn addCases(cases: *tests.CompileErrorContext) void { + cases.addTest("type mismatch in C prototype with varargs", + \\const fn_ty = ?fn ([*c]u8, ...) callconv(.C) void; + \\extern fn fn_decl(fmt: [*:0]u8, ...) void; + \\ + \\export fn main() void { + \\ const x: fn_ty = fn_decl; + \\} + , &[_][]const u8{ + "tmp.zig:5:22: error: expected type 'fn([*c]u8, ...) callconv(.C) void', found 'fn([*:0]u8, ...) callconv(.C) void'", + }); + cases.addTest("dependency loop in top-level decl with @TypeInfo", \\export const foo = @typeInfo(@This()); , &[_][]const u8{