Browse Source

Improve foreign variable fuzzy type checking

gingerBill 1 year ago
parent
commit
3c47503780

+ 2 - 1
base/runtime/os_specific_bsd.odin

@@ -4,9 +4,10 @@ package runtime
 
 foreign import libc "system:c"
 
+@(default_calling_convention="c")
 foreign libc {
 	@(link_name="write")
-	_unix_write :: proc(fd: uintptr, buf: rawptr, size: int) -> int ---
+	_unix_write :: proc(fd: i32, buf: rawptr, size: int) -> int ---
 
 	__error :: proc() -> ^i32 ---
 }

+ 1 - 0
base/runtime/os_specific_darwin.odin

@@ -4,6 +4,7 @@ package runtime
 
 foreign import libc "system:System.framework"
 
+@(default_calling_convention="c")
 foreign libc {
 	@(link_name="__stderrp")
 	_stderr: rawptr

+ 2 - 2
src/check_decl.cpp

@@ -1143,7 +1143,7 @@ gb_internal void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) {
 					      "\tat %s",
 					      LIT(name), token_pos_to_string(pos));
 				}
-			} else if (!are_types_identical(this_type, other_type)) {
+			} else if (!signature_parameter_similar_enough(this_type, other_type)) {
 				error(d->proc_lit,
 				      "Foreign entity '%.*s' previously declared elsewhere with a different type\n"
 				      "\tat %s",
@@ -1284,7 +1284,7 @@ gb_internal void check_global_variable_decl(CheckerContext *ctx, Entity *&e, Ast
 			TokenPos pos = f->token.pos;
 			Type *this_type = base_type(e->type);
 			Type *other_type = base_type(f->type);
-			if (!are_types_identical(this_type, other_type)) {
+			if (!signature_parameter_similar_enough(this_type, other_type)) {
 				error(e->token,
 				      "Foreign entity '%.*s' previously declared elsewhere with a different type\n"
 				      "\tat %s",

+ 1 - 1
src/check_stmt.cpp

@@ -1934,7 +1934,7 @@ gb_internal void check_value_decl_stmt(CheckerContext *ctx, Ast *node, u32 mod_f
 				TokenPos pos = f->token.pos;
 				Type *this_type = base_type(e->type);
 				Type *other_type = base_type(f->type);
-				if (!are_types_identical(this_type, other_type)) {
+				if (!signature_parameter_similar_enough(this_type, other_type)) {
 					error(e->token,
 					      "Foreign entity '%.*s' previously declared elsewhere with a different type\n"
 					      "\tat %s",