authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-01-27 09:52:49-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-01-27 09:52:49-05:00
logd8965002593c111069862e7de06402ee77b2b614
treec6b5c3e9dc2aedc278c70620abd0277cf089c4bf
parent4591389497b9bb362cb9385506b6cdc629eae8ea
parentf41e50dc08e5e701631e96d4fa278866a08a98d9
signaturelock-open Commit is signed but in an unrecognized format.

Merge branch 'LemonBoy-fix-4274'


2 files changed, 33 insertions(+), 14 deletions(-)

src/ir.cpp+27-14
......@@ -271,6 +271,7 @@ static IrInstGen *ir_analyze_inferred_field_ptr(IrAnalyze *ira, Buf *field_name,
271271 IrInst* source_instr, IrInstGen *container_ptr, ZigType *container_type);
272272static ResultLoc *no_result_loc(void);
273273static IrInstGen *ir_analyze_test_non_null(IrAnalyze *ira, IrInst *source_inst, IrInstGen *value);
274static IrInstGen *ir_error_dependency_loop(IrAnalyze *ira, IrInst *source_instr);
274275
275276static void destroy_instruction_src(IrInstSrc *inst) {
276277#ifdef ZIG_ENABLE_MEM_PROFILE
......@@ -20999,8 +21000,13 @@ static IrInstGen *ir_analyze_container_member_access_inner(IrAnalyze *ira,
2099921000 resolve_top_level_decl(ira->codegen, tld, source_instr->source_node, false);
2100021001 if (tld->resolution == TldResolutionInvalid)
2100121002 return ira->codegen->invalid_inst_gen;
21003 if (tld->resolution == TldResolutionResolving)
21004 return ir_error_dependency_loop(ira, source_instr);
21005
2100221006 TldFn *tld_fn = (TldFn *)tld;
2100321007 ZigFn *fn_entry = tld_fn->fn_entry;
21008 assert(fn_entry != nullptr);
21009
2100421010 if (type_is_invalid(fn_entry->type_entry))
2100521011 return ira->codegen->invalid_inst_gen;
2100621012
......@@ -21010,8 +21016,13 @@ static IrInstGen *ir_analyze_container_member_access_inner(IrAnalyze *ira,
2101021016 resolve_top_level_decl(ira->codegen, tld, source_instr->source_node, false);
2101121017 if (tld->resolution == TldResolutionInvalid)
2101221018 return ira->codegen->invalid_inst_gen;
21019 if (tld->resolution == TldResolutionResolving)
21020 return ir_error_dependency_loop(ira, source_instr);
21021
2101321022 TldVar *tld_var = (TldVar *)tld;
2101421023 ZigVar *var = tld_var->var;
21024 assert(var != nullptr);
21025
2101521026 if (type_is_invalid(var->var_type))
2101621027 return ira->codegen->invalid_inst_gen;
2101721028
......@@ -21334,6 +21345,8 @@ static IrInstGen *ir_analyze_decl_ref(IrAnalyze *ira, IrInst* source_instruction
2133421345 if (tld->resolution == TldResolutionInvalid) {
2133521346 return ira->codegen->invalid_inst_gen;
2133621347 }
21348 if (tld->resolution == TldResolutionResolving)
21349 return ir_error_dependency_loop(ira, source_instruction);
2133721350
2133821351 switch (tld->id) {
2133921352 case TldIdContainer:
......@@ -21343,9 +21356,8 @@ static IrInstGen *ir_analyze_decl_ref(IrAnalyze *ira, IrInst* source_instruction
2134321356 case TldIdVar: {
2134421357 TldVar *tld_var = (TldVar *)tld;
2134521358 ZigVar *var = tld_var->var;
21346 if (var == nullptr) {
21347 return ir_error_dependency_loop(ira, source_instruction);
21348 }
21359 assert(var != nullptr);
21360
2134921361 if (tld_var->extern_lib_name != nullptr) {
2135021362 add_link_lib_symbol(ira, tld_var->extern_lib_name, buf_create_from_str(var->name),
2135121363 source_instruction->source_node);
......@@ -21356,7 +21368,7 @@ static IrInstGen *ir_analyze_decl_ref(IrAnalyze *ira, IrInst* source_instruction
2135621368 case TldIdFn: {
2135721369 TldFn *tld_fn = (TldFn *)tld;
2135821370 ZigFn *fn_entry = tld_fn->fn_entry;
21359 assert(fn_entry->type_entry);
21371 assert(fn_entry->type_entry != nullptr);
2136021372
2136121373 if (type_is_invalid(fn_entry->type_entry))
2136221374 return ira->codegen->invalid_inst_gen;
......@@ -23536,11 +23548,14 @@ static Error ir_make_type_info_decls(IrAnalyze *ira, IrInst* source_instr, ZigVa
2353623548
2353723549 while ((curr_entry = decl_it.next()) != nullptr) {
2353823550 // If the declaration is unresolved, force it to be resolved again.
23539 if (curr_entry->value->resolution == TldResolutionUnresolved) {
23540 resolve_top_level_decl(ira->codegen, curr_entry->value, curr_entry->value->source_node, false);
23541 if (curr_entry->value->resolution != TldResolutionOk) {
23542 return ErrorSemanticAnalyzeFail;
23543 }
23551 resolve_top_level_decl(ira->codegen, curr_entry->value, curr_entry->value->source_node, false);
23552 if (curr_entry->value->resolution == TldResolutionInvalid) {
23553 return ErrorSemanticAnalyzeFail;
23554 }
23555
23556 if (curr_entry->value->resolution == TldResolutionResolving) {
23557 ir_error_dependency_loop(ira, source_instr);
23558 return ErrorSemanticAnalyzeFail;
2354423559 }
2354523560
2354623561 // Skip comptime blocks and test functions.
......@@ -23597,6 +23612,8 @@ static Error ir_make_type_info_decls(IrAnalyze *ira, IrInst* source_instr, ZigVa
2359723612 case TldIdVar:
2359823613 {
2359923614 ZigVar *var = ((TldVar *)curr_entry->value)->var;
23615 assert(var != nullptr);
23616
2360023617 if ((err = type_resolve(ira->codegen, var->const_value->type, ResolveStatusSizeKnown)))
2360123618 return ErrorSemanticAnalyzeFail;
2360223619
......@@ -23627,11 +23644,7 @@ static Error ir_make_type_info_decls(IrAnalyze *ira, IrInst* source_instr, ZigVa
2362723644
2362823645 ZigFn *fn_entry = ((TldFn *)curr_entry->value)->fn_entry;
2362923646 assert(!fn_entry->is_test);
23630
23631 if (fn_entry->type_entry == nullptr) {
23632 ir_error_dependency_loop(ira, source_instr);
23633 return ErrorSemanticAnalyzeFail;
23634 }
23647 assert(fn_entry->type_entry != nullptr);
2363523648
2363623649 AstNodeFnProto *fn_node = &fn_entry->proto_node->data.fn_proto;
2363723650
test/compile_errors.zig+6
......@@ -3,6 +3,12 @@ const builtin = @import("builtin");
33const Target = @import("std").Target;
44
55pub fn addCases(cases: *tests.CompileErrorContext) void {
6 cases.addTest("dependency loop in top-level decl with @TypeInfo",
7 \\export const foo = @typeInfo(@This());
8 , &[_][]const u8{
9 "tmp.zig:1:20: error: dependency loop detected",
10 });
11
612 cases.addTest("non-exhaustive enums",
713 \\const A = enum {
814 \\ a,