@@ -13779,16 +13779,26 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source
13779
13779
return ir_const_void(ira, source_instr);
13780
13780
}
13781
13781
13782
+ ZigType *child_type = ptr->value.type->data.pointer.child_type;
13783
+
13782
13784
if (ptr->value.type->data.pointer.is_const && !source_instr->is_gen) {
13783
13785
ir_add_error(ira, source_instr, buf_sprintf("cannot assign to constant"));
13784
13786
return ira->codegen->invalid_instruction;
13785
13787
}
13786
13788
13787
- ZigType *child_type = ptr->value.type->data.pointer.child_type;
13788
13789
IrInstruction *value = ir_implicit_cast(ira, uncasted_value, child_type);
13789
13790
if (value == ira->codegen->invalid_instruction)
13790
13791
return ira->codegen->invalid_instruction;
13791
13792
13793
+ switch (type_has_one_possible_value(ira->codegen, child_type)) {
13794
+ case OnePossibleValueInvalid:
13795
+ return ira->codegen->invalid_instruction;
13796
+ case OnePossibleValueYes:
13797
+ return ir_const_void(ira, source_instr);
13798
+ case OnePossibleValueNo:
13799
+ break;
13800
+ }
13801
+
13792
13802
if (instr_is_comptime(ptr) && ptr->value.data.x_ptr.special != ConstPtrSpecialHardCodedAddr) {
13793
13803
if (ptr->value.data.x_ptr.mut == ConstPtrMutComptimeConst) {
13794
13804
ir_add_error(ira, source_instr, buf_sprintf("cannot assign to constant"));
@@ -13809,15 +13819,7 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source
13809
13819
bool same_global_refs = ptr->value.data.x_ptr.mut != ConstPtrMutComptimeVar;
13810
13820
copy_const_val(dest_val, &value->value, same_global_refs);
13811
13821
if (!ira->new_irb.current_basic_block->must_be_comptime_source_instr) {
13812
- switch (type_has_one_possible_value(ira->codegen, child_type)) {
13813
- case OnePossibleValueInvalid:
13814
- return ira->codegen->invalid_instruction;
13815
- case OnePossibleValueNo:
13816
- ira->new_irb.current_basic_block->must_be_comptime_source_instr = source_instr;
13817
- break;
13818
- case OnePossibleValueYes:
13819
- break;
13820
- }
13822
+ ira->new_irb.current_basic_block->must_be_comptime_source_instr = source_instr;
13821
13823
}
13822
13824
return ir_const_void(ira, source_instr);
13823
13825
}
@@ -15346,6 +15348,16 @@ static IrInstruction *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_
15346
15348
if (bare_type->id == ZigTypeIdStruct) {
15347
15349
TypeStructField *field = find_struct_type_field(bare_type, field_name);
15348
15350
if (field) {
15351
+ switch (type_has_one_possible_value(ira->codegen, field->type_entry)) {
15352
+ case OnePossibleValueInvalid:
15353
+ return ira->codegen->invalid_instruction;
15354
+ case OnePossibleValueYes: {
15355
+ IrInstruction *elem = ir_const(ira, source_instr, field->type_entry);
15356
+ return ir_get_ref(ira, source_instr, elem, false, false);
15357
+ }
15358
+ case OnePossibleValueNo:
15359
+ break;
15360
+ }
15349
15361
bool is_packed = (bare_type->data.structure.layout == ContainerLayoutPacked);
15350
15362
uint32_t align_bytes = is_packed ? 1 : get_abi_alignment(ira->codegen, field->type_entry);
15351
15363
uint32_t ptr_bit_offset = container_ptr->value.type->data.pointer.bit_offset_in_host;
0 commit comments