Skip to content

Commit 1c26c2f

Browse files
committed
fix crash when compile error evaluating return...
...type of inferred error set. closes #1591
1 parent 589201b commit 1c26c2f

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

src/analyze.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,7 @@ ZigType *get_error_union_type(CodeGen *g, ZigType *err_set_type, ZigType *payloa
673673
ZigType *entry = new_type_table_entry(ZigTypeIdErrorUnion);
674674
entry->is_copyable = true;
675675
assert(payload_type->di_type);
676-
assertNoError(ensure_complete_type(g, payload_type));
676+
assert(type_is_complete(payload_type));
677677

678678
buf_resize(&entry->name, 0);
679679
buf_appendf(&entry->name, "%s!%s", buf_ptr(&err_set_type->name), buf_ptr(&payload_type->name));
@@ -1684,6 +1684,8 @@ static ZigType *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *child_sc
16841684

16851685
if (fn_proto->auto_err_set) {
16861686
ZigType *inferred_err_set_type = get_auto_err_set_type(g, fn_entry);
1687+
if ((err = type_resolve(g, specified_return_type, ResolveStatusSizeKnown)))
1688+
return g->builtin_types.entry_invalid;
16871689
fn_type_id.return_type = get_error_union_type(g, inferred_err_set_type, specified_return_type);
16881690
} else {
16891691
fn_type_id.return_type = specified_return_type;

src/ir.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9344,9 +9344,15 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
93449344
if (prev_inst->value.type->id == ZigTypeIdErrorSet) {
93459345
return err_set_type;
93469346
} else if (prev_inst->value.type->id == ZigTypeIdErrorUnion) {
9347-
return get_error_union_type(ira->codegen, err_set_type, prev_inst->value.type->data.error_union.payload_type);
9347+
ZigType *payload_type = prev_inst->value.type->data.error_union.payload_type;
9348+
if ((err = type_resolve(ira->codegen, payload_type, ResolveStatusSizeKnown)))
9349+
return ira->codegen->builtin_types.entry_invalid;
9350+
return get_error_union_type(ira->codegen, err_set_type, payload_type);
93489351
} else if (expected_type != nullptr && expected_type->id == ZigTypeIdErrorUnion) {
9349-
return get_error_union_type(ira->codegen, err_set_type, expected_type->data.error_union.payload_type);
9352+
ZigType *payload_type = expected_type->data.error_union.payload_type;
9353+
if ((err = type_resolve(ira->codegen, payload_type, ResolveStatusSizeKnown)))
9354+
return ira->codegen->builtin_types.entry_invalid;
9355+
return get_error_union_type(ira->codegen, err_set_type, payload_type);
93509356
} else {
93519357
if (prev_inst->value.type->id == ZigTypeIdComptimeInt ||
93529358
prev_inst->value.type->id == ZigTypeIdComptimeFloat)
@@ -9359,6 +9365,8 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
93599365
buf_sprintf("unable to make error union out of null literal"));
93609366
return ira->codegen->builtin_types.entry_invalid;
93619367
} else {
9368+
if ((err = type_resolve(ira->codegen, prev_inst->value.type, ResolveStatusSizeKnown)))
9369+
return ira->codegen->builtin_types.entry_invalid;
93629370
return get_error_union_type(ira->codegen, err_set_type, prev_inst->value.type);
93639371
}
93649372
}
@@ -13053,6 +13061,8 @@ static ZigType *ir_analyze_instruction_error_return_trace(IrAnalyze *ira,
1305313061
static ZigType *ir_analyze_instruction_error_union(IrAnalyze *ira,
1305413062
IrInstructionErrorUnion *instruction)
1305513063
{
13064+
Error err;
13065+
1305613066
ZigType *err_set_type = ir_resolve_type(ira, instruction->err_set->other);
1305713067
if (type_is_invalid(err_set_type))
1305813068
return ira->codegen->builtin_types.entry_invalid;
@@ -13068,6 +13078,8 @@ static ZigType *ir_analyze_instruction_error_union(IrAnalyze *ira,
1306813078
return ira->codegen->builtin_types.entry_invalid;
1306913079
}
1307013080

13081+
if ((err = type_resolve(ira->codegen, payload_type, ResolveStatusSizeKnown)))
13082+
return ira->codegen->builtin_types.entry_invalid;
1307113083
ZigType *result_type = get_error_union_type(ira->codegen, err_set_type, payload_type);
1307213084

1307313085
ConstExprValue *out_val = ir_build_const_from(ira, &instruction->base);
@@ -13486,6 +13498,8 @@ static ZigType *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *call_instr
1348613498
ZigType *inferred_err_set_type = nullptr;
1348713499
if (fn_proto_node->data.fn_proto.auto_err_set) {
1348813500
inferred_err_set_type = get_auto_err_set_type(ira->codegen, fn_entry);
13501+
if ((err = type_resolve(ira->codegen, specified_return_type, ResolveStatusSizeKnown)))
13502+
return ira->codegen->builtin_types.entry_invalid;
1348913503
return_type = get_error_union_type(ira->codegen, inferred_err_set_type, specified_return_type);
1349013504
} else {
1349113505
return_type = specified_return_type;
@@ -13713,6 +13727,8 @@ static ZigType *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *call_instr
1371313727
return ira->codegen->builtin_types.entry_invalid;
1371413728
if (fn_proto_node->data.fn_proto.auto_err_set) {
1371513729
ZigType *inferred_err_set_type = get_auto_err_set_type(ira->codegen, impl_fn);
13730+
if ((err = type_resolve(ira->codegen, specified_return_type, ResolveStatusSizeKnown)))
13731+
return ira->codegen->builtin_types.entry_invalid;
1371613732
inst_fn_type_id.return_type = get_error_union_type(ira->codegen, inferred_err_set_type, specified_return_type);
1371713733
} else {
1371813734
inst_fn_type_id.return_type = specified_return_type;

test/compile_errors.zig

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
const tests = @import("tests.zig");
22

33
pub fn addCases(cases: *tests.CompileErrorContext) void {
4+
cases.add(
5+
"compile error when evaluating return type of inferred error set",
6+
\\const Car = struct {
7+
\\ foo: *SymbolThatDoesNotExist,
8+
\\ pub fn init() !Car {}
9+
\\};
10+
\\export fn entry() void {
11+
\\ const car = Car.init();
12+
\\}
13+
,
14+
".tmp_source.zig:2:11: error: use of undeclared identifier 'SymbolThatDoesNotExist'",
15+
);
16+
417
cases.add(
518
"don't implicit cast double pointer to *c_void",
619
\\export fn entry() void {

0 commit comments

Comments
 (0)