From acf9de376d176d35dcfd245d14939766aeba4638 Mon Sep 17 00:00:00 2001 From: Krzysztof Wolicki Date: Thu, 16 Nov 2023 08:19:54 +0000 Subject: Sema: Add error for non-power of 2 field alignment when reifying Unions, Structs, Pointers --- src/Sema.zig | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'src/Sema.zig') 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()) { -- cgit v1.2.3