Browse Source

Be very particular with the cases for the error notes

gingerBill 1 year ago
parent
commit
f3f08c264f
1 changed files with 15 additions and 16 deletions
  1. 15 16
      src/check_expr.cpp

+ 15 - 16
src/check_expr.cpp

@@ -1193,21 +1193,20 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ
 					Type *y = dst;
 					bool same_inputs  = are_types_identical_internal(x->Proc.params,  y->Proc.params,  false);
 					bool same_outputs = are_types_identical_internal(x->Proc.results, y->Proc.results, false);
-					if (same_inputs && same_outputs) {
-					    	if (x->Proc.calling_convention != y->Proc.calling_convention) {
-					    		gbString s_expected = type_to_string(y);
-					    		gbString s_got = type_to_string(x);
-
-							error_line("\tNote: The calling conventions differ between the procedure signature types\n");
-							error_line("\t      Expected \"%s\", got \"%s\"\n",
-							           proc_calling_convention_strings[y->Proc.calling_convention],
-							           proc_calling_convention_strings[x->Proc.calling_convention]);
-							error_line("\t      Expected: %s\n", s_expected);
-							error_line("\t      Got:      %s\n", s_got);
-							gb_string_free(s_got);
-							gb_string_free(s_expected);
-					    	}
-					} else if (same_inputs) {
+					if (same_inputs && same_outputs &&
+					    x->Proc.calling_convention != y->Proc.calling_convention) {
+				    		gbString s_expected = type_to_string(y);
+				    		gbString s_got = type_to_string(x);
+
+						error_line("\tNote: The calling conventions differ between the procedure signature types\n");
+						error_line("\t      Expected \"%s\", got \"%s\"\n",
+						           proc_calling_convention_strings[y->Proc.calling_convention],
+						           proc_calling_convention_strings[x->Proc.calling_convention]);
+						error_line("\t      Expected: %s\n", s_expected);
+						error_line("\t      Got:      %s\n", s_got);
+						gb_string_free(s_got);
+						gb_string_free(s_expected);
+					} else if (same_inputs && !same_outputs) {
 						gbString s_expected = type_to_string(y->Proc.results);
 						gbString s_got = type_to_string(x->Proc.results);
 						error_line("\tNote: The return types differ between the procedure signature types\n");
@@ -1215,7 +1214,7 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ
 						error_line("\t      Got:      %s\n", s_got);
 						gb_string_free(s_got);
 						gb_string_free(s_expected);
-					} else if (same_outputs) {
+					} else if (!same_inputs && same_outputs) {
 						gbString s_expected = type_to_string(y->Proc.params);
 						gbString s_got = type_to_string(x->Proc.params);
 						error_line("\tNote: The input parameter types differ between the procedure signature types\n");