diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-02-26 15:19:13 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-02-26 16:50:35 -0700 |
| commit | 822d29286bd39b7331970e1e641ad240e7b62aee (patch) | |
| tree | 2dd08b9a7d8406e79af61d074d7172196ea0ec7a /src | |
| parent | e81b21a0ea955422835fb42a14bfa2db6bd74146 (diff) | |
| download | zig-822d29286bd39b7331970e1e641ad240e7b62aee.tar.gz zig-822d29286bd39b7331970e1e641ad240e7b62aee.zip | |
Sema: make `align(a) T` same as `align(a:0:N) T`
where `@sizeOf(T) == N`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Sema.zig | 19 | ||||
| -rw-r--r-- | src/Zir.zig | 2 |
2 files changed, 15 insertions, 6 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 7326fd9bc6..9789ca8416 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -11098,24 +11098,33 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air break :blk try sema.resolveAlreadyCoercedInt(block, .unneeded, ref, u16); } else 0; - const bit_end = if (inst_data.flags.has_bit_range) blk: { + var host_size: u16 = if (inst_data.flags.has_bit_range) blk: { const ref = @intToEnum(Zir.Inst.Ref, sema.code.extra[extra_i]); extra_i += 1; break :blk try sema.resolveAlreadyCoercedInt(block, .unneeded, ref, u16); } else 0; - if (bit_end != 0 and bit_start >= bit_end * 8) - return sema.fail(block, src, "bit offset starts after end of host integer", .{}); - const elem_type = try sema.resolveType(block, .unneeded, extra.data.elem_type); + if (host_size != 0) { + if (bit_start >= host_size * 8) { + return sema.fail(block, src, "bit offset starts after end of host integer", .{}); + } + const target = sema.mod.getTarget(); + const elem_type_bits = elem_type.bitSize(target); + if (host_size * 8 == elem_type_bits) { + assert(bit_start == 0); + host_size = 0; + } + } + const ty = try Type.ptr(sema.arena, .{ .pointee_type = elem_type, .sentinel = sentinel, .@"align" = abi_align, .@"addrspace" = address_space, .bit_offset = bit_start, - .host_size = bit_end, + .host_size = host_size, .mutable = inst_data.flags.is_mutable, .@"allowzero" = inst_data.flags.is_allowzero or inst_data.size == .C, .@"volatile" = inst_data.flags.is_volatile, diff --git a/src/Zir.zig b/src/Zir.zig index 3795c28daf..86fe44773e 100644 --- a/src/Zir.zig +++ b/src/Zir.zig @@ -2423,7 +2423,7 @@ pub const Inst = struct { /// 1. align: Ref // if `has_align` flag is set /// 2. address_space: Ref // if `has_addrspace` flag is set /// 3. bit_start: Ref // if `has_bit_range` flag is set - /// 4. bit_end: Ref // if `has_bit_range` flag is set + /// 4. host_size: Ref // if `has_bit_range` flag is set pub const PtrType = struct { elem_type: Ref, }; |
