diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-04-29 18:25:25 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-04-29 18:25:25 -0700 |
| commit | ba9b9cb38dbd66c7a600606c5599c80b115e0f85 (patch) | |
| tree | 0709a9bef6a253f2ec082085a9c95cf33069fcf7 /src/Sema.zig | |
| parent | 2eef83e85f1f701fb67d410d3ffc1a1b344b4c13 (diff) | |
| download | zig-ba9b9cb38dbd66c7a600606c5599c80b115e0f85.tar.gz zig-ba9b9cb38dbd66c7a600606c5599c80b115e0f85.zip | |
AstGen: implement function prototypes with alignment exprs
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index b532125f12..ba7b87e251 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -2737,6 +2737,7 @@ fn zirFunc( body, extra.data.return_type, .Unspecified, + Value.initTag(.null_value), false, inferred_error_set, ); @@ -2750,6 +2751,7 @@ fn funcCommon( body: []const Zir.Inst.Index, zir_return_type: Zir.Inst.Ref, cc: std.builtin.CallingConvention, + align_val: Value, var_args: bool, inferred_error_set: bool, ) InnerError!*Inst { @@ -2762,7 +2764,7 @@ fn funcCommon( } // Hot path for some common function types. - if (zir_param_types.len == 0 and !var_args) { + if (zir_param_types.len == 0 and !var_args and align_val.tag() == .null_value) { if (return_type.zigTypeTag() == .NoReturn and cc == .Unspecified) { return sema.mod.constType(sema.arena, src, Type.initTag(.fn_noreturn_no_args)); } @@ -2789,6 +2791,10 @@ fn funcCommon( param_types[i] = try sema.resolveType(block, src, param_type); } + if (align_val.tag() != .null_value) { + return sema.mod.fail(&block.base, src, "TODO implement support for function prototypes to have alignment specified", .{}); + } + const fn_ty = try Type.Tag.function.create(sema.arena, .{ .param_types = param_types, .return_type = return_type, @@ -5432,6 +5438,7 @@ fn zirFuncExtended( const extra = sema.code.extraData(Zir.Inst.ExtendedFunc, extended.operand); const src: LazySrcLoc = .{ .node_offset = extra.data.src_node }; const cc_src: LazySrcLoc = .{ .node_offset_fn_type_cc = extra.data.src_node }; + const align_src: LazySrcLoc = src; // TODO add a LazySrcLoc that points at align const small = @bitCast(Zir.Inst.ExtendedFunc.Small, extended.small); var extra_index: usize = extra.end; @@ -5455,6 +5462,13 @@ fn zirFuncExtended( break :blk cc; } else .Unspecified; + const align_val: Value = if (small.has_align) blk: { + const align_ref = @intToEnum(Zir.Inst.Ref, sema.code.extra[extra_index]); + extra_index += 1; + const align_tv = try sema.resolveInstConst(block, align_src, align_ref); + break :blk align_tv.val; + } else Value.initTag(.null_value); + const param_types = sema.code.refSlice(extra_index, extra.data.param_types_len); extra_index += param_types.len; @@ -5467,6 +5481,7 @@ fn zirFuncExtended( body, extra.data.return_type, cc, + align_val, small.is_var_args, small.is_inferred_error, ); |
