authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-02-13 02:36:13+00:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-02-16 11:26:34+00:00
log10784c7fc8d419fff943994f1aa5a454d4e43391
treef58674fe9b481693abbba790f95491e950681ef8
parent434537213e406191959818f573b24ca45c1b0e45
signaturelock-open Commit is signed but in an unrecognized format.

AstGen: migrate `ty` result locations to `coerced_ty`

In most cases where AstGen is coercing to a fixed type (such as `u29`, `type`, `std.builtin.CallingConvention) we do not necessarily require an explicit coercion instruction. Instead, Sema knows the type that is required, and can perform the coercion after the fact. This means we can use the `coerced_ty` result location kind, saving unnecessary coercion instructions and therefore ZIR bytes. This required a few enhancements to Sema to introduce missing coercions.

2 files changed, 114 insertions(+), 87 deletions(-)

src/AstGen.zig+56-61
...@@ -360,16 +360,11 @@ const ResultInfo = struct {...@@ -360,16 +360,11 @@ const ResultInfo = struct {
360 };360 };
361};361};
362362
363/// TODO: modify Sema to remove in favour of `coerced_align_ri`
364const align_ri: ResultInfo = .{ .rl = .{ .ty = .u29_type } };
365const coerced_align_ri: ResultInfo = .{ .rl = .{ .coerced_ty = .u29_type } };363const coerced_align_ri: ResultInfo = .{ .rl = .{ .coerced_ty = .u29_type } };
366/// TODO: modify Sema to remove in favour of `coerced_addrspace_ri`
367const addrspace_ri: ResultInfo = .{ .rl = .{ .ty = .address_space_type } };
368const coerced_addrspace_ri: ResultInfo = .{ .rl = .{ .coerced_ty = .address_space_type } };364const coerced_addrspace_ri: ResultInfo = .{ .rl = .{ .coerced_ty = .address_space_type } };
369const coerced_linksection_ri: ResultInfo = .{ .rl = .{ .coerced_ty = .slice_const_u8_type } };365const coerced_linksection_ri: ResultInfo = .{ .rl = .{ .coerced_ty = .slice_const_u8_type } };
370const bool_ri: ResultInfo = .{ .rl = .{ .ty = .bool_type } };
371const type_ri: ResultInfo = .{ .rl = .{ .ty = .type_type } };
372const coerced_type_ri: ResultInfo = .{ .rl = .{ .coerced_ty = .type_type } };366const coerced_type_ri: ResultInfo = .{ .rl = .{ .coerced_ty = .type_type } };
367const coerced_bool_ri: ResultInfo = .{ .rl = .{ .coerced_ty = .bool_type } };
373368
374fn typeExpr(gz: *GenZir, scope: *Scope, type_node: Ast.Node.Index) InnerError!Zir.Inst.Ref {369fn typeExpr(gz: *GenZir, scope: *Scope, type_node: Ast.Node.Index) InnerError!Zir.Inst.Ref {
375 return comptimeExpr(gz, scope, coerced_type_ri, type_node);370 return comptimeExpr(gz, scope, coerced_type_ri, type_node);
...@@ -786,7 +781,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE...@@ -786,7 +781,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
786 .bool_and => return boolBinOp(gz, scope, ri, node, .bool_br_and),781 .bool_and => return boolBinOp(gz, scope, ri, node, .bool_br_and),
787 .bool_or => return boolBinOp(gz, scope, ri, node, .bool_br_or),782 .bool_or => return boolBinOp(gz, scope, ri, node, .bool_br_or),
788783
789 .bool_not => return simpleUnOp(gz, scope, ri, node, bool_ri, node_datas[node].lhs, .bool_not),784 .bool_not => return simpleUnOp(gz, scope, ri, node, coerced_bool_ri, node_datas[node].lhs, .bool_not),
790 .bit_not => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, node_datas[node].lhs, .bit_not),785 .bit_not => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, node_datas[node].lhs, .bit_not),
791786
792 .negation => return negation(gz, scope, ri, node),787 .negation => return negation(gz, scope, ri, node),
...@@ -1372,7 +1367,7 @@ fn fnProtoExpr(...@@ -1372,7 +1367,7 @@ fn fnProtoExpr(
1372 };1367 };
13731368
1374 const align_ref: Zir.Inst.Ref = if (fn_proto.ast.align_expr == 0) .none else inst: {1369 const align_ref: Zir.Inst.Ref = if (fn_proto.ast.align_expr == 0) .none else inst: {
1375 break :inst try expr(&block_scope, scope, align_ri, fn_proto.ast.align_expr);1370 break :inst try expr(&block_scope, scope, coerced_align_ri, fn_proto.ast.align_expr);
1376 };1371 };
13771372
1378 if (fn_proto.ast.addrspace_expr != 0) {1373 if (fn_proto.ast.addrspace_expr != 0) {
...@@ -1387,7 +1382,7 @@ fn fnProtoExpr(...@@ -1387,7 +1382,7 @@ fn fnProtoExpr(
1387 try expr(1382 try expr(
1388 &block_scope,1383 &block_scope,
1389 scope,1384 scope,
1390 .{ .rl = .{ .ty = .calling_convention_type } },1385 .{ .rl = .{ .coerced_ty = .calling_convention_type } },
1391 fn_proto.ast.callconv_expr,1386 fn_proto.ast.callconv_expr,
1392 )1387 )
1393 else1388 else
...@@ -3136,7 +3131,7 @@ fn varDecl(...@@ -3136,7 +3131,7 @@ fn varDecl(
3136 }3131 }
31373132
3138 const align_inst: Zir.Inst.Ref = if (var_decl.ast.align_node != 0)3133 const align_inst: Zir.Inst.Ref = if (var_decl.ast.align_node != 0)
3139 try expr(gz, scope, align_ri, var_decl.ast.align_node)3134 try expr(gz, scope, coerced_align_ri, var_decl.ast.align_node)
3140 else3135 else
3141 .none;3136 .none;
31423137
...@@ -3505,7 +3500,7 @@ fn assignDestructureMaybeDecls(...@@ -3505,7 +3500,7 @@ fn assignDestructureMaybeDecls(
3505 const this_lhs_comptime = is_comptime or (is_const and rhs_is_comptime);3500 const this_lhs_comptime = is_comptime or (is_const and rhs_is_comptime);
35063501
3507 const align_inst: Zir.Inst.Ref = if (full.ast.align_node != 0)3502 const align_inst: Zir.Inst.Ref = if (full.ast.align_node != 0)
3508 try expr(gz, scope, align_ri, full.ast.align_node)3503 try expr(gz, scope, coerced_align_ri, full.ast.align_node)
3509 else3504 else
3510 .none;3505 .none;
35113506
...@@ -3783,7 +3778,7 @@ fn ptrType(...@@ -3783,7 +3778,7 @@ fn ptrType(
3783 gz.astgen.source_line = source_line;3778 gz.astgen.source_line = source_line;
3784 gz.astgen.source_column = source_column;3779 gz.astgen.source_column = source_column;
37853780
3786 addrspace_ref = try expr(gz, scope, addrspace_ri, ptr_info.ast.addrspace_node);3781 addrspace_ref = try expr(gz, scope, coerced_addrspace_ri, ptr_info.ast.addrspace_node);
3787 trailing_count += 1;3782 trailing_count += 1;
3788 }3783 }
3789 if (ptr_info.ast.align_node != 0) {3784 if (ptr_info.ast.align_node != 0) {
...@@ -4176,7 +4171,7 @@ fn fnDecl(...@@ -4176,7 +4171,7 @@ fn fnDecl(
4176 var addrspace_gz = decl_gz.makeSubBlock(params_scope);4171 var addrspace_gz = decl_gz.makeSubBlock(params_scope);
4177 defer addrspace_gz.unstack();4172 defer addrspace_gz.unstack();
4178 const addrspace_ref: Zir.Inst.Ref = if (fn_proto.ast.addrspace_expr == 0) .none else inst: {4173 const addrspace_ref: Zir.Inst.Ref = if (fn_proto.ast.addrspace_expr == 0) .none else inst: {
4179 const inst = try expr(&decl_gz, params_scope, addrspace_ri, fn_proto.ast.addrspace_expr);4174 const inst = try expr(&decl_gz, params_scope, coerced_addrspace_ri, fn_proto.ast.addrspace_expr);
4180 if (addrspace_gz.instructionsSlice().len == 0) {4175 if (addrspace_gz.instructionsSlice().len == 0) {
4181 // In this case we will send a len=0 body which can be encoded more efficiently.4176 // In this case we will send a len=0 body which can be encoded more efficiently.
4182 break :inst inst;4177 break :inst inst;
...@@ -4431,7 +4426,7 @@ fn globalVarDecl(...@@ -4431,7 +4426,7 @@ fn globalVarDecl(
4431 try expr(4426 try expr(
4432 &block_scope,4427 &block_scope,
4433 &block_scope.base,4428 &block_scope.base,
4434 .{ .rl = .{ .ty = .type_type } },4429 coerced_type_ri,
4435 var_decl.ast.type_node,4430 var_decl.ast.type_node,
4436 )4431 )
4437 else4432 else
...@@ -5254,7 +5249,7 @@ fn unionDeclInner(...@@ -5254,7 +5249,7 @@ fn unionDeclInner(
5254 return astgen.failNode(member_node, "union field missing type", .{});5249 return astgen.failNode(member_node, "union field missing type", .{});
5255 }5250 }
5256 if (have_align) {5251 if (have_align) {
5257 const align_inst = try expr(&block_scope, &block_scope.base, .{ .rl = .{ .ty = .u32_type } }, member.ast.align_expr);5252 const align_inst = try expr(&block_scope, &block_scope.base, coerced_align_ri, member.ast.align_expr);
5258 wip_members.appendToField(@intFromEnum(align_inst));5253 wip_members.appendToField(@intFromEnum(align_inst));
5259 any_aligned_fields = true;5254 any_aligned_fields = true;
5260 }5255 }
...@@ -5522,7 +5517,7 @@ fn containerDecl(...@@ -5522,7 +5517,7 @@ fn containerDecl(
5522 namespace.base.tag = .enum_namespace;5517 namespace.base.tag = .enum_namespace;
55235518
5524 const arg_inst: Zir.Inst.Ref = if (container_decl.ast.arg != 0)5519 const arg_inst: Zir.Inst.Ref = if (container_decl.ast.arg != 0)
5525 try comptimeExpr(&block_scope, &namespace.base, .{ .rl = .{ .ty = .type_type } }, container_decl.ast.arg)5520 try comptimeExpr(&block_scope, &namespace.base, coerced_type_ri, container_decl.ast.arg)
5526 else5521 else
5527 .none;5522 .none;
55285523
...@@ -6079,7 +6074,7 @@ fn arrayAccess(...@@ -6079,7 +6074,7 @@ fn arrayAccess(
60796074
6080 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);6075 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
60816076
6082 const rhs = try expr(gz, scope, .{ .rl = .{ .ty = .usize_type } }, node_datas[node].rhs);6077 const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[node].rhs);
6083 try emitDbgStmt(gz, cursor);6078 try emitDbgStmt(gz, cursor);
60846079
6085 return gz.addPlNode(.elem_ptr_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs });6080 return gz.addPlNode(.elem_ptr_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs });
...@@ -6089,7 +6084,7 @@ fn arrayAccess(...@@ -6089,7 +6084,7 @@ fn arrayAccess(
60896084
6090 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);6085 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
60916086
6092 const rhs = try expr(gz, scope, .{ .rl = .{ .ty = .usize_type } }, node_datas[node].rhs);6087 const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[node].rhs);
6093 try emitDbgStmt(gz, cursor);6088 try emitDbgStmt(gz, cursor);
60946089
6095 return rvalue(gz, ri, try gz.addPlNode(.elem_val_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }), node);6090 return rvalue(gz, ri, try gz.addPlNode(.elem_val_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }), node);
...@@ -6157,12 +6152,12 @@ fn boolBinOp(...@@ -6157,12 +6152,12 @@ fn boolBinOp(
6157 const tree = astgen.tree;6152 const tree = astgen.tree;
6158 const node_datas = tree.nodes.items(.data);6153 const node_datas = tree.nodes.items(.data);
61596154
6160 const lhs = try expr(gz, scope, bool_ri, node_datas[node].lhs);6155 const lhs = try expr(gz, scope, coerced_bool_ri, node_datas[node].lhs);
6161 const bool_br = (try gz.addPlNodePayloadIndex(zir_tag, node, undefined)).toIndex().?;6156 const bool_br = (try gz.addPlNodePayloadIndex(zir_tag, node, undefined)).toIndex().?;
61626157
6163 var rhs_scope = gz.makeSubBlock(scope);6158 var rhs_scope = gz.makeSubBlock(scope);
6164 defer rhs_scope.unstack();6159 defer rhs_scope.unstack();
6165 const rhs = try expr(&rhs_scope, &rhs_scope.base, bool_ri, node_datas[node].rhs);6160 const rhs = try expr(&rhs_scope, &rhs_scope.base, coerced_bool_ri, node_datas[node].rhs);
6166 if (!gz.refIsNoReturn(rhs)) {6161 if (!gz.refIsNoReturn(rhs)) {
6167 _ = try rhs_scope.addBreakWithSrcNode(.break_inline, bool_br, rhs, node_datas[node].rhs);6162 _ = try rhs_scope.addBreakWithSrcNode(.break_inline, bool_br, rhs, node_datas[node].rhs);
6168 }6163 }
...@@ -6230,7 +6225,7 @@ fn ifExpr(...@@ -6230,7 +6225,7 @@ fn ifExpr(
6230 .bool_bit = try block_scope.addUnNode(tag, optional, if_full.ast.cond_expr),6225 .bool_bit = try block_scope.addUnNode(tag, optional, if_full.ast.cond_expr),
6231 };6226 };
6232 } else {6227 } else {
6233 const cond = try expr(&block_scope, &block_scope.base, bool_ri, if_full.ast.cond_expr);6228 const cond = try expr(&block_scope, &block_scope.base, coerced_bool_ri, if_full.ast.cond_expr);
6234 break :c .{6229 break :c .{
6235 .inst = cond,6230 .inst = cond,
6236 .bool_bit = cond,6231 .bool_bit = cond,
...@@ -6476,7 +6471,7 @@ fn whileExpr(...@@ -6476,7 +6471,7 @@ fn whileExpr(
6476 .bool_bit = try cond_scope.addUnNode(tag, optional, while_full.ast.cond_expr),6471 .bool_bit = try cond_scope.addUnNode(tag, optional, while_full.ast.cond_expr),
6477 };6472 };
6478 } else {6473 } else {
6479 const cond = try expr(&cond_scope, &cond_scope.base, bool_ri, while_full.ast.cond_expr);6474 const cond = try expr(&cond_scope, &cond_scope.base, coerced_bool_ri, while_full.ast.cond_expr);
6480 break :c .{6475 break :c .{
6481 .inst = cond,6476 .inst = cond,
6482 .bool_bit = cond,6477 .bool_bit = cond,
...@@ -8052,7 +8047,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref...@@ -8052,7 +8047,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref
8052 .rl = .{ .ptr = .{ .inst = try gz.addNode(.ret_ptr, node) } },8047 .rl = .{ .ptr = .{ .inst = try gz.addNode(.ret_ptr, node) } },
8053 .ctx = .@"return",8048 .ctx = .@"return",
8054 } else .{8049 } else .{
8055 .rl = .{ .ty = astgen.fn_ret_ty },8050 .rl = .{ .coerced_ty = astgen.fn_ret_ty },
8056 .ctx = .@"return",8051 .ctx = .@"return",
8057 };8052 };
8058 const prev_anon_name_strategy = gz.anon_name_strategy;8053 const prev_anon_name_strategy = gz.anon_name_strategy;
...@@ -8688,7 +8683,7 @@ fn unionInit(...@@ -8688,7 +8683,7 @@ fn unionInit(
8688 params: []const Ast.Node.Index,8683 params: []const Ast.Node.Index,
8689) InnerError!Zir.Inst.Ref {8684) InnerError!Zir.Inst.Ref {
8690 const union_type = try typeExpr(gz, scope, params[0]);8685 const union_type = try typeExpr(gz, scope, params[0]);
8691 const field_name = try comptimeExpr(gz, scope, .{ .rl = .{ .ty = .slice_const_u8_type } }, params[1]);8686 const field_name = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, params[1]);
8692 const field_type = try gz.addPlNode(.field_type_ref, node, Zir.Inst.FieldTypeRef{8687 const field_type = try gz.addPlNode(.field_type_ref, node, Zir.Inst.FieldTypeRef{
8693 .container_type = union_type,8688 .container_type = union_type,
8694 .field_name = field_name,8689 .field_name = field_name,
...@@ -9001,12 +8996,12 @@ fn builtinCall(...@@ -9001,12 +8996,12 @@ fn builtinCall(
9001 if (ri.rl == .ref or ri.rl == .ref_coerced_ty) {8996 if (ri.rl == .ref or ri.rl == .ref_coerced_ty) {
9002 return gz.addPlNode(.field_ptr_named, node, Zir.Inst.FieldNamed{8997 return gz.addPlNode(.field_ptr_named, node, Zir.Inst.FieldNamed{
9003 .lhs = try expr(gz, scope, .{ .rl = .ref }, params[0]),8998 .lhs = try expr(gz, scope, .{ .rl = .ref }, params[0]),
9004 .field_name = try comptimeExpr(gz, scope, .{ .rl = .{ .ty = .slice_const_u8_type } }, params[1]),8999 .field_name = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, params[1]),
9005 });9000 });
9006 }9001 }
9007 const result = try gz.addPlNode(.field_val_named, node, Zir.Inst.FieldNamed{9002 const result = try gz.addPlNode(.field_val_named, node, Zir.Inst.FieldNamed{
9008 .lhs = try expr(gz, scope, .{ .rl = .none }, params[0]),9003 .lhs = try expr(gz, scope, .{ .rl = .none }, params[0]),
9009 .field_name = try comptimeExpr(gz, scope, .{ .rl = .{ .ty = .slice_const_u8_type } }, params[1]),9004 .field_name = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, params[1]),
9010 });9005 });
9011 return rvalue(gz, ri, result, node);9006 return rvalue(gz, ri, result, node);
9012 },9007 },
...@@ -9133,7 +9128,7 @@ fn builtinCall(...@@ -9133,7 +9128,7 @@ fn builtinCall(
9133 return rvalue(gz, ri, .void_value, node);9128 return rvalue(gz, ri, .void_value, node);
9134 },9129 },
9135 .set_align_stack => {9130 .set_align_stack => {
9136 const order = try expr(gz, scope, align_ri, params[0]);9131 const order = try expr(gz, scope, coerced_align_ri, params[0]);
9137 _ = try gz.addExtendedPayload(.set_align_stack, Zir.Inst.UnNode{9132 _ = try gz.addExtendedPayload(.set_align_stack, Zir.Inst.UnNode{
9138 .node = gz.nodeIndexToRelative(node),9133 .node = gz.nodeIndexToRelative(node),
9139 .operand = order,9134 .operand = order,
...@@ -9175,32 +9170,32 @@ fn builtinCall(...@@ -9175,32 +9170,32 @@ fn builtinCall(
9175 .bit_size_of => return simpleUnOpType(gz, scope, ri, node, params[0], .bit_size_of),9170 .bit_size_of => return simpleUnOpType(gz, scope, ri, node, params[0], .bit_size_of),
9176 .align_of => return simpleUnOpType(gz, scope, ri, node, params[0], .align_of),9171 .align_of => return simpleUnOpType(gz, scope, ri, node, params[0], .align_of),
91779172
9178 .int_from_ptr => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .int_from_ptr),9173 .int_from_ptr => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .int_from_ptr),
9179 .compile_error => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .ty = .slice_const_u8_type } }, params[0], .compile_error),9174 .compile_error => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, params[0], .compile_error),
9180 .set_eval_branch_quota => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0], .set_eval_branch_quota),9175 .set_eval_branch_quota => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0], .set_eval_branch_quota),
9181 .int_from_enum => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .int_from_enum),9176 .int_from_enum => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .int_from_enum),
9182 .int_from_bool => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .int_from_bool),9177 .int_from_bool => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .int_from_bool),
9183 .embed_file => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .ty = .slice_const_u8_type } }, params[0], .embed_file),9178 .embed_file => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, params[0], .embed_file),
9184 .error_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .ty = .anyerror_type } }, params[0], .error_name),9179 .error_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .coerced_ty = .anyerror_type } }, params[0], .error_name),
9185 .set_runtime_safety => return simpleUnOp(gz, scope, ri, node, bool_ri, params[0], .set_runtime_safety),9180 .set_runtime_safety => return simpleUnOp(gz, scope, ri, node, coerced_bool_ri, params[0], .set_runtime_safety),
9186 .sqrt => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sqrt),9181 .sqrt => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sqrt),
9187 .sin => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sin),9182 .sin => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sin),
9188 .cos => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .cos),9183 .cos => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .cos),
9189 .tan => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .tan),9184 .tan => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .tan),
9190 .exp => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .exp),9185 .exp => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .exp),
9191 .exp2 => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .exp2),9186 .exp2 => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .exp2),
9192 .log => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .log),9187 .log => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .log),
9193 .log2 => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .log2),9188 .log2 => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .log2),
9194 .log10 => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .log10),9189 .log10 => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .log10),
9195 .abs => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .abs),9190 .abs => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .abs),
9196 .floor => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .floor),9191 .floor => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .floor),
9197 .ceil => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .ceil),9192 .ceil => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .ceil),
9198 .trunc => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .trunc),9193 .trunc => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .trunc),
9199 .round => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .round),9194 .round => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .round),
9200 .tag_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .tag_name),9195 .tag_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .tag_name),
9201 .type_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .type_name),9196 .type_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .type_name),
9202 .Frame => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .frame_type),9197 .Frame => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .frame_type),
9203 .frame_size => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .frame_size),9198 .frame_size => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .frame_size),
92049199
9205 .int_from_float => return typeCast(gz, scope, ri, node, params[0], .int_from_float, builtin_name),9200 .int_from_float => return typeCast(gz, scope, ri, node, params[0], .int_from_float, builtin_name),
9206 .float_from_int => return typeCast(gz, scope, ri, node, params[0], .float_from_int, builtin_name),9201 .float_from_int => return typeCast(gz, scope, ri, node, params[0], .float_from_int, builtin_name),
...@@ -9238,7 +9233,7 @@ fn builtinCall(...@@ -9238,7 +9233,7 @@ fn builtinCall(
9238 },9233 },
9239 .panic => {9234 .panic => {
9240 try emitDbgNode(gz, node);9235 try emitDbgNode(gz, node);
9241 return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .ty = .slice_const_u8_type } }, params[0], .panic);9236 return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, params[0], .panic);
9242 },9237 },
9243 .trap => {9238 .trap => {
9244 try emitDbgNode(gz, node);9239 try emitDbgNode(gz, node);
...@@ -9327,7 +9322,7 @@ fn builtinCall(...@@ -9327,7 +9322,7 @@ fn builtinCall(
9327 },9322 },
9328 .c_define => {9323 .c_define => {
9329 if (!gz.c_import) return gz.astgen.failNode(node, "C define valid only inside C import block", .{});9324 if (!gz.c_import) return gz.astgen.failNode(node, "C define valid only inside C import block", .{});
9330 const name = try comptimeExpr(gz, scope, .{ .rl = .{ .ty = .slice_const_u8_type } }, params[0]);9325 const name = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, params[0]);
9331 const value = try comptimeExpr(gz, scope, .{ .rl = .none }, params[1]);9326 const value = try comptimeExpr(gz, scope, .{ .rl = .none }, params[1]);
9332 const result = try gz.addExtendedPayload(.c_define, Zir.Inst.BinNode{9327 const result = try gz.addExtendedPayload(.c_define, Zir.Inst.BinNode{
9333 .node = gz.nodeIndexToRelative(node),9328 .node = gz.nodeIndexToRelative(node),
...@@ -9348,7 +9343,7 @@ fn builtinCall(...@@ -9348,7 +9343,7 @@ fn builtinCall(
9348 return rvalue(gz, ri, result, node);9343 return rvalue(gz, ri, result, node);
9349 },9344 },
9350 .reduce => {9345 .reduce => {
9351 const op = try expr(gz, scope, .{ .rl = .{ .ty = .reduce_op_type } }, params[0]);9346 const op = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .reduce_op_type } }, params[0]);
9352 const scalar = try expr(gz, scope, .{ .rl = .none }, params[1]);9347 const scalar = try expr(gz, scope, .{ .rl = .none }, params[1]);
9353 const result = try gz.addPlNode(.reduce, node, Zir.Inst.Bin{9348 const result = try gz.addPlNode(.reduce, node, Zir.Inst.Bin{
9354 .lhs = op,9349 .lhs = op,
...@@ -9424,7 +9419,7 @@ fn builtinCall(...@@ -9424,7 +9419,7 @@ fn builtinCall(
9424 },9419 },
9425 .field_parent_ptr => {9420 .field_parent_ptr => {
9426 const parent_type = try typeExpr(gz, scope, params[0]);9421 const parent_type = try typeExpr(gz, scope, params[0]);
9427 const field_name = try comptimeExpr(gz, scope, .{ .rl = .{ .ty = .slice_const_u8_type } }, params[1]);9422 const field_name = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, params[1]);
9428 const result = try gz.addPlNode(.field_parent_ptr, node, Zir.Inst.FieldParentPtr{9423 const result = try gz.addPlNode(.field_parent_ptr, node, Zir.Inst.FieldParentPtr{
9429 .parent_type = parent_type,9424 .parent_type = parent_type,
9430 .field_name = field_name,9425 .field_name = field_name,
...@@ -9561,7 +9556,7 @@ fn hasDeclOrField(...@@ -9561,7 +9556,7 @@ fn hasDeclOrField(
9561 tag: Zir.Inst.Tag,9556 tag: Zir.Inst.Tag,
9562) InnerError!Zir.Inst.Ref {9557) InnerError!Zir.Inst.Ref {
9563 const container_type = try typeExpr(gz, scope, lhs_node);9558 const container_type = try typeExpr(gz, scope, lhs_node);
9564 const name = try comptimeExpr(gz, scope, .{ .rl = .{ .ty = .slice_const_u8_type } }, rhs_node);9559 const name = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, rhs_node);
9565 const result = try gz.addPlNode(tag, node, Zir.Inst.Bin{9560 const result = try gz.addPlNode(tag, node, Zir.Inst.Bin{
9566 .lhs = container_type,9561 .lhs = container_type,
9567 .rhs = name,9562 .rhs = name,
...@@ -9711,7 +9706,7 @@ fn simpleCBuiltin(...@@ -9711,7 +9706,7 @@ fn simpleCBuiltin(
9711) InnerError!Zir.Inst.Ref {9706) InnerError!Zir.Inst.Ref {
9712 const name: []const u8 = if (tag == .c_undef) "C undef" else "C include";9707 const name: []const u8 = if (tag == .c_undef) "C undef" else "C include";
9713 if (!gz.c_import) return gz.astgen.failNode(node, "{s} valid only inside C import block", .{name});9708 if (!gz.c_import) return gz.astgen.failNode(node, "{s} valid only inside C import block", .{name});
9714 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .ty = .slice_const_u8_type } }, operand_node);9709 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, operand_node);
9715 _ = try gz.addExtendedPayload(tag, Zir.Inst.UnNode{9710 _ = try gz.addExtendedPayload(tag, Zir.Inst.UnNode{
9716 .node = gz.nodeIndexToRelative(node),9711 .node = gz.nodeIndexToRelative(node),
9717 .operand = operand,9712 .operand = operand,
...@@ -9729,7 +9724,7 @@ fn offsetOf(...@@ -9729,7 +9724,7 @@ fn offsetOf(
9729 tag: Zir.Inst.Tag,9724 tag: Zir.Inst.Tag,
9730) InnerError!Zir.Inst.Ref {9725) InnerError!Zir.Inst.Ref {
9731 const type_inst = try typeExpr(gz, scope, lhs_node);9726 const type_inst = try typeExpr(gz, scope, lhs_node);
9732 const field_name = try comptimeExpr(gz, scope, .{ .rl = .{ .ty = .slice_const_u8_type } }, rhs_node);9727 const field_name = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, rhs_node);
9733 const result = try gz.addPlNode(tag, node, Zir.Inst.Bin{9728 const result = try gz.addPlNode(tag, node, Zir.Inst.Bin{
9734 .lhs = type_inst,9729 .lhs = type_inst,
9735 .rhs = field_name,9730 .rhs = field_name,
...@@ -13148,7 +13143,7 @@ const GenZir = struct {...@@ -13148,7 +13143,7 @@ const GenZir = struct {
13148 fn addRet(gz: *GenZir, ri: ResultInfo, operand: Zir.Inst.Ref, node: Ast.Node.Index) !void {13143 fn addRet(gz: *GenZir, ri: ResultInfo, operand: Zir.Inst.Ref, node: Ast.Node.Index) !void {
13149 switch (ri.rl) {13144 switch (ri.rl) {
13150 .ptr => |ptr_res| _ = try gz.addUnNode(.ret_load, ptr_res.inst, node),13145 .ptr => |ptr_res| _ = try gz.addUnNode(.ret_load, ptr_res.inst, node),
13151 .ty => _ = try gz.addUnNode(.ret_node, operand, node),13146 .coerced_ty => _ = try gz.addUnNode(.ret_node, operand, node),
13152 else => unreachable,13147 else => unreachable,
13153 }13148 }
13154 }13149 }
src/Sema.zig+58-26
...@@ -10487,7 +10487,8 @@ fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -10487,7 +10487,8 @@ fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
10487 const elem_index_src: LazySrcLoc = .{ .node_offset_array_access_index = inst_data.src_node };10487 const elem_index_src: LazySrcLoc = .{ .node_offset_array_access_index = inst_data.src_node };
10488 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;10488 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
10489 const array = try sema.resolveInst(extra.lhs);10489 const array = try sema.resolveInst(extra.lhs);
10490 const elem_index = try sema.resolveInst(extra.rhs);10490 const uncoerced_elem_index = try sema.resolveInst(extra.rhs);
10491 const elem_index = try sema.coerce(block, Type.usize, uncoerced_elem_index, elem_index_src);
10491 return sema.elemVal(block, src, array, elem_index, elem_index_src, true);10492 return sema.elemVal(block, src, array, elem_index, elem_index_src, true);
10492}10493}
1049310494
...@@ -10539,7 +10540,8 @@ fn zirElemPtrNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -10539,7 +10540,8 @@ fn zirElemPtrNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
10539 const elem_index_src: LazySrcLoc = .{ .node_offset_array_access_index = inst_data.src_node };10540 const elem_index_src: LazySrcLoc = .{ .node_offset_array_access_index = inst_data.src_node };
10540 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;10541 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
10541 const array_ptr = try sema.resolveInst(extra.lhs);10542 const array_ptr = try sema.resolveInst(extra.lhs);
10542 const elem_index = try sema.resolveInst(extra.rhs);10543 const uncoerced_elem_index = try sema.resolveInst(extra.rhs);
10544 const elem_index = try sema.coerce(block, Type.usize, uncoerced_elem_index, elem_index_src);
10543 return sema.elemPtr(block, src, array_ptr, elem_index, elem_index_src, false, true);10545 return sema.elemPtr(block, src, array_ptr, elem_index, elem_index_src, false, true);
10544}10546}
1054510547
...@@ -18722,11 +18724,13 @@ fn zirBoolBr(...@@ -18722,11 +18724,13 @@ fn zirBoolBr(
18722 const inst_data = datas[@intFromEnum(inst)].pl_node;18724 const inst_data = datas[@intFromEnum(inst)].pl_node;
18723 const extra = sema.code.extraData(Zir.Inst.BoolBr, inst_data.payload_index);18725 const extra = sema.code.extraData(Zir.Inst.BoolBr, inst_data.payload_index);
1872418726
18725 const lhs = try sema.resolveInst(extra.data.lhs);18727 const uncoerced_lhs = try sema.resolveInst(extra.data.lhs);
18726 const body = sema.code.bodySlice(extra.end, extra.data.body_len);18728 const body = sema.code.bodySlice(extra.end, extra.data.body_len);
18727 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };18729 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
18728 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };18730 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1872918731
18732 const lhs = try sema.coerce(parent_block, Type.bool, uncoerced_lhs, lhs_src);
18733
18730 if (try sema.resolveDefinedValue(parent_block, lhs_src, lhs)) |lhs_val| {18734 if (try sema.resolveDefinedValue(parent_block, lhs_src, lhs)) |lhs_val| {
18731 if (is_bool_or and lhs_val.toBool()) {18735 if (is_bool_or and lhs_val.toBool()) {
18732 return .bool_true;18736 return .bool_true;
...@@ -18736,7 +18740,11 @@ fn zirBoolBr(...@@ -18736,7 +18740,11 @@ fn zirBoolBr(
18736 // comptime-known left-hand side. No need for a block here; the result18740 // comptime-known left-hand side. No need for a block here; the result
18737 // is simply the rhs expression. Here we rely on there only being 118741 // is simply the rhs expression. Here we rely on there only being 1
18738 // break instruction (`break_inline`).18742 // break instruction (`break_inline`).
18739 return sema.resolveBody(parent_block, body, inst);18743 const rhs_result = try sema.resolveBody(parent_block, body, inst);
18744 if (sema.typeOf(rhs_result).isNoReturn(mod)) {
18745 return rhs_result;
18746 }
18747 return sema.coerce(parent_block, Type.bool, rhs_result, rhs_src);
18740 }18748 }
1874118749
18742 const block_inst: Air.Inst.Index = @enumFromInt(sema.air_instructions.len);18750 const block_inst: Air.Inst.Index = @enumFromInt(sema.air_instructions.len);
...@@ -18767,13 +18775,16 @@ fn zirBoolBr(...@@ -18767,13 +18775,16 @@ fn zirBoolBr(
18767 _ = try lhs_block.addBr(block_inst, lhs_result);18775 _ = try lhs_block.addBr(block_inst, lhs_result);
1876818776
18769 const rhs_result = try sema.resolveBody(rhs_block, body, inst);18777 const rhs_result = try sema.resolveBody(rhs_block, body, inst);
18770 if (!sema.typeOf(rhs_result).isNoReturn(mod)) {18778 const rhs_noret = sema.typeOf(rhs_result).isNoReturn(mod);
18771 _ = try rhs_block.addBr(block_inst, rhs_result);18779 const coerced_rhs_result = if (!rhs_noret) rhs: {
18772 }18780 const coerced_result = try sema.coerce(rhs_block, Type.bool, rhs_result, rhs_src);
18781 _ = try rhs_block.addBr(block_inst, coerced_result);
18782 break :rhs coerced_result;
18783 } else rhs_result;
1877318784
18774 const result = sema.finishCondBr(parent_block, &child_block, &then_block, &else_block, lhs, block_inst);18785 const result = sema.finishCondBr(parent_block, &child_block, &then_block, &else_block, lhs, block_inst);
18775 if (!sema.typeOf(rhs_result).isNoReturn(mod)) {18786 if (!rhs_noret) {
18776 if (try sema.resolveDefinedValue(rhs_block, rhs_src, rhs_result)) |rhs_val| {18787 if (try sema.resolveDefinedValue(rhs_block, rhs_src, coerced_rhs_result)) |rhs_val| {
18777 if (is_bool_or and rhs_val.toBool()) {18788 if (is_bool_or and rhs_val.toBool()) {
18778 return .bool_true;18789 return .bool_true;
18779 } else if (!is_bool_or and !rhs_val.toBool()) {18790 } else if (!is_bool_or and !rhs_val.toBool()) {
...@@ -20750,8 +20761,9 @@ fn zirIntFromBool(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -20750,8 +20761,9 @@ fn zirIntFromBool(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
2075020761
20751fn zirErrorName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {20762fn zirErrorName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
20752 const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node;20763 const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node;
20753 const operand = try sema.resolveInst(inst_data.operand);
20754 const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };20764 const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };
20765 const uncoerced_operand = try sema.resolveInst(inst_data.operand);
20766 const operand = try sema.coerce(block, Type.anyerror, uncoerced_operand, operand_src);
2075520767
20756 if (try sema.resolveDefinedValue(block, operand_src, operand)) |val| {20768 if (try sema.resolveDefinedValue(block, operand_src, operand)) |val| {
20757 const err_name = sema.mod.intern_pool.indexToKey(val.toIntern()).err.name;20769 const err_name = sema.mod.intern_pool.indexToKey(val.toIntern()).err.name;
...@@ -25375,15 +25387,21 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A...@@ -25375,15 +25387,21 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
25375 } else if (extra.data.bits.has_align_ref) blk: {25387 } else if (extra.data.bits.has_align_ref) blk: {
25376 const align_ref: Zir.Inst.Ref = @enumFromInt(sema.code.extra[extra_index]);25388 const align_ref: Zir.Inst.Ref = @enumFromInt(sema.code.extra[extra_index]);
25377 extra_index += 1;25389 extra_index += 1;
25378 const align_tv = sema.resolveInstConst(block, align_src, align_ref, .{25390 const uncoerced_align = sema.resolveInst(align_ref) catch |err| switch (err) {
25391 error.GenericPoison => break :blk null,
25392 else => |e| return e,
25393 };
25394 const coerced_align = sema.coerce(block, Type.u29, uncoerced_align, align_src) catch |err| switch (err) {
25395 error.GenericPoison => break :blk null,
25396 else => |e| return e,
25397 };
25398 const align_val = sema.resolveConstDefinedValue(block, align_src, coerced_align, .{
25379 .needed_comptime_reason = "alignment must be comptime-known",25399 .needed_comptime_reason = "alignment must be comptime-known",
25380 }) catch |err| switch (err) {25400 }) catch |err| switch (err) {
25381 error.GenericPoison => {25401 error.GenericPoison => break :blk null,
25382 break :blk null;
25383 },
25384 else => |e| return e,25402 else => |e| return e,
25385 };25403 };
25386 const alignment = try sema.validateAlignAllowZero(block, align_src, try align_tv.val.toUnsignedIntAdvanced(sema));25404 const alignment = try sema.validateAlignAllowZero(block, align_src, try align_val.toUnsignedIntAdvanced(sema));
25387 const default = target_util.defaultFunctionAlignment(target);25405 const default = target_util.defaultFunctionAlignment(target);
25388 break :blk if (alignment == default) .none else alignment;25406 break :blk if (alignment == default) .none else alignment;
25389 } else .none;25407 } else .none;
...@@ -25394,7 +25412,7 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A...@@ -25394,7 +25412,7 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
25394 const body = sema.code.bodySlice(extra_index, body_len);25412 const body = sema.code.bodySlice(extra_index, body_len);
25395 extra_index += body.len;25413 extra_index += body.len;
2539625414
25397 const addrspace_ty = try sema.getBuiltinType("AddressSpace");25415 const addrspace_ty = Type.fromInterned(.address_space_type);
25398 const val = try sema.resolveGenericBody(block, addrspace_src, body, inst, addrspace_ty, .{25416 const val = try sema.resolveGenericBody(block, addrspace_src, body, inst, addrspace_ty, .{
25399 .needed_comptime_reason = "addrspace must be comptime-known",25417 .needed_comptime_reason = "addrspace must be comptime-known",
25400 });25418 });
...@@ -25405,15 +25423,22 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A...@@ -25405,15 +25423,22 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
25405 } else if (extra.data.bits.has_addrspace_ref) blk: {25423 } else if (extra.data.bits.has_addrspace_ref) blk: {
25406 const addrspace_ref: Zir.Inst.Ref = @enumFromInt(sema.code.extra[extra_index]);25424 const addrspace_ref: Zir.Inst.Ref = @enumFromInt(sema.code.extra[extra_index]);
25407 extra_index += 1;25425 extra_index += 1;
25408 const addrspace_tv = sema.resolveInstConst(block, addrspace_src, addrspace_ref, .{25426 const addrspace_ty = Type.fromInterned(.address_space_type);
25427 const uncoerced_addrspace = sema.resolveInst(addrspace_ref) catch |err| switch (err) {
25428 error.GenericPoison => break :blk null,
25429 else => |e| return e,
25430 };
25431 const coerced_addrspace = sema.coerce(block, addrspace_ty, uncoerced_addrspace, addrspace_src) catch |err| switch (err) {
25432 error.GenericPoison => break :blk null,
25433 else => |e| return e,
25434 };
25435 const addrspace_val = sema.resolveConstDefinedValue(block, addrspace_src, coerced_addrspace, .{
25409 .needed_comptime_reason = "addrspace must be comptime-known",25436 .needed_comptime_reason = "addrspace must be comptime-known",
25410 }) catch |err| switch (err) {25437 }) catch |err| switch (err) {
25411 error.GenericPoison => {25438 error.GenericPoison => break :blk null,
25412 break :blk null;
25413 },
25414 else => |e| return e,25439 else => |e| return e,
25415 };25440 };
25416 break :blk mod.toEnum(std.builtin.AddressSpace, addrspace_tv.val);25441 break :blk mod.toEnum(std.builtin.AddressSpace, addrspace_val);
25417 } else target_util.defaultAddressSpace(target, .function);25442 } else target_util.defaultAddressSpace(target, .function);
2541825443
25419 const section: Section = if (extra.data.bits.has_section_body) blk: {25444 const section: Section = if (extra.data.bits.has_section_body) blk: {
...@@ -25461,15 +25486,22 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A...@@ -25461,15 +25486,22 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
25461 } else if (extra.data.bits.has_cc_ref) blk: {25486 } else if (extra.data.bits.has_cc_ref) blk: {
25462 const cc_ref: Zir.Inst.Ref = @enumFromInt(sema.code.extra[extra_index]);25487 const cc_ref: Zir.Inst.Ref = @enumFromInt(sema.code.extra[extra_index]);
25463 extra_index += 1;25488 extra_index += 1;
25464 const cc_tv = sema.resolveInstConst(block, cc_src, cc_ref, .{25489 const cc_ty = Type.fromInterned(.calling_convention_type);
25490 const uncoerced_cc = sema.resolveInst(cc_ref) catch |err| switch (err) {
25491 error.GenericPoison => break :blk null,
25492 else => |e| return e,
25493 };
25494 const coerced_cc = sema.coerce(block, cc_ty, uncoerced_cc, cc_src) catch |err| switch (err) {
25495 error.GenericPoison => break :blk null,
25496 else => |e| return e,
25497 };
25498 const cc_val = sema.resolveConstDefinedValue(block, cc_src, coerced_cc, .{
25465 .needed_comptime_reason = "calling convention must be comptime-known",25499 .needed_comptime_reason = "calling convention must be comptime-known",
25466 }) catch |err| switch (err) {25500 }) catch |err| switch (err) {
25467 error.GenericPoison => {25501 error.GenericPoison => break :blk null,
25468 break :blk null;
25469 },
25470 else => |e| return e,25502 else => |e| return e,
25471 };25503 };
25472 break :blk mod.toEnum(std.builtin.CallingConvention, cc_tv.val);25504 break :blk mod.toEnum(std.builtin.CallingConvention, cc_val);
25473 } else if (sema.owner_decl.is_exported and has_body)25505 } else if (sema.owner_decl.is_exported and has_body)
25474 .C25506 .C
25475 else25507 else