authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-02 20:06:51-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-02 20:06:51-07:00
loga50474e7cfc97e404fbb9f3b2f33507afac0ae2b
tree98af3b194f0db5878febb2a88fcfe952bb0cc356
parentd3de73739f88daa05cc7a93f12c262b27a987182

fix false positive error with same named methods in incomplete struct


2 files changed, 43 insertions(+), 6 deletions(-)

src/analyze.cpp+14-6
...@@ -5062,12 +5062,20 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast...@@ -5062,12 +5062,20 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast
5062 case NodeTypeFnProto:5062 case NodeTypeFnProto:
5063 {5063 {
5064 // if the name is missing, we immediately announce an error5064 // if the name is missing, we immediately announce an error
5065 Buf *name = &node->data.fn_proto.name;5065 Buf *fn_name = &node->data.fn_proto.name;
5066 if (buf_len(name) == 0) {5066 if (buf_len(fn_name) == 0) {
5067 node->data.fn_proto.skip = true;5067 node->data.fn_proto.skip = true;
5068 add_node_error(g, node, buf_sprintf("missing function name"));5068 add_node_error(g, node, buf_sprintf("missing function name"));
5069 break;5069 break;
5070 }5070 }
5071 Buf *qualified_name;
5072 AstNode *struct_node = node->data.fn_proto.struct_node;
5073 if (struct_node) {
5074 Buf *struct_name = &struct_node->data.struct_decl.name;
5075 qualified_name = buf_sprintf("%s.%s", buf_ptr(struct_name), buf_ptr(fn_name));
5076 } else {
5077 qualified_name = fn_name;
5078 }
50715079
50725080
5073 // determine which other top level declarations this function prototype depends on.5081 // determine which other top level declarations this function prototype depends on.
...@@ -5076,14 +5084,14 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast...@@ -5076,14 +5084,14 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast
50765084
5077 collect_expr_decl_deps(g, import, node, decl_node);5085 collect_expr_decl_deps(g, import, node, decl_node);
50785086
5079 decl_node->name = name;5087 decl_node->name = qualified_name;
5080 decl_node->import = import;5088 decl_node->import = import;
5081 if (decl_node->deps.size() > 0) {5089 if (decl_node->deps.size() > 0) {
5082 if (g->unresolved_top_level_decls.maybe_get(name)) {5090 if (g->unresolved_top_level_decls.maybe_get(qualified_name)) {
5083 node->data.fn_proto.skip = true;5091 node->data.fn_proto.skip = true;
5084 add_node_error(g, node, buf_sprintf("redefinition of '%s'", buf_ptr(name)));5092 add_node_error(g, node, buf_sprintf("redefinition of '%s'", buf_ptr(fn_name)));
5085 } else {5093 } else {
5086 g->unresolved_top_level_decls.put(name, node);5094 g->unresolved_top_level_decls.put(qualified_name, node);
5087 }5095 }
5088 } else {5096 } else {
5089 resolve_top_level_decl(g, import, node);5097 resolve_top_level_decl(g, import, node);
test/run_tests.cpp+29
...@@ -1549,6 +1549,35 @@ pub fn main(args: [][]u8) -> %void {...@@ -1549,6 +1549,35 @@ pub fn main(args: [][]u8) -> %void {
1549}1549}
15501550
1551 )SOURCE", "OK\n");1551 )SOURCE", "OK\n");
1552
1553
1554 add_simple_case("same named methods in incomplete struct", R"SOURCE(
1555import "std.zig";
1556
1557struct Foo {
1558 field1: Bar,
1559
1560 fn method(a: &Foo) -> bool { true }
1561}
1562
1563struct Bar {
1564 field2: i32,
1565
1566 fn method(b: &Bar) -> bool { true }
1567}
1568
1569pub fn main(args: [][]u8) -> %void {
1570 const bar = Bar {.field2 = 13,};
1571 const foo = Foo {.field1 = bar,};
1572 if (!foo.method()) {
1573 %%stdout.printf("BAD\n");
1574 }
1575 if (!bar.method()) {
1576 %%stdout.printf("BAD\n");
1577 }
1578 %%stdout.printf("OK\n");
1579}
1580 )SOURCE", "OK\n");
1552}1581}
15531582
15541583