| ... | @@ -8151,6 +8151,17 @@ static ImplicitCastMatchResult ir_types_match_with_implicit_cast(IrAnalyze *ira, | ... | @@ -8151,6 +8151,17 @@ static ImplicitCastMatchResult ir_types_match_with_implicit_cast(IrAnalyze *ira, |
| 8151 | } | 8151 | } |
| 8152 | } | 8152 | } |
| 8153 | | 8153 | |
| | 8154 | // implicit T to *T where T is zero bits |
| | 8155 | if (expected_type->id == TypeTableEntryIdPointer && expected_type->data.pointer.ptr_len == PtrLenSingle && |
| | 8156 | types_match_const_cast_only(ira, expected_type->data.pointer.child_type, |
| | 8157 | actual_type, source_node).id == ConstCastResultIdOk) |
| | 8158 | { |
| | 8159 | type_ensure_zero_bits_known(ira->codegen, actual_type); |
| | 8160 | if (!type_has_bits(actual_type)) { |
| | 8161 | return ImplicitCastMatchResultYes; |
| | 8162 | } |
| | 8163 | } |
| | 8164 | |
| 8154 | // implicit undefined literal to anything | 8165 | // implicit undefined literal to anything |
| 8155 | if (actual_type->id == TypeTableEntryIdUndefined) { | 8166 | if (actual_type->id == TypeTableEntryIdUndefined) { |
| 8156 | return ImplicitCastMatchResultYes; | 8167 | return ImplicitCastMatchResultYes; |
| ... | @@ -8820,7 +8831,7 @@ static void eval_const_expr_implicit_cast(CastOp cast_op, | ... | @@ -8820,7 +8831,7 @@ static void eval_const_expr_implicit_cast(CastOp cast_op, |
| 8820 | static IrInstruction *ir_resolve_cast(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *value, | 8831 | static IrInstruction *ir_resolve_cast(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *value, |
| 8821 | TypeTableEntry *wanted_type, CastOp cast_op, bool need_alloca) | 8832 | TypeTableEntry *wanted_type, CastOp cast_op, bool need_alloca) |
| 8822 | { | 8833 | { |
| 8823 | if (value->value.special != ConstValSpecialRuntime && | 8834 | if ((instr_is_comptime(value) || !type_has_bits(wanted_type)) && |
| 8824 | cast_op != CastOpResizeSlice && cast_op != CastOpBytesToSlice) | 8835 | cast_op != CastOpResizeSlice && cast_op != CastOpBytesToSlice) |
| 8825 | { | 8836 | { |
| 8826 | IrInstruction *result = ir_create_const(&ira->new_irb, source_instr->scope, | 8837 | IrInstruction *result = ir_create_const(&ira->new_irb, source_instr->scope, |
| ... | @@ -9382,9 +9393,19 @@ static IrInstruction *ir_get_ref(IrAnalyze *ira, IrInstruction *source_instructi | ... | @@ -9382,9 +9393,19 @@ static IrInstruction *ir_get_ref(IrAnalyze *ira, IrInstruction *source_instructi |
| 9382 | | 9393 | |
| 9383 | if (value->id == IrInstructionIdLoadPtr) { | 9394 | if (value->id == IrInstructionIdLoadPtr) { |
| 9384 | IrInstructionLoadPtr *load_ptr_inst = (IrInstructionLoadPtr *) value; | 9395 | IrInstructionLoadPtr *load_ptr_inst = (IrInstructionLoadPtr *) value; |
| | 9396 | |
| 9385 | if (load_ptr_inst->ptr->value.type->data.pointer.is_const) { | 9397 | if (load_ptr_inst->ptr->value.type->data.pointer.is_const) { |
| 9386 | return load_ptr_inst->ptr; | 9398 | return load_ptr_inst->ptr; |
| 9387 | } | 9399 | } |
| | 9400 | |
| | 9401 | type_ensure_zero_bits_known(ira->codegen, value->value.type); |
| | 9402 | if (type_is_invalid(value->value.type)) { |
| | 9403 | return ira->codegen->invalid_instruction; |
| | 9404 | } |
| | 9405 | |
| | 9406 | if (!type_has_bits(value->value.type)) { |
| | 9407 | return load_ptr_inst->ptr; |
| | 9408 | } |
| 9388 | } | 9409 | } |
| 9389 | | 9410 | |
| 9390 | if (instr_is_comptime(value)) { | 9411 | if (instr_is_comptime(value)) { |
| ... | @@ -10340,6 +10361,20 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst | ... | @@ -10340,6 +10361,20 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst |
| 10340 | } | 10361 | } |
| 10341 | } | 10362 | } |
| 10342 | | 10363 | |
| | 10364 | // explicit cast from T to *T where T is zero bits |
| | 10365 | if (wanted_type->id == TypeTableEntryIdPointer && wanted_type->data.pointer.ptr_len == PtrLenSingle && |
| | 10366 | types_match_const_cast_only(ira, wanted_type->data.pointer.child_type, |
| | 10367 | actual_type, source_node).id == ConstCastResultIdOk) |
| | 10368 | { |
| | 10369 | type_ensure_zero_bits_known(ira->codegen, actual_type); |
| | 10370 | if (type_is_invalid(actual_type)) { |
| | 10371 | return ira->codegen->invalid_instruction; |
| | 10372 | } |
| | 10373 | if (!type_has_bits(actual_type)) { |
| | 10374 | return ir_get_ref(ira, source_instr, value, false, false); |
| | 10375 | } |
| | 10376 | } |
| | 10377 | |
| 10343 | | 10378 | |
| 10344 | // explicit cast from undefined to anything | 10379 | // explicit cast from undefined to anything |
| 10345 | if (actual_type->id == TypeTableEntryIdUndefined) { | 10380 | if (actual_type->id == TypeTableEntryIdUndefined) { |