| ... | @@ -22713,6 +22713,16 @@ static IrInstGen *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_name | ... | @@ -22713,6 +22713,16 @@ static IrInstGen *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_name |
| 22713 | if (type_is_invalid(union_val->type)) | 22713 | if (type_is_invalid(union_val->type)) |
| 22714 | return ira->codegen->invalid_inst_gen; | 22714 | return ira->codegen->invalid_inst_gen; |
| 22715 | | 22715 | |
| | 22716 | // Reject undefined values unless we're intializing the union: |
| | 22717 | // a undefined union means also the tag is undefined, accessing |
| | 22718 | // its payload slot is UB. |
| | 22719 | const UndefAllowed allow_undef = initializing ? UndefOk : UndefBad; |
| | 22720 | if ((err = ir_resolve_const_val(ira->codegen, ira->new_irb.exec, |
| | 22721 | source_instr->source_node, union_val, allow_undef))) |
| | 22722 | { |
| | 22723 | return ira->codegen->invalid_inst_gen; |
| | 22724 | } |
| | 22725 | |
| 22716 | if (initializing) { | 22726 | if (initializing) { |
| 22717 | ZigValue *payload_val = ira->codegen->pass1_arena->create<ZigValue>(); | 22727 | ZigValue *payload_val = ira->codegen->pass1_arena->create<ZigValue>(); |
| 22718 | payload_val->special = ConstValSpecialUndef; | 22728 | payload_val->special = ConstValSpecialUndef; |
| ... | @@ -22737,6 +22747,7 @@ static IrInstGen *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_name | ... | @@ -22737,6 +22747,7 @@ static IrInstGen *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_name |
| 22737 | } | 22747 | } |
| 22738 | | 22748 | |
| 22739 | ZigValue *payload_val = union_val->data.x_union.payload; | 22749 | ZigValue *payload_val = union_val->data.x_union.payload; |
| | 22750 | assert(payload_val); |
| 22740 | | 22751 | |
| 22741 | IrInstGen *result; | 22752 | IrInstGen *result; |
| 22742 | if (ptr_val->data.x_ptr.mut == ConstPtrMutInfer) { | 22753 | if (ptr_val->data.x_ptr.mut == ConstPtrMutInfer) { |