Browse Source

Fix aliasing of overloaded procedures from other scopes

Ginger Bill 8 years ago
parent
commit
b5587f1937
2 changed files with 27 additions and 6 deletions
  1. 5 6
      core/_preload.odin
  2. 22 0
      src/check_expr.cpp

+ 5 - 6
core/_preload.odin

@@ -159,8 +159,7 @@ Allocator :: struct #ordered {
 
 
 
 
 Context :: struct #ordered {
 Context :: struct #ordered {
-	thread_guid:  int;
-	thread_index: int;
+	thread_id:  int;
 
 
 	allocator:  Allocator;
 	allocator:  Allocator;
 
 
@@ -256,8 +255,8 @@ __init_context_from_ptr :: proc(c: ^Context, other: ^Context) #cc_contextless {
 	if c.allocator.procedure == nil {
 	if c.allocator.procedure == nil {
 		c.allocator = default_allocator();
 		c.allocator = default_allocator();
 	}
 	}
-	if c.thread_guid == 0 {
-		c.thread_guid = os.current_thread_id();
+	if c.thread_id == 0 {
+		c.thread_id = os.current_thread_id();
 	}
 	}
 }
 }
 
 
@@ -267,8 +266,8 @@ __init_context :: proc(c: ^Context) #cc_contextless {
 	if c.allocator.procedure == nil {
 	if c.allocator.procedure == nil {
 		c.allocator = default_allocator();
 		c.allocator = default_allocator();
 	}
 	}
-	if c.thread_guid == 0 {
-		c.thread_guid = os.current_thread_id();
+	if c.thread_id == 0 {
+		c.thread_id = os.current_thread_id();
 	}
 	}
 }
 }
 
 

+ 22 - 0
src/check_expr.cpp

@@ -4081,6 +4081,13 @@ Entity *check_selector(Checker *c, Operand *operand, AstNode *node, Type *type_h
 		String op_name = op_expr->Ident.token.string;
 		String op_name = op_expr->Ident.token.string;
 		Entity *e = scope_lookup_entity(c->context.scope, op_name);
 		Entity *e = scope_lookup_entity(c->context.scope, op_name);
 
 
+		bool is_alias = false;
+		while (e->kind == Entity_Alias) {
+			GB_ASSERT(e->Alias.base != nullptr);
+			e = e->Alias.base;
+			is_alias = true;
+		}
+
 		add_entity_use(c, op_expr, e);
 		add_entity_use(c, op_expr, e);
 		expr_entity = e;
 		expr_entity = e;
 
 
@@ -4111,9 +4118,24 @@ Entity *check_selector(Checker *c, Operand *operand, AstNode *node, Type *type_h
 				operand->expr = node;
 				operand->expr = node;
 				return nullptr;
 				return nullptr;
 			}
 			}
+
+
+			bool is_alias = false;
+			while (entity->kind == Entity_Alias) {
+				GB_ASSERT(e->Alias.base != nullptr);
+				entity = entity->Alias.base;
+				is_alias = true;
+			}
+
 			check_entity_decl(c, entity, nullptr, nullptr);
 			check_entity_decl(c, entity, nullptr, nullptr);
 			GB_ASSERT(entity->type != nullptr);
 			GB_ASSERT(entity->type != nullptr);
 
 
+			if (is_alias) {
+				// TODO(bill): Which scope do you search for for an alias?
+				// import_scope = entity->scope;
+				entity_name = entity->token.string;
+			}
+
 			isize overload_count = entity_overload_count(import_scope, entity_name);
 			isize overload_count = entity_overload_count(import_scope, entity_name);
 			bool is_overloaded = overload_count > 1;
 			bool is_overloaded = overload_count > 1;