From f983adfc1076adc8509458c4bb64102c797041ff Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 17 Mar 2024 13:21:43 +0200 Subject: [PATCH] Sema: fix printing of inferred error set of generic fn Closes #19332 --- src/Module.zig | 7 +++++-- src/Sema.zig | 3 ++- src/type.zig | 6 +++++- ...array_init_generic_fn_with_inferred_error_set.zig | 12 ++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 test/cases/compile_errors/array_init_generic_fn_with_inferred_error_set.zig diff --git a/src/Module.zig b/src/Module.zig index 8f6def21ae..9b31d424f4 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -1897,8 +1897,11 @@ pub const SrcLoc = struct { const parent_node = src_loc.declRelativeToNodeIndex(node_off); var buf: [2]Ast.Node.Index = undefined; - const full = tree.fullArrayInit(&buf, parent_node).?; - return tree.nodeToSpan(full.ast.type_expr); + const type_expr = if (tree.fullArrayInit(&buf, parent_node)) |array_init| + array_init.ast.type_expr + else + tree.fullStructInit(&buf, parent_node).?.ast.type_expr; + return tree.nodeToSpan(type_expr); }, .node_offset_store_ptr => |node_off| { const tree = try src_loc.file_scope.getTree(gpa); diff --git a/src/Sema.zig b/src/Sema.zig index 54d5e6df7d..8ed70c61d4 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -19753,7 +19753,8 @@ fn zirStructInitEmpty(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node; const src = inst_data.src(); - const obj_ty = try sema.resolveType(block, src, inst_data.operand); + const ty_src: LazySrcLoc = .{ .node_offset_init_ty = inst_data.src_node }; + const obj_ty = try sema.resolveType(block, ty_src, inst_data.operand); const mod = sema.mod; switch (obj_ty.zigTypeTag(mod)) { diff --git a/src/type.zig b/src/type.zig index 664498e353..b0da997de1 100644 --- a/src/type.zig +++ b/src/type.zig @@ -254,7 +254,11 @@ pub const Type = struct { .error_union_type => |error_union_type| { try print(Type.fromInterned(error_union_type.error_set_type), writer, mod); try writer.writeByte('!'); - try print(Type.fromInterned(error_union_type.payload_type), writer, mod); + if (error_union_type.payload_type == .generic_poison_type) { + try writer.writeAll("anytype"); + } else { + try print(Type.fromInterned(error_union_type.payload_type), writer, mod); + } return; }, .inferred_error_set_type => |func_index| { diff --git a/test/cases/compile_errors/array_init_generic_fn_with_inferred_error_set.zig b/test/cases/compile_errors/array_init_generic_fn_with_inferred_error_set.zig new file mode 100644 index 0000000000..08cee687b1 --- /dev/null +++ b/test/cases/compile_errors/array_init_generic_fn_with_inferred_error_set.zig @@ -0,0 +1,12 @@ +pub export fn entry() void { + _ = my_func{u8} catch {}; +} +pub export fn entry1() void { + _ = my_func{} catch {}; +} +fn my_func(comptime T: type) !T {} + +// error +// +// :2:9: error: expected type 'type', found 'fn (comptime type) @typeInfo(@typeInfo(@TypeOf(tmp.my_func)).Fn.return_type.?).ErrorUnion.error_set!anytype' +// :5:9: error: expected type 'type', found 'fn (comptime type) @typeInfo(@typeInfo(@TypeOf(tmp.my_func)).Fn.return_type.?).ErrorUnion.error_set!anytype'