| ... | @@ -5466,19 +5466,24 @@ fn addStrLitNoAlias(sema: *Sema, bytes: []const u8) CompileError!Air.Inst.Ref { | ... | @@ -5466,19 +5466,24 @@ fn addStrLitNoAlias(sema: *Sema, bytes: []const u8) CompileError!Air.Inst.Ref { |
| 5466 | .ty = array_ty.toIntern(), | 5466 | .ty = array_ty.toIntern(), |
| 5467 | .storage = .{ .bytes = bytes }, | 5467 | .storage = .{ .bytes = bytes }, |
| 5468 | } }); | 5468 | } }); |
| 5469 | const ptr_ty = try sema.ptrType(.{ | 5469 | return anonDeclRef(sema, val); |
| 5470 | .child = array_ty.toIntern(), | 5470 | } |
| | 5471 | |
| | 5472 | fn anonDeclRef(sema: *Sema, val: InternPool.Index) CompileError!Air.Inst.Ref { |
| | 5473 | const mod = sema.mod; |
| | 5474 | const ptr_ty = (try sema.ptrType(.{ |
| | 5475 | .child = mod.intern_pool.typeOf(val), |
| 5471 | .flags = .{ | 5476 | .flags = .{ |
| 5472 | .alignment = .none, | 5477 | .alignment = .none, |
| 5473 | .is_const = true, | 5478 | .is_const = true, |
| 5474 | .address_space = .generic, | 5479 | .address_space = .generic, |
| 5475 | }, | 5480 | }, |
| 5476 | }); | 5481 | })).toIntern(); |
| 5477 | return Air.internedToRef(try mod.intern(.{ .ptr = .{ | 5482 | return Air.internedToRef(try mod.intern(.{ .ptr = .{ |
| 5478 | .ty = ptr_ty.toIntern(), | 5483 | .ty = ptr_ty, |
| 5479 | .addr = .{ .anon_decl = .{ | 5484 | .addr = .{ .anon_decl = .{ |
| 5480 | .val = val, | 5485 | .val = val, |
| 5481 | .orig_ty = ptr_ty.toIntern(), | 5486 | .orig_ty = ptr_ty, |
| 5482 | } }, | 5487 | } }, |
| 5483 | } })); | 5488 | } })); |
| 5484 | } | 5489 | } |
| ... | @@ -10740,7 +10745,7 @@ const SwitchProngAnalysis = struct { | ... | @@ -10740,7 +10745,7 @@ const SwitchProngAnalysis = struct { |
| 10740 | return block.addStructFieldVal(spa.operand, field_index, field_ty); | 10745 | return block.addStructFieldVal(spa.operand, field_index, field_ty); |
| 10741 | } | 10746 | } |
| 10742 | } else if (capture_byref) { | 10747 | } else if (capture_byref) { |
| 10743 | return sema.addConstantMaybeRef(block, operand_ty, item_val, true); | 10748 | return anonDeclRef(sema, item_val.toIntern()); |
| 10744 | } else { | 10749 | } else { |
| 10745 | return inline_case_capture; | 10750 | return inline_case_capture; |
| 10746 | } | 10751 | } |
| ... | @@ -13765,10 +13770,10 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -13765,10 +13770,10 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13765 | const coerced_elem_val = try sema.resolveConstValue(block, .unneeded, coerced_elem_val_inst, undefined); | 13770 | const coerced_elem_val = try sema.resolveConstValue(block, .unneeded, coerced_elem_val_inst, undefined); |
| 13766 | element_vals[elem_i] = try coerced_elem_val.intern(resolved_elem_ty, mod); | 13771 | element_vals[elem_i] = try coerced_elem_val.intern(resolved_elem_ty, mod); |
| 13767 | } | 13772 | } |
| 13768 | return sema.addConstantMaybeRef(block, result_ty, (try mod.intern(.{ .aggregate = .{ | 13773 | return sema.addConstantMaybeRef(try mod.intern(.{ .aggregate = .{ |
| 13769 | .ty = result_ty.toIntern(), | 13774 | .ty = result_ty.toIntern(), |
| 13770 | .storage = .{ .elems = element_vals }, | 13775 | .storage = .{ .elems = element_vals }, |
| 13771 | } })).toValue(), ptr_addrspace != null); | 13776 | } }), ptr_addrspace != null); |
| 13772 | } else break :rs rhs_src; | 13777 | } else break :rs rhs_src; |
| 13773 | } else lhs_src; | 13778 | } else lhs_src; |
| 13774 | | 13779 | |
| ... | @@ -14034,7 +14039,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -14034,7 +14039,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14034 | .storage = .{ .elems = element_vals }, | 14039 | .storage = .{ .elems = element_vals }, |
| 14035 | } }); | 14040 | } }); |
| 14036 | }; | 14041 | }; |
| 14037 | return sema.addConstantMaybeRef(block, result_ty, val.toValue(), ptr_addrspace != null); | 14042 | return sema.addConstantMaybeRef(val, ptr_addrspace != null); |
| 14038 | } | 14043 | } |
| 14039 | | 14044 | |
| 14040 | try sema.requireRuntimeBlock(block, src, lhs_src); | 14045 | try sema.requireRuntimeBlock(block, src, lhs_src); |
| ... | @@ -19022,10 +19027,7 @@ fn zirStructInitEmptyResult(sema: *Sema, block: *Block, inst: Zir.Inst.Index, is | ... | @@ -19022,10 +19027,7 @@ fn zirStructInitEmptyResult(sema: *Sema, block: *Block, inst: Zir.Inst.Index, is |
| 19022 | | 19027 | |
| 19023 | if (is_byref) { | 19028 | if (is_byref) { |
| 19024 | const init_val = (try sema.resolveValue(init_ref)).?; | 19029 | const init_val = (try sema.resolveValue(init_ref)).?; |
| 19025 | var anon_decl = try block.startAnonDecl(); | 19030 | return anonDeclRef(sema, init_val.toIntern()); |
| 19026 | defer anon_decl.deinit(); | | |
| 19027 | const decl = try anon_decl.finish(init_ty, init_val, .none); | | |
| 19028 | return sema.analyzeDeclRef(decl); | | |
| 19029 | } else { | 19031 | } else { |
| 19030 | return init_ref; | 19032 | return init_ref; |
| 19031 | } | 19033 | } |
| ... | @@ -19248,7 +19250,7 @@ fn zirStructInit( | ... | @@ -19248,7 +19250,7 @@ fn zirStructInit( |
| 19248 | } })).toValue(); | 19250 | } })).toValue(); |
| 19249 | const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val.toIntern()), src); | 19251 | const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val.toIntern()), src); |
| 19250 | const final_val = (try sema.resolveValue(final_val_inst)).?; | 19252 | const final_val = (try sema.resolveValue(final_val_inst)).?; |
| 19251 | return sema.addConstantMaybeRef(block, resolved_ty, final_val, is_ref); | 19253 | return sema.addConstantMaybeRef(final_val.toIntern(), is_ref); |
| 19252 | } | 19254 | } |
| 19253 | | 19255 | |
| 19254 | if (try sema.typeRequiresComptime(resolved_ty)) { | 19256 | if (try sema.typeRequiresComptime(resolved_ty)) { |
| ... | @@ -19408,7 +19410,7 @@ fn finishStructInit( | ... | @@ -19408,7 +19410,7 @@ fn finishStructInit( |
| 19408 | } }); | 19410 | } }); |
| 19409 | const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val), init_src); | 19411 | const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val), init_src); |
| 19410 | const final_val = (try sema.resolveValue(final_val_inst)).?; | 19412 | const final_val = (try sema.resolveValue(final_val_inst)).?; |
| 19411 | return sema.addConstantMaybeRef(block, result_ty, final_val, is_ref); | 19413 | return sema.addConstantMaybeRef(final_val.toIntern(), is_ref); |
| 19412 | }; | 19414 | }; |
| 19413 | | 19415 | |
| 19414 | if (try sema.typeRequiresComptime(struct_ty)) { | 19416 | if (try sema.typeRequiresComptime(struct_ty)) { |
| ... | @@ -19561,7 +19563,7 @@ fn structInitAnon( | ... | @@ -19561,7 +19563,7 @@ fn structInitAnon( |
| 19561 | .ty = tuple_ty, | 19563 | .ty = tuple_ty, |
| 19562 | .storage = .{ .elems = values }, | 19564 | .storage = .{ .elems = values }, |
| 19563 | } }); | 19565 | } }); |
| 19564 | return sema.addConstantMaybeRef(block, tuple_ty.toType(), tuple_val.toValue(), is_ref); | 19566 | return sema.addConstantMaybeRef(tuple_val, is_ref); |
| 19565 | }; | 19567 | }; |
| 19566 | | 19568 | |
| 19567 | sema.requireRuntimeBlock(block, .unneeded, null) catch |err| switch (err) { | 19569 | sema.requireRuntimeBlock(block, .unneeded, null) catch |err| switch (err) { |
| ... | @@ -19727,7 +19729,8 @@ fn zirArrayInit( | ... | @@ -19727,7 +19729,8 @@ fn zirArrayInit( |
| 19727 | .storage = .{ .elems = elem_vals }, | 19729 | .storage = .{ .elems = elem_vals }, |
| 19728 | } }); | 19730 | } }); |
| 19729 | const result_ref = try sema.coerce(block, result_ty, Air.internedToRef(arr_val), src); | 19731 | const result_ref = try sema.coerce(block, result_ty, Air.internedToRef(arr_val), src); |
| 19730 | return sema.addConstantMaybeRef(block, result_ty, (try sema.resolveValue(result_ref)).?, is_ref); | 19732 | const result_val = (try sema.resolveValue(result_ref)).?; |
| | 19733 | return sema.addConstantMaybeRef(result_val.toIntern(), is_ref); |
| 19731 | }; | 19734 | }; |
| 19732 | | 19735 | |
| 19733 | sema.requireRuntimeBlock(block, .unneeded, null) catch |err| switch (err) { | 19736 | sema.requireRuntimeBlock(block, .unneeded, null) catch |err| switch (err) { |
| ... | @@ -19846,7 +19849,7 @@ fn arrayInitAnon( | ... | @@ -19846,7 +19849,7 @@ fn arrayInitAnon( |
| 19846 | .ty = tuple_ty, | 19849 | .ty = tuple_ty, |
| 19847 | .storage = .{ .elems = values }, | 19850 | .storage = .{ .elems = values }, |
| 19848 | } }); | 19851 | } }); |
| 19849 | return sema.addConstantMaybeRef(block, tuple_ty.toType(), tuple_val.toValue(), is_ref); | 19852 | return sema.addConstantMaybeRef(tuple_val, is_ref); |
| 19850 | }; | 19853 | }; |
| 19851 | | 19854 | |
| 19852 | try sema.requireRuntimeBlock(block, src, runtime_src); | 19855 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| ... | @@ -19881,23 +19884,8 @@ fn arrayInitAnon( | ... | @@ -19881,23 +19884,8 @@ fn arrayInitAnon( |
| 19881 | return block.addAggregateInit(tuple_ty.toType(), element_refs); | 19884 | return block.addAggregateInit(tuple_ty.toType(), element_refs); |
| 19882 | } | 19885 | } |
| 19883 | | 19886 | |
| 19884 | fn addConstantMaybeRef( | 19887 | fn addConstantMaybeRef(sema: *Sema, val: InternPool.Index, is_ref: bool) !Air.Inst.Ref { |
| 19885 | sema: *Sema, | 19888 | return if (is_ref) anonDeclRef(sema, val) else Air.internedToRef(val); |
| 19886 | block: *Block, | | |
| 19887 | ty: Type, | | |
| 19888 | val: Value, | | |
| 19889 | is_ref: bool, | | |
| 19890 | ) !Air.Inst.Ref { | | |
| 19891 | if (!is_ref) return Air.internedToRef(val.toIntern()); | | |
| 19892 | | | |
| 19893 | var anon_decl = try block.startAnonDecl(); | | |
| 19894 | defer anon_decl.deinit(); | | |
| 19895 | const decl = try anon_decl.finish( | | |
| 19896 | ty, | | |
| 19897 | val, | | |
| 19898 | .none, // default alignment | | |
| 19899 | ); | | |
| 19900 | return sema.analyzeDeclRef(decl); | | |
| 19901 | } | 19889 | } |
| 19902 | | 19890 | |
| 19903 | fn zirFieldTypeRef(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 19891 | fn zirFieldTypeRef(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |