mirror of
https://github.com/odin-lang/Odin.git
synced 2026-04-06 06:38:20 +00:00
Ensure checking for proc property equality before checking param assignability
This commit is contained in:
@@ -929,7 +929,7 @@ gb_internal i64 check_distance_between_types(CheckerContext *c, Operand *operand
|
||||
return 4;
|
||||
}
|
||||
|
||||
if (is_type_proc(src) && check_proc_params_assignable(c, dst, src)) {
|
||||
if (is_type_proc(src) && are_proc_properties_identical(dst,src) && check_proc_params_assignable(c, dst, src)) {
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3058,6 +3058,13 @@ gb_internal bool are_types_identical_unique_tuples(Type *x, Type *y) {
|
||||
return are_types_identical_internal(x, y, true);
|
||||
}
|
||||
|
||||
gb_internal bool are_proc_properties_identical(Type *x, Type *y) {
|
||||
return x->Proc.calling_convention == y->Proc.calling_convention &&
|
||||
x->Proc.c_vararg == y->Proc.c_vararg &&
|
||||
x->Proc.variadic == y->Proc.variadic &&
|
||||
x->Proc.diverging == y->Proc.diverging &&
|
||||
x->Proc.optional_ok == y->Proc.optional_ok;
|
||||
}
|
||||
|
||||
gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple_names) {
|
||||
if (x == y) {
|
||||
@@ -3262,11 +3269,7 @@ gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple
|
||||
break;
|
||||
|
||||
case Type_Proc:
|
||||
return x->Proc.calling_convention == y->Proc.calling_convention &&
|
||||
x->Proc.c_vararg == y->Proc.c_vararg &&
|
||||
x->Proc.variadic == y->Proc.variadic &&
|
||||
x->Proc.diverging == y->Proc.diverging &&
|
||||
x->Proc.optional_ok == y->Proc.optional_ok &&
|
||||
return are_proc_properties_identical(x, y) &&
|
||||
are_types_identical_internal(x->Proc.params, y->Proc.params, check_tuple_names) &&
|
||||
are_types_identical_internal(x->Proc.results, y->Proc.results, check_tuple_names);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user