authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-04 13:18:13+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-11-23 18:44:07-05:00
logaef5c756027c11885a3ae7f55061cdbd3e3bc0b9
treeb7f207a62ba14f4ce3b193b167a8b6db8dc420de
parent2742ab4b5a6ebb317e19c89f1ebcb8b9a857a3c3

compiler: Disallow align(0) everywhere in the language.

Thus leaving the design space for this alignment value open, e.g. for packing.

3 files changed, 57 insertions(+), 16 deletions(-)

src/Sema.zig+4-15
......@@ -2584,18 +2584,7 @@ fn validateAlign(
25842584 src: LazySrcLoc,
25852585 alignment: u64,
25862586) !Alignment {
2587 const result = try validateAlignAllowZero(sema, block, src, alignment);
2588 if (result == .none) return sema.fail(block, src, "alignment must be >= 1", .{});
2589 return result;
2590}
2591
2592fn validateAlignAllowZero(
2593 sema: *Sema,
2594 block: *Block,
2595 src: LazySrcLoc,
2596 alignment: u64,
2597) !Alignment {
2598 if (alignment == 0) return .none;
2587 if (alignment == 0) return sema.fail(block, src, "alignment must be >= 1", .{});
25992588 if (!std.math.isPowerOfTwo(alignment)) {
26002589 return sema.fail(block, src, "alignment value '{d}' is not a power of two", .{
26012590 alignment,
......@@ -20496,7 +20485,7 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
2049620485 else => {},
2049720486 }
2049820487 const align_bytes = (try val.getUnsignedIntSema(pt)).?;
20499 break :blk try sema.validateAlignAllowZero(block, align_src, align_bytes);
20488 break :blk try sema.validateAlign(block, align_src, align_bytes);
2050020489 } else .none;
2050120490
2050220491 const address_space: std.builtin.AddressSpace = if (inst_data.flags.has_addrspace) blk: {
......@@ -26858,7 +26847,7 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
2685826847 if (val.isGenericPoison()) {
2685926848 break :blk null;
2686026849 }
26861 break :blk try sema.validateAlignAllowZero(block, align_src, try val.toUnsignedIntSema(pt));
26850 break :blk try sema.validateAlign(block, align_src, try val.toUnsignedIntSema(pt));
2686226851 } else if (extra.data.bits.has_align_ref) blk: {
2686326852 const align_ref: Zir.Inst.Ref = @enumFromInt(sema.code.extra[extra_index]);
2686426853 extra_index += 1;
......@@ -26876,7 +26865,7 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
2687626865 error.GenericPoison => break :blk null,
2687726866 else => |e| return e,
2687826867 };
26879 break :blk try sema.validateAlignAllowZero(block, align_src, try align_val.toUnsignedIntSema(pt));
26868 break :blk try sema.validateAlign(block, align_src, try align_val.toUnsignedIntSema(pt));
2688026869 } else .none;
2688126870
2688226871 const @"addrspace": ?std.builtin.AddressSpace = if (extra.data.bits.has_addrspace_body) blk: {
test/cases/compile_errors/align_zero.zig created+52
......@@ -0,0 +1,52 @@
1pub var global_var: i32 align(0) = undefined;
2
3pub export fn a() void {
4 _ = &global_var;
5}
6
7pub extern var extern_var: i32 align(0);
8
9pub export fn b() void {
10 _ = &extern_var;
11}
12
13pub export fn c() align(0) void {}
14
15pub export fn d() void {
16 _ = *align(0) fn () i32;
17}
18
19pub export fn e() void {
20 var local_var: i32 align(0) = undefined;
21 _ = &local_var;
22}
23
24pub export fn f() void {
25 _ = *align(0) i32;
26}
27
28pub export fn g() void {
29 _ = []align(0) i32;
30}
31
32pub export fn h() void {
33 _ = struct { field: i32 align(0) };
34}
35
36pub export fn i() void {
37 _ = union { field: i32 align(0) };
38}
39
40// error
41// backend=stage2
42// target=native
43//
44// :1:31: error: alignment must be >= 1
45// :7:38: error: alignment must be >= 1
46// :13:25: error: alignment must be >= 1
47// :16:16: error: alignment must be >= 1
48// :20:30: error: alignment must be >= 1
49// :25:16: error: alignment must be >= 1
50// :29:17: error: alignment must be >= 1
51// :33:35: error: alignment must be >= 1
52// :37:34: error: alignment must be >= 1
test/cases/compile_errors/function_alignment_on_unsupported_target.zig+1-1
......@@ -1,4 +1,4 @@
1export fn entry() align(0) void {}
1export fn entry() align(64) void {}
22
33// error
44// backend=stage2