mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Merge pull request #4233 from laytan/fix-poly-variadic-reuse-slice
fix reuse of slice for varargs with poly types
This commit is contained in:
+17
-16
@@ -6204,22 +6204,6 @@ gb_internal CallArgumentError check_call_arguments_internal(CheckerContext *c, A
|
|||||||
|
|
||||||
Entity *vt = pt->params->Tuple.variables[pt->variadic_index];
|
Entity *vt = pt->params->Tuple.variables[pt->variadic_index];
|
||||||
o.type = vt->type;
|
o.type = vt->type;
|
||||||
|
|
||||||
// NOTE(bill, 2024-07-14): minimize the stack usage for variadic parameters with the backing array
|
|
||||||
if (c->decl) {
|
|
||||||
bool found = false;
|
|
||||||
for (auto &vr : c->decl->variadic_reuses) {
|
|
||||||
if (are_types_identical(vt->type, vr.slice_type)) {
|
|
||||||
vr.max_count = gb_max(vr.max_count, variadic_operands.count);
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
array_add(&c->decl->variadic_reuses, VariadicReuseData{vt->type, variadic_operands.count});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
dummy_argument_count += 1;
|
dummy_argument_count += 1;
|
||||||
o.type = t_untyped_nil;
|
o.type = t_untyped_nil;
|
||||||
@@ -6413,6 +6397,23 @@ gb_internal CallArgumentError check_call_arguments_internal(CheckerContext *c, A
|
|||||||
}
|
}
|
||||||
score += eval_param_and_score(c, o, t, err, true, var_entity, show_error);
|
score += eval_param_and_score(c, o, t, err, true, var_entity, show_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!vari_expand && variadic_operands.count != 0) {
|
||||||
|
// NOTE(bill, 2024-07-14): minimize the stack usage for variadic parameters with the backing array
|
||||||
|
if (c->decl) {
|
||||||
|
bool found = false;
|
||||||
|
for (auto &vr : c->decl->variadic_reuses) {
|
||||||
|
if (are_types_identical(slice, vr.slice_type)) {
|
||||||
|
vr.max_count = gb_max(vr.max_count, variadic_operands.count);
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
array_add(&c->decl->variadic_reuses, VariadicReuseData{slice, variadic_operands.count});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data) {
|
if (data) {
|
||||||
|
|||||||
Reference in New Issue
Block a user