forked from M-Labs/nac3
core/typecheck/typedef: Handle vararg parameters in unify_call
This commit is contained in:
parent
f240202d6b
commit
0c819b8783
|
@ -3,7 +3,7 @@ use itertools::Itertools;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt::{self, Display};
|
use std::fmt::{self, Display};
|
||||||
use std::iter::zip;
|
use std::iter::{repeat_with, zip};
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::{borrow::Cow, collections::HashSet};
|
use std::{borrow::Cow, collections::HashSet};
|
||||||
|
@ -650,6 +650,7 @@ impl Unifier {
|
||||||
|
|
||||||
// Get details about the function signature/parameters.
|
// Get details about the function signature/parameters.
|
||||||
let num_params = signature.args.len();
|
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.
|
// Force the type vars in `b` and `signature' to be up-to-date.
|
||||||
let b = self.instantiate_fun(b, signature);
|
let b = self.instantiate_fun(b, signature);
|
||||||
|
@ -738,7 +739,7 @@ impl Unifier {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check for "too many arguments"
|
// Check for "too many arguments"
|
||||||
if num_params < posargs.len() {
|
if !is_vararg && num_params < posargs.len() {
|
||||||
let expected_min_count =
|
let expected_min_count =
|
||||||
signature.args.iter().filter(|param| param.is_required()).count();
|
signature.args.iter().filter(|param| param.is_required()).count();
|
||||||
let expected_max_count = num_params;
|
let expected_max_count = num_params;
|
||||||
|
@ -762,7 +763,7 @@ impl Unifier {
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
// Now consume all positional arguments and typecheck them.
|
// 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.
|
// 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(¶m.name).unwrap();
|
let param_info = param_info_by_name.get_mut(¶m.name).unwrap();
|
||||||
param_info.has_been_supplied = true;
|
param_info.has_been_supplied = true;
|
||||||
|
|
Loading…
Reference in New Issue