aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp31
1 files changed, 15 insertions, 16 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index a0e6b33df..5d4d6c73b 100644
--- a/src/check_expr.cpp
+++ b/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");