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/Sema.zig | |
| 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/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 19 |
1 files changed, 14 insertions, 5 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, |
