authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2015-12-05 21:04:57-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2015-12-05 21:08:20-07:00
logdaa3b6bfa32e3be1c434b20ba91f6a519304c81c
tree2ffcd73c18ff37b7b6b46148511ffbe92d03ae12
parentf49e857b9b0063744e9df9481ef7fdef313c56d3

add unused label error


4 files changed, 24 insertions(+), 2 deletions(-)

README.md-2
...@@ -42,8 +42,6 @@ make...@@ -42,8 +42,6 @@ make
4242
43## Roadmap43## Roadmap
4444
45 * parseh: unreachable <--> noreturn attribute
46 * unused label error
47 * loops45 * loops
48 * structs46 * structs
49 * tagged enums47 * tagged enums
src/analyze.cpp+18
...@@ -471,6 +471,7 @@ static TypeTableEntry * analyze_expression(CodeGen *g, ImportTableEntry *import,...@@ -471,6 +471,7 @@ static TypeTableEntry * analyze_expression(CodeGen *g, ImportTableEntry *import,
471 assert(!node->codegen_node);471 assert(!node->codegen_node);
472 node->codegen_node = allocate<CodeGenNode>(1);472 node->codegen_node = allocate<CodeGenNode>(1);
473 node->codegen_node->data.label_entry = table_entry->value;473 node->codegen_node->data.label_entry = table_entry->value;
474 table_entry->value->used = true;
474 } else {475 } else {
475 add_node_error(g, node,476 add_node_error(g, node,
476 buf_sprintf("use of undeclared label '%s'", buf_ptr(&node->data.go_to.name)));477 buf_sprintf("use of undeclared label '%s'", buf_ptr(&node->data.go_to.name)));
...@@ -758,6 +759,23 @@ static void analyze_top_level_declaration(CodeGen *g, ImportTableEntry *import,...@@ -758,6 +759,23 @@ static void analyze_top_level_declaration(CodeGen *g, ImportTableEntry *import,
758 node->codegen_node = allocate<CodeGenNode>(1);759 node->codegen_node = allocate<CodeGenNode>(1);
759 node->codegen_node->data.fn_def_node.implicit_return_type = block_return_type;760 node->codegen_node->data.fn_def_node.implicit_return_type = block_return_type;
760 node->codegen_node->data.fn_def_node.block_context = context;761 node->codegen_node->data.fn_def_node.block_context = context;
762
763 {
764 FnTableEntry *fn_table_entry = fn_proto_node->codegen_node->data.fn_proto_node.fn_table_entry;
765 auto it = fn_table_entry->label_table.entry_iterator();
766 for (;;) {
767 auto *entry = it.next();
768 if (!entry)
769 break;
770
771 LabelTableEntry *label_entry = entry->value;
772 if (!label_entry->used) {
773 add_node_error(g, label_entry->label_node,
774 buf_sprintf("label '%s' defined but not used",
775 buf_ptr(&label_entry->label_node->data.label.name)));
776 }
777 }
778 }
761 }779 }
762 break;780 break;
763781
src/semantic_info.hpp+1
...@@ -41,6 +41,7 @@ struct ImportTableEntry {...@@ -41,6 +41,7 @@ struct ImportTableEntry {
41struct LabelTableEntry {41struct LabelTableEntry {
42 AstNode *label_node;42 AstNode *label_node;
43 LLVMBasicBlockRef basic_block;43 LLVMBasicBlockRef basic_block;
44 bool used;
44};45};
4546
46struct FnTableEntry {47struct FnTableEntry {
test/run_tests.cpp+5
...@@ -466,6 +466,11 @@ fn f(a : unreachable) {}...@@ -466,6 +466,11 @@ fn f(a : unreachable) {}
466export fn f(a : void) {}466export fn f(a : void) {}
467 )SOURCE", 1, ".tmp_source.zig:2:17: error: parameter of type 'void' not allowed on exported functions");467 )SOURCE", 1, ".tmp_source.zig:2:17: error: parameter of type 'void' not allowed on exported functions");
468468
469 add_compile_fail_case("unused label", R"SOURCE(
470export fn f() {
471a_label:
472}
473 )SOURCE", 1, ".tmp_source.zig:3:1: error: label 'a_label' defined but not used");
469}474}
470475
471static void print_compiler_invocation(TestCase *test_case, Buf *zig_stderr) {476static void print_compiler_invocation(TestCase *test_case, Buf *zig_stderr) {