| ... | @@ -15872,50 +15872,40 @@ fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u6 | ... | @@ -15872,50 +15872,40 @@ fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u6 |
| 15872 | const target = sema.mod.getTarget(); | 15872 | const target = sema.mod.getTarget(); |
| 15873 | | 15873 | |
| 15874 | try sema.resolveTypeLayout(block, lhs_src, ty); | 15874 | try sema.resolveTypeLayout(block, lhs_src, ty); |
| 15875 | if (ty.tag() != .@"struct") { | 15875 | switch (ty.tag()) { |
| 15876 | const msg = msg: { | 15876 | .@"struct", .tuple, .anon_struct => {}, |
| 15877 | const msg = try sema.errMsg(block, lhs_src, "expected struct type, found '{}'", .{ty.fmt(sema.mod)}); | 15877 | else => { |
| 15878 | errdefer msg.destroy(sema.gpa); | 15878 | const msg = msg: { |
| 15879 | try sema.addDeclaredHereNote(msg, ty); | 15879 | const msg = try sema.errMsg(block, lhs_src, "expected struct type, found '{}'", .{ty.fmt(sema.mod)}); |
| 15880 | break :msg msg; | 15880 | errdefer msg.destroy(sema.gpa); |
| 15881 | }; | 15881 | try sema.addDeclaredHereNote(msg, ty); |
| 15882 | return sema.failWithOwnedErrorMsg(block, msg); | 15882 | break :msg msg; |
| | 15883 | }; |
| | 15884 | return sema.failWithOwnedErrorMsg(block, msg); |
| | 15885 | }, |
| 15883 | } | 15886 | } |
| 15884 | | 15887 | |
| 15885 | const fields = ty.structFields(); | 15888 | const field_index = if (ty.isTuple()) b: { |
| 15886 | const index = fields.getIndex(field_name) orelse { | 15889 | if (std.fmt.parseUnsigned(u32, field_name, 10)) |idx| { |
| 15887 | const msg = msg: { | 15890 | if (idx < ty.structFieldCount()) break :b idx; |
| 15888 | const msg = try sema.errMsg( | 15891 | } else |_| {} |
| 15889 | block, | 15892 | return sema.fail(block, rhs_src, "tuple '{}' has no such field '{s}'", .{ |
| 15890 | rhs_src, | 15893 | ty.fmt(sema.mod), field_name, |
| 15891 | "struct '{}' has no field '{s}'", | 15894 | }); |
| 15892 | .{ ty.fmt(sema.mod), field_name }, | 15895 | } else try sema.structFieldIndex(block, ty, field_name, rhs_src); |
| 15893 | ); | | |
| 15894 | errdefer msg.destroy(sema.gpa); | | |
| 15895 | try sema.addDeclaredHereNote(msg, ty); | | |
| 15896 | break :msg msg; | | |
| 15897 | }; | | |
| 15898 | return sema.failWithOwnedErrorMsg(block, msg); | | |
| 15899 | }; | | |
| 15900 | | 15896 | |
| 15901 | switch (ty.containerLayout()) { | 15897 | switch (ty.containerLayout()) { |
| 15902 | .Packed => { | 15898 | .Packed => { |
| 15903 | var bit_sum: u64 = 0; | 15899 | var bit_sum: u64 = 0; |
| | 15900 | const fields = ty.structFields(); |
| 15904 | for (fields.values()) |field, i| { | 15901 | for (fields.values()) |field, i| { |
| 15905 | if (i == index) { | 15902 | if (i == field_index) { |
| 15906 | return bit_sum; | 15903 | return bit_sum; |
| 15907 | } | 15904 | } |
| 15908 | bit_sum += field.ty.bitSize(target); | 15905 | bit_sum += field.ty.bitSize(target); |
| 15909 | } else unreachable; | 15906 | } else unreachable; |
| 15910 | }, | 15907 | }, |
| 15911 | else => { | 15908 | else => return ty.structFieldOffset(field_index, target) * 8, |
| 15912 | var it = ty.iterateStructOffsets(target); | | |
| 15913 | while (it.next()) |field_offset| { | | |
| 15914 | if (field_offset.field == index) { | | |
| 15915 | return field_offset.offset * 8; | | |
| 15916 | } | | |
| 15917 | } else unreachable; | | |
| 15918 | }, | | |
| 15919 | } | 15909 | } |
| 15920 | } | 15910 | } |
| 15921 | | 15911 | |