aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorKrzysztof Wolicki <der.teufel.mail@gmail.com>2023-11-16 08:19:54 +0000
committerGitHub <noreply@github.com>2023-11-16 10:19:54 +0200
commitacf9de376d176d35dcfd245d14939766aeba4638 (patch)
treed2aed2f72db0586b2ff1500c58f432b79af7e7a1 /src/Sema.zig
parent359842f8d5a0ee2641c07c1e659d06553d6269fc (diff)
downloadzig-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.zig18
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()) {