aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-02-26 15:19:13 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-02-26 16:50:35 -0700
commit822d29286bd39b7331970e1e641ad240e7b62aee (patch)
tree2dd08b9a7d8406e79af61d074d7172196ea0ec7a /src
parente81b21a0ea955422835fb42a14bfa2db6bd74146 (diff)
downloadzig-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.zig19
-rw-r--r--src/Zir.zig2
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,
};