forked from M-Labs/nac3
1
0
Fork 0

core/typecheck/typedef: Handle vararg parameters in unify_call

This commit is contained in:
David Mak 2024-07-10 10:29:05 +08:00
parent f240202d6b
commit 0c819b8783
1 changed files with 4 additions and 3 deletions

View File

@ -3,7 +3,7 @@ use itertools::Itertools;
use std::cell::RefCell;
use std::collections::HashMap;
use std::fmt::{self, Display};
use std::iter::zip;
use std::iter::{repeat_with, zip};
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use std::{borrow::Cow, collections::HashSet};
@ -650,6 +650,7 @@ impl Unifier {
// Get details about the function signature/parameters.
let num_params = signature.args.len();
let is_vararg = signature.args.iter().any(|arg| arg.is_vararg);
// Force the type vars in `b` and `signature' to be up-to-date.
let b = self.instantiate_fun(b, signature);
@ -738,7 +739,7 @@ impl Unifier {
};
// Check for "too many arguments"
if num_params < posargs.len() {
if !is_vararg && num_params < posargs.len() {
let expected_min_count =
signature.args.iter().filter(|param| param.is_required()).count();
let expected_max_count = num_params;
@ -762,7 +763,7 @@ impl Unifier {
.collect();
// Now consume all positional arguments and typecheck them.
for (&arg_ty, param) in zip(posargs, signature.args.iter()) {
for (param, &arg_ty) in zip(signature.args.iter().chain(repeat_with(|| signature.args.iter().last().unwrap())), posargs) {
// We will also use this opportunity to mark the corresponding `param_info` as having been supplied.
let param_info = param_info_by_name.get_mut(&param.name).unwrap();
param_info.has_been_supplied = true;