authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-26 16:59:08-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-26 16:59:08-04:00
log1c26c2f4d5c9029fe39cc413f75e547636e42a14
tree9f04f713a5d925145a36f08d3236dbec82ebb117
parent589201b10492e2aba06df7860666cef7c6916acc
signaturelock-open Commit is signed but in an unrecognized format.

fix crash when compile error evaluating return...

...type of inferred error set. closes #1591

3 files changed, 34 insertions(+), 3 deletions(-)

src/analyze.cpp+3-1
......@@ -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+18-2
......@@ -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,
1305313061static 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+13
......@@ -1,6 +1,19 @@
11const tests = @import("tests.zig");
22
33pub 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 {