mirror of
https://github.com/odin-lang/Odin.git
synced 2026-04-19 13:00:28 +00:00
Better proc groups inference
This commit is contained in:
@@ -5896,8 +5896,9 @@ gb_internal bool check_unpack_arguments(CheckerContext *ctx, Entity **lhs, isize
|
||||
|
||||
bool allow_ok = (flags & UnpackFlag_AllowOk) != 0;
|
||||
bool allow_undef = (flags & UnpackFlag_AllowUndef) != 0;
|
||||
|
||||
if (variadic_index < 0) {
|
||||
|
||||
bool is_variadic = variadic_index > -1;
|
||||
if (!is_variadic) {
|
||||
variadic_index = lhs_count;
|
||||
}
|
||||
|
||||
@@ -5916,25 +5917,18 @@ gb_internal bool check_unpack_arguments(CheckerContext *ctx, Entity **lhs, isize
|
||||
|
||||
Type *type_hint = nullptr;
|
||||
|
||||
if (lhs != nullptr && tuple_index < variadic_index) {
|
||||
// NOTE(bill): override DeclInfo for dependency
|
||||
Entity *e = lhs[tuple_index];
|
||||
if (e != nullptr) {
|
||||
type_hint = e->type;
|
||||
if (e->flags & EntityFlag_Ellipsis) {
|
||||
GB_ASSERT(is_type_slice(e->type));
|
||||
GB_ASSERT(e->type->kind == Type_Slice);
|
||||
type_hint = e->type->Slice.elem;
|
||||
if (lhs != nullptr) {
|
||||
if (tuple_index < variadic_index) {
|
||||
// NOTE(bill): override DeclInfo for dependency
|
||||
Entity *e = lhs[tuple_index];
|
||||
if (e != nullptr) {
|
||||
type_hint = e->type;
|
||||
}
|
||||
}
|
||||
} else if (lhs != nullptr && tuple_index >= variadic_index) {
|
||||
// NOTE(bill): override DeclInfo for dependency
|
||||
Entity *e = lhs[variadic_index];
|
||||
if (e != nullptr) {
|
||||
type_hint = e->type;
|
||||
if (e->flags & EntityFlag_Ellipsis) {
|
||||
} else if (is_variadic) {
|
||||
Entity *e = lhs[variadic_index];
|
||||
if (e != nullptr) {
|
||||
GB_ASSERT(e->flags & EntityFlag_Ellipsis);
|
||||
GB_ASSERT(is_type_slice(e->type));
|
||||
GB_ASSERT(e->type->kind == Type_Slice);
|
||||
type_hint = e->type->Slice.elem;
|
||||
}
|
||||
}
|
||||
@@ -6822,11 +6816,12 @@ gb_internal CallArgumentData check_call_arguments_proc_group(CheckerContext *c,
|
||||
|
||||
if (procs.count == 1) {
|
||||
Entity *e = procs[0];
|
||||
TypeProc *pt = &base_type(e->type)->Proc;
|
||||
|
||||
lhs = populate_proc_parameter_list(c, e->type, &lhs_count);
|
||||
if (pt->variadic) {
|
||||
variadic_index = pt->variadic_index;
|
||||
Type *pt = base_type(e->type);
|
||||
if (pt != nullptr && is_type_proc(pt)) {
|
||||
lhs = populate_proc_parameter_list(c, pt, &lhs_count);
|
||||
if (pt->Proc.variadic) {
|
||||
variadic_index = pt->Proc.variadic_index;
|
||||
}
|
||||
}
|
||||
check_unpack_arguments(c, lhs, lhs_count, &positional_operands, positional_args, UnpackFlag_None, variadic_index);
|
||||
|
||||
@@ -6888,6 +6883,25 @@ gb_internal CallArgumentData check_call_arguments_proc_group(CheckerContext *c,
|
||||
}
|
||||
lhs[param_index] = e;
|
||||
}
|
||||
|
||||
for (Entity *p : procs) {
|
||||
Type *pt = base_type(p->type);
|
||||
if (!(pt != nullptr && is_type_proc(pt))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pt->Proc.is_polymorphic) {
|
||||
if (variadic_index == -1) {
|
||||
variadic_index = pt->Proc.variadic_index;
|
||||
} else if (variadic_index != pt->Proc.variadic_index) {
|
||||
variadic_index = -1;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
variadic_index = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7330,8 +7344,8 @@ gb_internal CallArgumentData check_call_arguments(CheckerContext *c, Operand *op
|
||||
defer (array_free(&named_operands));
|
||||
|
||||
if (positional_args.count > 0) {
|
||||
isize lhs_count = -1;
|
||||
Entity **lhs = nullptr;
|
||||
isize lhs_count = -1;
|
||||
i32 variadic_index = -1;
|
||||
if (pt != nullptr) {
|
||||
lhs = populate_proc_parameter_list(c, proc_type, &lhs_count);
|
||||
|
||||
Reference in New Issue
Block a user