@@ -10984,19 +10984,7 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst
10984
10984
if (actual_type->id == ZigTypeIdComptimeFloat ||
10985
10985
actual_type->id == ZigTypeIdComptimeInt)
10986
10986
{
10987
- if ((err = ensure_complete_type(ira->codegen, wanted_type)))
10988
- return ira->codegen->invalid_instruction;
10989
- if (wanted_type->id == ZigTypeIdEnum) {
10990
- IrInstruction *cast1 = ir_analyze_cast(ira, source_instr, wanted_type->data.enumeration.tag_int_type, value);
10991
- if (type_is_invalid(cast1->value.type))
10992
- return ira->codegen->invalid_instruction;
10993
-
10994
- IrInstruction *cast2 = ir_analyze_cast(ira, source_instr, wanted_type, cast1);
10995
- if (type_is_invalid(cast2->value.type))
10996
- return ira->codegen->invalid_instruction;
10997
-
10998
- return cast2;
10999
- } else if (ir_num_lit_fits_in_other_type(ira, value, wanted_type, true)) {
10987
+ if (ir_num_lit_fits_in_other_type(ira, value, wanted_type, true)) {
11000
10988
CastOp op;
11001
10989
if ((actual_type->id == ZigTypeIdComptimeFloat &&
11002
10990
wanted_type->id == ZigTypeIdFloat) ||
@@ -11211,7 +11199,7 @@ static ZigType *adjust_ptr_len(CodeGen *g, ZigType *ptr_type, PtrLen ptr_len) {
11211
11199
}
11212
11200
11213
11201
static IrInstruction *ir_implicit_cast_result(IrAnalyze *ira, IrInstruction *result_loc,
11214
- ZigType *needed_child_type)
11202
+ ZigType *needed_child_type, bool allow_failure )
11215
11203
{
11216
11204
Error err;
11217
11205
if (type_is_invalid(result_loc->value.type) || type_is_invalid(needed_child_type))
@@ -11278,14 +11266,18 @@ static IrInstruction *ir_implicit_cast_result(IrAnalyze *ira, IrInstruction *res
11278
11266
needed_child_type->id == ZigTypeIdComptimeFloat)
11279
11267
{
11280
11268
IrInstruction *cast1 = ir_implicit_cast_result(ira, result_loc,
11281
- have_child_type->data.error_union.payload_type);
11269
+ have_child_type->data.error_union.payload_type, allow_failure );
11282
11270
if (type_is_invalid(cast1->value.type))
11283
11271
return ira->codegen->invalid_instruction;
11284
11272
11285
- return ir_implicit_cast_result(ira, cast1, needed_child_type);
11273
+ return ir_implicit_cast_result(ira, cast1, needed_child_type, allow_failure );
11286
11274
}
11287
11275
}
11288
11276
11277
+ if (allow_failure) {
11278
+ return result_loc;
11279
+ }
11280
+
11289
11281
ErrorMsg *parent_msg = ir_add_error_node(ira, source_node,
11290
11282
buf_sprintf("expected type '%s', found '%s'",
11291
11283
buf_ptr(&have_child_type->name),
@@ -13377,7 +13369,7 @@ static IrInstruction *ir_get_var_ptr(IrAnalyze *ira, IrInstruction *instruction,
13377
13369
}
13378
13370
13379
13371
static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source_instr,
13380
- IrInstruction *uncasted_ptr, IrInstruction *value )
13372
+ IrInstruction *uncasted_ptr, IrInstruction *uncasted_value )
13381
13373
{
13382
13374
if (uncasted_ptr->value.type->id != ZigTypeIdPointer) {
13383
13375
ir_add_error(ira, uncasted_ptr,
@@ -13394,10 +13386,15 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source
13394
13386
return ira->codegen->invalid_instruction;
13395
13387
}
13396
13388
13397
- IrInstruction *ptr = ir_implicit_cast_result(ira, uncasted_ptr, value ->value.type);
13389
+ IrInstruction *ptr = ir_implicit_cast_result(ira, uncasted_ptr, uncasted_value ->value.type, true );
13398
13390
if (type_is_invalid(ptr->value.type))
13399
13391
return ira->codegen->invalid_instruction;
13400
13392
13393
+ ZigType *child_type = ptr->value.type->data.pointer.child_type;
13394
+ IrInstruction *value = ir_implicit_cast(ira, uncasted_value, child_type);
13395
+ if (type_is_invalid(value->value.type))
13396
+ return ira->codegen->invalid_instruction;
13397
+
13401
13398
if (instr_is_comptime(ptr) && ptr->value.data.x_ptr.special != ConstPtrSpecialHardCodedAddr) {
13402
13399
if (ptr->value.data.x_ptr.mut == ConstPtrMutComptimeConst) {
13403
13400
ir_add_error(ira, source_instr, buf_sprintf("cannot assign to constant"));
@@ -13977,7 +13974,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *call
13977
13974
IrInstruction *result_loc = nullptr;
13978
13975
13979
13976
if (call_instruction->result_loc != nullptr) {
13980
- result_loc = ir_implicit_cast_result(ira, call_instruction->result_loc->child, return_type);
13977
+ result_loc = ir_implicit_cast_result(ira, call_instruction->result_loc->child, return_type, false );
13981
13978
if (type_is_invalid(result_loc->value.type))
13982
13979
return ira->codegen->invalid_instruction;
13983
13980
}
@@ -15434,21 +15431,7 @@ static IrInstruction *ir_analyze_instruction_store_ptr(IrAnalyze *ira, IrInstruc
15434
15431
static IrInstruction *ir_analyze_store_result(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *value,
15435
15432
IrInstruction *uncasted_result_loc)
15436
15433
{
15437
- if (instr_is_comptime(value)) {
15438
- // No need for the ir_implicit_cast_result for comptime values.
15439
- return ir_analyze_store_ptr(ira, source_instr, uncasted_result_loc, value);
15440
- }
15441
-
15442
- if (value->id == IrInstructionIdCall && handle_is_ptr(value->value.type)) {
15443
- // Elide this copy because it was the sret pointer in the function call.
15444
- return ir_const_void(ira, source_instr);
15445
- }
15446
-
15447
- IrInstruction *result_loc = ir_implicit_cast_result(ira, uncasted_result_loc, value->value.type);
15448
- if (type_is_invalid(result_loc->value.type))
15449
- return ira->codegen->invalid_instruction;
15450
-
15451
- return ir_analyze_store_ptr(ira, source_instr, result_loc, value);
15434
+ zig_panic("TODO delete this instruction");
15452
15435
}
15453
15436
15454
15437
static IrInstruction *ir_analyze_instruction_store_result(IrAnalyze *ira, IrInstructionStoreResult *instruction) {
@@ -21388,7 +21371,7 @@ static IrInstruction *ir_analyze_instruction_first_arg_result_loc(IrAnalyze *ira
21388
21371
return ira->codegen->invalid_instruction;
21389
21372
21390
21373
IrInstruction *new_result_loc = ir_implicit_cast_result(ira, instruction->prev_result_loc->child,
21391
- dest_type);
21374
+ dest_type, false );
21392
21375
if (type_is_invalid(new_result_loc->value.type))
21393
21376
return ira->codegen->invalid_instruction;
21394
21377
return new_result_loc;
0 commit comments