aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-08-01 17:45:47 +0300
committerVeikka Tuominen <git@vexu.eu>2022-08-02 18:33:03 +0300
commit292906fb2378bd37e02abf09e2be7f86ee657fac (patch)
treed8466e1f381b4e6782b080e945c5dfc7679ed802 /src/Sema.zig
parent4831c1c65f51ccfdb48c8d16bdf77435e0256070 (diff)
downloadzig-292906fb2378bd37e02abf09e2be7f86ee657fac.tar.gz
zig-292906fb2378bd37e02abf09e2be7f86ee657fac.zip
Sema: fix reify Fn alignment and args
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 71ab59d7f9..67f04daf83 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -16429,10 +16429,24 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
return sema.fail(block, src, "varargs functions must have C calling convention", .{});
}
- const alignment = @intCast(u29, alignment_val.toUnsignedInt(target)); // TODO: Validate this value.
+ const alignment = alignment: {
+ if (!try sema.intFitsInType(block, src, alignment_val, Type.u32, null)) {
+ return sema.fail(block, src, "alignment must fit in 'u32'", .{});
+ }
+ const alignment = @intCast(u29, alignment_val.toUnsignedInt(target));
+ if (alignment == target_util.defaultFunctionAlignment(target)) {
+ break :alignment 0;
+ } else {
+ break :alignment alignment;
+ }
+ };
var buf: Value.ToTypeBuffer = undefined;
- const args: []Value = if (args_val.castTag(.aggregate)) |some| some.data else &.{};
+ const args_slice_val = args_val.castTag(.slice).?.data;
+ const args_decl_index = args_slice_val.ptr.pointerDecl().?;
+ try sema.ensureDeclAnalyzed(args_decl_index);
+ const args_decl = mod.declPtr(args_decl_index);
+ const args: []Value = if (args_decl.val.castTag(.aggregate)) |some| some.data else &.{};
var param_types = try sema.arena.alloc(Type, args.len);
var comptime_params = try sema.arena.alloc(bool, args.len);
var noalias_bits: u32 = 0;