diff options
| author | Krzysztof Wolicki <der.teufel.mail@gmail.com> | 2023-11-16 08:19:54 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-16 10:19:54 +0200 |
| commit | acf9de376d176d35dcfd245d14939766aeba4638 (patch) | |
| tree | d2aed2f72db0586b2ff1500c58f432b79af7e7a1 /src/Sema.zig | |
| parent | 359842f8d5a0ee2641c07c1e659d06553d6269fc (diff) | |
| download | zig-acf9de376d176d35dcfd245d14939766aeba4638.tar.gz zig-acf9de376d176d35dcfd245d14939766aeba4638.zip | |
Sema: Add error for non-power of 2 field alignment when reifying Unions, Structs, Pointers
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index fd90c80910..2615a5b27d 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -20431,9 +20431,11 @@ fn zirReify( return sema.fail(block, src, "alignment must fit in 'u32'", .{}); } - const abi_align = Alignment.fromByteUnits( - (try alignment_val.getUnsignedIntAdvanced(mod, sema)).?, - ); + const alignment_val_int = (try alignment_val.getUnsignedIntAdvanced(mod, sema)).?; + if (alignment_val_int > 0 and !math.isPowerOfTwo(alignment_val_int)) { + return sema.fail(block, src, "alignment value '{d}' is not a power of two or zero", .{alignment_val_int}); + } + const abi_align = Alignment.fromByteUnits(alignment_val_int); const elem_ty = child_val.toType(); if (abi_align != .none) { @@ -20895,7 +20897,14 @@ fn zirReify( } const field_ty = type_val.toType(); - const field_align = Alignment.fromByteUnits((try alignment_val.getUnsignedIntAdvanced(mod, sema)).?); + const alignment_val_int = (try alignment_val.getUnsignedIntAdvanced(mod, sema)).?; + if (alignment_val_int > 0 and !math.isPowerOfTwo(alignment_val_int)) { + // TODO: better source location + return sema.fail(block, src, "alignment value '{d}' is not a power of two or zero", .{ + alignment_val_int, + }); + } + const field_align = Alignment.fromByteUnits(alignment_val_int); any_aligned_fields = any_aligned_fields or field_align != .none; try union_fields.append(sema.arena, .{ @@ -21214,6 +21223,7 @@ fn reifyStruct( if (abi_align != 0) return sema.fail(block, src, "alignment in a packed struct field must be set to 0", .{}); if (is_comptime_val.toBool()) return sema.fail(block, src, "packed struct fields cannot be marked comptime", .{}); } else { + if (abi_align > 0 and !math.isPowerOfTwo(abi_align)) return sema.fail(block, src, "alignment value '{d}' is not a power of two or zero", .{abi_align}); struct_type.field_aligns.get(ip)[i] = Alignment.fromByteUnits(abi_align); } if (layout == .Extern and is_comptime_val.toBool()) { |
