mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-27 11:59:05 +00:00
fix: quantified subroutine subtyping bugs
This commit is contained in:
parent
4dcca2b06d
commit
aa2cea60dd
28 changed files with 638 additions and 222 deletions
|
@ -872,10 +872,14 @@ impl Context {
|
|||
|
||||
fn resolve_params_t(&self, params: &mut hir::Params, qnames: &Set<Str>) -> TyCheckResult<()> {
|
||||
for param in params.non_defaults.iter_mut() {
|
||||
// generalization should work properly for the subroutine type, but may not work for the parameters' own types
|
||||
// HACK: so generalize them manually
|
||||
param.vi.t.generalize();
|
||||
param.vi.t =
|
||||
self.deref_tyvar(mem::take(&mut param.vi.t), Contravariant, qnames, param)?;
|
||||
}
|
||||
if let Some(var_params) = &mut params.var_params {
|
||||
var_params.vi.t.generalize();
|
||||
var_params.vi.t = self.deref_tyvar(
|
||||
mem::take(&mut var_params.vi.t),
|
||||
Contravariant,
|
||||
|
@ -884,6 +888,7 @@ impl Context {
|
|||
)?;
|
||||
}
|
||||
for param in params.defaults.iter_mut() {
|
||||
param.sig.vi.t.generalize();
|
||||
param.sig.vi.t =
|
||||
self.deref_tyvar(mem::take(&mut param.sig.vi.t), Contravariant, qnames, param)?;
|
||||
self.resolve_expr_t(&mut param.default_val)?;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue