| ... | ... | @@ -29768,9 +29768,20 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void |
| 29768 | 29768 | extra_index += body.len; |
| 29769 | 29769 | const init = try sema.resolveBody(&block_scope, body, struct_obj.zir_index); |
| 29770 | 29770 | const field = &struct_obj.fields.values()[i]; |
| 29771 | | const coerced = try sema.coerce(&block_scope, field.ty, init, src); |
| 29772 | | const default_val = (try sema.resolveMaybeUndefVal(coerced)) orelse |
| 29773 | | return sema.failWithNeededComptime(&block_scope, src, "struct field default value must be comptime-known"); |
| 29771 | const coerced = sema.coerce(&block_scope, field.ty, init, .unneeded) catch |err| switch (err) { |
| 29772 | error.NeededSourceLocation => { |
| 29773 | const tree = try sema.getAstTree(&block_scope); |
| 29774 | const init_src = containerFieldInitSrcLoc(decl, tree.*, 0, i); |
| 29775 | _ = try sema.coerce(&block_scope, field.ty, init, init_src); |
| 29776 | return error.AnalysisFail; |
| 29777 | }, |
| 29778 | else => |e| return e, |
| 29779 | }; |
| 29780 | const default_val = (try sema.resolveMaybeUndefVal(coerced)) orelse { |
| 29781 | const tree = try sema.getAstTree(&block_scope); |
| 29782 | const init_src = containerFieldInitSrcLoc(decl, tree.*, 0, i); |
| 29783 | return sema.failWithNeededComptime(&block_scope, init_src, "struct field default value must be comptime-known"); |
| 29784 | }; |
| 29774 | 29785 | field.default_val = try default_val.copy(decl_arena_allocator); |
| 29775 | 29786 | } |
| 29776 | 29787 | } |
| ... | ... | @@ -30553,11 +30564,49 @@ fn enumFieldSrcLoc( |
| 30553 | 30564 | node_offset: i32, |
| 30554 | 30565 | field_index: usize, |
| 30555 | 30566 | ) LazySrcLoc { |
| 30567 | @setCold(true); |
| 30568 | const field_node = containerFieldNode(decl, tree, node_offset, field_index) orelse |
| 30569 | return LazySrcLoc.nodeOffset(0); |
| 30570 | return decl.nodeSrcLoc(field_node); |
| 30571 | } |
| 30572 | |
| 30573 | fn containerFieldInitSrcLoc( |
| 30574 | decl: *Decl, |
| 30575 | tree: std.zig.Ast, |
| 30576 | node_offset: i32, |
| 30577 | field_index: usize, |
| 30578 | ) LazySrcLoc { |
| 30579 | @setCold(true); |
| 30580 | const node_tags = tree.nodes.items(.tag); |
| 30581 | const field_node = containerFieldNode(decl, tree, node_offset, field_index) orelse |
| 30582 | return LazySrcLoc.nodeOffset(0); |
| 30583 | const node_data = tree.nodes.items(.data)[field_node]; |
| 30584 | |
| 30585 | const init_node = switch (node_tags[field_node]) { |
| 30586 | .container_field_init => node_data.rhs, |
| 30587 | .container_field => blk: { |
| 30588 | const extra_data = tree.extraData(node_data.rhs, std.zig.Ast.Node.ContainerField); |
| 30589 | break :blk extra_data.value_expr; |
| 30590 | }, |
| 30591 | else => unreachable, |
| 30592 | }; |
| 30593 | |
| 30594 | return decl.nodeSrcLoc(init_node); |
| 30595 | } |
| 30596 | |
| 30597 | fn containerFieldNode( |
| 30598 | decl: *Decl, |
| 30599 | tree: std.zig.Ast, |
| 30600 | node_offset: i32, |
| 30601 | field_index: usize, |
| 30602 | ) ?std.zig.Ast.Node.Index { |
| 30556 | 30603 | @setCold(true); |
| 30557 | 30604 | const enum_node = decl.relativeToNodeIndex(node_offset); |
| 30558 | 30605 | const node_tags = tree.nodes.items(.tag); |
| 30559 | 30606 | var buffer: [2]std.zig.Ast.Node.Index = undefined; |
| 30560 | 30607 | const container_decl = switch (node_tags[enum_node]) { |
| 30608 | .root => tree.containerDeclRoot(), |
| 30609 | |
| 30561 | 30610 | .container_decl, |
| 30562 | 30611 | .container_decl_trailing, |
| 30563 | 30612 | => tree.containerDecl(enum_node), |
| ... | ... | @@ -30580,8 +30629,7 @@ fn enumFieldSrcLoc( |
| 30580 | 30629 | .tagged_union_enum_tag_trailing, |
| 30581 | 30630 | => tree.taggedUnionEnumTag(enum_node), |
| 30582 | 30631 | |
| 30583 | | // Container was constructed with `@Type`. |
| 30584 | | else => return LazySrcLoc.nodeOffset(0), |
| 30632 | else => return null, |
| 30585 | 30633 | }; |
| 30586 | 30634 | var it_index: usize = 0; |
| 30587 | 30635 | for (container_decl.ast.members) |member_node| { |
| ... | ... | @@ -30590,9 +30638,7 @@ fn enumFieldSrcLoc( |
| 30590 | 30638 | .container_field_align, |
| 30591 | 30639 | .container_field, |
| 30592 | 30640 | => { |
| 30593 | | if (it_index == field_index) { |
| 30594 | | return LazySrcLoc.nodeOffset(decl.nodeIndexToRelative(member_node)); |
| 30595 | | } |
| 30641 | if (it_index == field_index) return member_node; |
| 30596 | 30642 | it_index += 1; |
| 30597 | 30643 | }, |
| 30598 | 30644 | |