@@ -9015,7 +9015,6 @@ static IrInstruction *ir_gen_node_extra(IrBuilder *irb, AstNode *node, Scope *sc
9015
9015
if (irb->exec->first_err_trace_msg == nullptr) {
9016
9016
irb->exec->first_err_trace_msg = irb->codegen->trace_err;
9017
9017
}
9018
- src_assert(irb->exec->first_err_trace_msg != nullptr, node);
9019
9018
}
9020
9019
return result;
9021
9020
}
@@ -10709,10 +10708,12 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
10709
10708
if (type_is_global_error_set(err_set_type)) {
10710
10709
continue;
10711
10710
}
10712
- if (!resolve_inferred_error_set(ira->codegen, cur_type, cur_inst->source_node)) {
10711
+ bool allow_infer = cur_type->data.error_set.infer_fn != nullptr &&
10712
+ cur_type->data.error_set.infer_fn == ira->new_irb.exec->fn_entry;
10713
+ if (!allow_infer && !resolve_inferred_error_set(ira->codegen, cur_type, cur_inst->source_node)) {
10713
10714
return ira->codegen->builtin_types.entry_invalid;
10714
10715
}
10715
- if (type_is_global_error_set(cur_type)) {
10716
+ if (!allow_infer && type_is_global_error_set(cur_type)) {
10716
10717
err_set_type = ira->codegen->builtin_types.entry_global_error_set;
10717
10718
prev_inst = cur_inst;
10718
10719
continue;
@@ -10830,10 +10831,12 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
10830
10831
}
10831
10832
10832
10833
if (cur_type->id == ZigTypeIdErrorSet) {
10833
- if (!resolve_inferred_error_set(ira->codegen, cur_type, cur_inst->source_node)) {
10834
+ bool allow_infer = cur_type->data.error_set.infer_fn != nullptr &&
10835
+ cur_type->data.error_set.infer_fn == ira->new_irb.exec->fn_entry;
10836
+ if (!allow_infer && !resolve_inferred_error_set(ira->codegen, cur_type, cur_inst->source_node)) {
10834
10837
return ira->codegen->builtin_types.entry_invalid;
10835
10838
}
10836
- if (type_is_global_error_set(cur_type)) {
10839
+ if (!allow_infer && type_is_global_error_set(cur_type)) {
10837
10840
err_set_type = ira->codegen->builtin_types.entry_global_error_set;
10838
10841
continue;
10839
10842
}
@@ -10844,17 +10847,20 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
10844
10847
update_errors_helper(ira->codegen, &errors, &errors_count);
10845
10848
10846
10849
if (err_set_type == nullptr) {
10850
+ bool allow_infer = false;
10847
10851
if (prev_type->id == ZigTypeIdErrorUnion) {
10848
10852
err_set_type = prev_type->data.error_union.err_set_type;
10853
+ allow_infer = err_set_type->data.error_set.infer_fn != nullptr &&
10854
+ err_set_type->data.error_set.infer_fn == ira->new_irb.exec->fn_entry;
10849
10855
} else {
10850
10856
err_set_type = cur_type;
10851
10857
}
10852
10858
10853
- if (!resolve_inferred_error_set(ira->codegen, err_set_type, cur_inst->source_node)) {
10859
+ if (!allow_infer && ! resolve_inferred_error_set(ira->codegen, err_set_type, cur_inst->source_node)) {
10854
10860
return ira->codegen->builtin_types.entry_invalid;
10855
10861
}
10856
10862
10857
- if (type_is_global_error_set(err_set_type)) {
10863
+ if (!allow_infer && type_is_global_error_set(err_set_type)) {
10858
10864
err_set_type = ira->codegen->builtin_types.entry_global_error_set;
10859
10865
continue;
10860
10866
}
@@ -10908,15 +10914,22 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
10908
10914
if (prev_err_set_type == cur_err_set_type)
10909
10915
continue;
10910
10916
10911
- if (!resolve_inferred_error_set(ira->codegen, prev_err_set_type, cur_inst->source_node)) {
10917
+ bool allow_infer_prev = prev_err_set_type->data.error_set.infer_fn != nullptr &&
10918
+ prev_err_set_type->data.error_set.infer_fn == ira->new_irb.exec->fn_entry;
10919
+ bool allow_infer_cur = cur_err_set_type->data.error_set.infer_fn != nullptr &&
10920
+ cur_err_set_type->data.error_set.infer_fn == ira->new_irb.exec->fn_entry;
10921
+
10922
+ if (!allow_infer_prev && !resolve_inferred_error_set(ira->codegen, prev_err_set_type, cur_inst->source_node)) {
10912
10923
return ira->codegen->builtin_types.entry_invalid;
10913
10924
}
10914
10925
10915
- if (!resolve_inferred_error_set(ira->codegen, cur_err_set_type, cur_inst->source_node)) {
10926
+ if (!allow_infer_cur && ! resolve_inferred_error_set(ira->codegen, cur_err_set_type, cur_inst->source_node)) {
10916
10927
return ira->codegen->builtin_types.entry_invalid;
10917
10928
}
10918
10929
10919
- if (type_is_global_error_set(prev_err_set_type) || type_is_global_error_set(cur_err_set_type)) {
10930
+ if ((!allow_infer_prev && type_is_global_error_set(prev_err_set_type)) ||
10931
+ (!allow_infer_cur && type_is_global_error_set(cur_err_set_type)))
10932
+ {
10920
10933
err_set_type = ira->codegen->builtin_types.entry_global_error_set;
10921
10934
continue;
10922
10935
}
@@ -11085,10 +11098,14 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
11085
11098
{
11086
11099
if (err_set_type != nullptr) {
11087
11100
ZigType *cur_err_set_type = cur_type->data.error_union.err_set_type;
11088
- if (!resolve_inferred_error_set(ira->codegen, cur_err_set_type, cur_inst->source_node)) {
11101
+ bool allow_infer = cur_err_set_type->data.error_set.infer_fn != nullptr &&
11102
+ cur_err_set_type->data.error_set.infer_fn == ira->new_irb.exec->fn_entry;
11103
+ if (!allow_infer && !resolve_inferred_error_set(ira->codegen, cur_err_set_type, cur_inst->source_node)) {
11089
11104
return ira->codegen->builtin_types.entry_invalid;
11090
11105
}
11091
- if (type_is_global_error_set(cur_err_set_type) || type_is_global_error_set(err_set_type)) {
11106
+ if ((!allow_infer && type_is_global_error_set(cur_err_set_type)) ||
11107
+ type_is_global_error_set(err_set_type))
11108
+ {
11092
11109
err_set_type = ira->codegen->builtin_types.entry_global_error_set;
11093
11110
prev_inst = cur_inst;
11094
11111
continue;
0 commit comments