Skip to content

Commit aef5c75

Browse files
alexrpandrewrk
authored andcommitted
compiler: Disallow align(0) everywhere in the language.
Thus leaving the design space for this alignment value open, e.g. for packing.
1 parent 2742ab4 commit aef5c75

File tree

3 files changed

+57
-16
lines changed

3 files changed

+57
-16
lines changed

src/Sema.zig

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
2592-
fn 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: {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
pub var global_var: i32 align(0) = undefined;
2+
3+
pub export fn a() void {
4+
_ = &global_var;
5+
}
6+
7+
pub extern var extern_var: i32 align(0);
8+
9+
pub export fn b() void {
10+
_ = &extern_var;
11+
}
12+
13+
pub export fn c() align(0) void {}
14+
15+
pub export fn d() void {
16+
_ = *align(0) fn () i32;
17+
}
18+
19+
pub export fn e() void {
20+
var local_var: i32 align(0) = undefined;
21+
_ = &local_var;
22+
}
23+
24+
pub export fn f() void {
25+
_ = *align(0) i32;
26+
}
27+
28+
pub export fn g() void {
29+
_ = []align(0) i32;
30+
}
31+
32+
pub export fn h() void {
33+
_ = struct { field: i32 align(0) };
34+
}
35+
36+
pub 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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export fn entry() align(0) void {}
1+
export fn entry() align(64) void {}
22

33
// error
44
// backend=stage2

0 commit comments

Comments
 (0)