aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-02-02 20:06:51 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-02-02 20:06:51 -0700
commita50474e7cfc97e404fbb9f3b2f33507afac0ae2b (patch)
tree98af3b194f0db5878febb2a88fcfe952bb0cc356 /src/analyze.cpp
parentd3de73739f88daa05cc7a93f12c262b27a987182 (diff)
downloadzig-a50474e7cfc97e404fbb9f3b2f33507afac0ae2b.tar.gz
zig-a50474e7cfc97e404fbb9f3b2f33507afac0ae2b.zip
fix false positive error with same named methods in incomplete struct
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 1010ff70d7..480f0c7b3a 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -5062,12 +5062,20 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast
case NodeTypeFnProto:
{
// if the name is missing, we immediately announce an error
- Buf *name = &node->data.fn_proto.name;
- if (buf_len(name) == 0) {
+ Buf *fn_name = &node->data.fn_proto.name;
+ if (buf_len(fn_name) == 0) {
node->data.fn_proto.skip = true;
add_node_error(g, node, buf_sprintf("missing function name"));
break;
}
+ Buf *qualified_name;
+ AstNode *struct_node = node->data.fn_proto.struct_node;
+ if (struct_node) {
+ Buf *struct_name = &struct_node->data.struct_decl.name;
+ qualified_name = buf_sprintf("%s.%s", buf_ptr(struct_name), buf_ptr(fn_name));
+ } else {
+ qualified_name = fn_name;
+ }
// 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
collect_expr_decl_deps(g, import, node, decl_node);
- decl_node->name = name;
+ decl_node->name = qualified_name;
decl_node->import = import;
if (decl_node->deps.size() > 0) {
- if (g->unresolved_top_level_decls.maybe_get(name)) {
+ if (g->unresolved_top_level_decls.maybe_get(qualified_name)) {
node->data.fn_proto.skip = true;
- add_node_error(g, node, buf_sprintf("redefinition of '%s'", buf_ptr(name)));
+ add_node_error(g, node, buf_sprintf("redefinition of '%s'", buf_ptr(fn_name)));
} else {
- g->unresolved_top_level_decls.put(name, node);
+ g->unresolved_top_level_decls.put(qualified_name, node);
}
} else {
resolve_top_level_decl(g, import, node);