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
50625062 case NodeTypeFnProto:
50635063 {
50645064 // if the name is missing, we immediately announce an error
5065 Buf *name = &node->data.fn_proto.name;
5066 if (buf_len(name) == 0) {
5065 Buf *fn_name = &node->data.fn_proto.name;
5066 if (buf_len(fn_name) == 0) {
50675067 node->data.fn_proto.skip = true;
50685068 add_node_error(g, node, buf_sprintf("missing function name"));
50695069 break;
50705070 }
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
50735081 // 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
50765084
50775085 collect_expr_decl_deps(g, import, node, decl_node);
50785086
5079 decl_node->name = name;
5087 decl_node->name = qualified_name;
50805088 decl_node->import = import;
50815089 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)) {
50835091 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)));
50855093 } else {
5086 g->unresolved_top_level_decls.put(name, node);
5094 g->unresolved_top_level_decls.put(qualified_name, node);
50875095 }
50885096 } else {
50895097 resolve_top_level_decl(g, import, node);
test/run_tests.cpp+29
......@@ -1549,6 +1549,35 @@ pub fn main(args: [][]u8) -> %void {
15491549}
15501550
15511551 )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");
15521581}
15531582
15541583