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