Browse Source

Fix min type info for polymorphic procedures and named types

gingerBill 7 years ago
parent
commit
b027b1d60f
4 changed files with 11 additions and 19 deletions
  1. 2 2
      core/sort/sort.odin
  2. 3 0
      src/check_expr.cpp
  3. 5 5
      src/checker.cpp
  4. 1 12
      src/ir.cpp

+ 2 - 2
core/sort/sort.odin

@@ -69,8 +69,8 @@ quick_sort_proc :: proc(array: $A/[]$T, f: proc(T, T) -> int) {
 		j -= 1;
 	}
 
-	quick_sort(a[0..i], f);
-	quick_sort(a[i..n], f);
+	quick_sort_proc(a[0..i], f);
+	quick_sort_proc(a[i..n], f);
 }
 
 quick_sort :: proc(array: $A/[]$T) {

+ 3 - 0
src/check_expr.cpp

@@ -4709,6 +4709,7 @@ CallArgumentData check_call_arguments(CheckerContext *c, Operand *operand, Type
 			CallArgumentError err = call_checker(c, call, proc_type, e, operands, CallArgumentMode_ShowErrors, &data);
 			Entity *entity_to_use = data.gen_entity != nullptr ? data.gen_entity : e;
 			add_entity_use(c, ident, entity_to_use);
+
 			return data;
 		}
 	} else {
@@ -4719,10 +4720,12 @@ CallArgumentData check_call_arguments(CheckerContext *c, Operand *operand, Type
 		}
 
 		Entity *e = entity_of_ident(ident);
+
 		CallArgumentData data = {};
 		CallArgumentError err = call_checker(c, call, proc_type, e, operands, CallArgumentMode_ShowErrors, &data);
 		Entity *entity_to_use = data.gen_entity != nullptr ? data.gen_entity : e;
 		add_entity_use(c, ident, entity_to_use);
+
 		return data;
 	}
 

+ 5 - 5
src/checker.cpp

@@ -903,7 +903,7 @@ void add_entity_use(CheckerContext *c, AstNode *identifier, Entity *entity) {
 		}
 	}
 	entity->flags |= EntityFlag_Used;
-	add_declaration_dependency(c, entity); // TODO(bill): Should this be here?
+	add_declaration_dependency(c, entity);
 }
 
 
@@ -958,10 +958,11 @@ void add_type_info_type(CheckerContext *c, Type *t) {
 		return;
 	}
 
+	add_type_info_dependency(c->decl, t);
+
 	auto found = map_get(&c->info->type_info_map, hash_type(t));
 	if (found != nullptr) {
 		// Types have already been added
-		add_type_info_dependency(c->decl, t);
 		return;
 	}
 
@@ -987,7 +988,6 @@ void add_type_info_type(CheckerContext *c, Type *t) {
 
 	if (prev) {
 		// NOTE(bill): If a previous one exists already, no need to continue
-		add_type_info_dependency(c->decl, t);
 		return;
 	}
 
@@ -1356,7 +1356,7 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) {
 		Entity *e = c->info.definitions[i];
 		// if (e->scope->is_global && !is_type_poly_proc(e->type)) { // TODO(bill): is the check enough?
 		if (e->scope == universal_scope) { // TODO(bill): is the check enough?
-			if (e->type == nullptr || !is_type_poly_proc(e->type)) {
+			if (e->type == nullptr) {
 				add_dependency_to_set(c, e);
 			}
 		} else if (e->kind == Entity_Procedure && e->Procedure.is_export) {
@@ -3141,6 +3141,7 @@ void check_proc_info(Checker *c, ProcedureInfo pi) {
 	CheckerContext ctx = make_checker_context(c);
 	defer (destroy_checker_context(&ctx));
 	add_curr_ast_file(&ctx, pi.file);
+	ctx.decl = pi.decl;
 
 	TypeProc *pt = &pi.type->Proc;
 	String name = pi.token.string;
@@ -3148,7 +3149,6 @@ void check_proc_info(Checker *c, ProcedureInfo pi) {
 		GB_ASSERT_MSG(pt->is_poly_specialized, "%.*s", LIT(name));
 	}
 
-
 	bool bounds_check    = (pi.tags & ProcTag_bounds_check)    != 0;
 	bool no_bounds_check = (pi.tags & ProcTag_no_bounds_check) != 0;
 

+ 1 - 12
src/ir.cpp

@@ -3592,7 +3592,6 @@ gb_global i32      ir_global_type_info_member_names_index   = 0;
 gb_global i32      ir_global_type_info_member_offsets_index = 0;
 gb_global i32      ir_global_type_info_member_usings_index  = 0;
 
-#if 1
 isize ir_type_info_count(CheckerInfo *info) {
 	return info->minimum_dependency_type_info_set.entries.count+1;
 }
@@ -3610,16 +3609,6 @@ isize ir_type_info_index(CheckerInfo *info, Type *type, bool err_on_not_found=tr
 	}
 	return -1;
 }
-#else
-isize ir_type_info_count(CheckerInfo *info) {
-	return info->type_info_types.count;
-}
-
-isize ir_type_info_index(CheckerInfo *info, Type *type) {
-	isize index = type_info_index(info, type);
-	return index;
-}
-#endif
 
 irValue *ir_type_info(irProcedure *proc, Type *type) {
 	CheckerInfo *info = proc->module->info;
@@ -6205,7 +6194,7 @@ void ir_build_constant_value_decl(irProcedure *proc, AstNodeValueDecl *vd) {
 		if (e->kind == Entity_TypeName) {
 			bool polymorphic_struct = false;
 			if (e->type != nullptr && e->kind == Entity_TypeName) {
-				Type *bt = base_type(e->type);
+			Type *bt = base_type(e->type);
 				if (bt->kind == Type_Struct) {
 					polymorphic_struct = bt->Struct.is_polymorphic;
 				}