core/typecheck: Implement unification for scalar indexing of ndarrays

This commit is contained in:
David Nadlinger 2022-04-22 22:46:24 +01:00
parent 164edd266e
commit 188208b959
2 changed files with 12 additions and 7 deletions

View File

@ -518,12 +518,13 @@ impl TestEnvironment {
a = array([1, 2]) a = array([1, 2])
a0 = a[0] a0 = a[0]
b = array([[1, 2], [3, 4]]) b = array([[1, 2], [3, 4]])
# b0 = b[0] b0 = b[0]
b00 = b[0, 0] b00 = b[0, 0]
c = 1 c = 1
ac = a[c] ac = a[c]
"}, "},
[("a", "ndarray[int32, 1]"), ("b", "ndarray[int32, 2]"), ("a0", "int32"), ("b00", "int32"), ("ac", "int32")].iter().cloned().collect(), [("a", "ndarray[int32, 1]"), ("a0", "int32"), ("b", "ndarray[int32, 2]"),
("b0", "ndarray[int32, 1]"), ("b00", "int32"), ("ac", "int32")].iter().cloned().collect(),
&[] &[]
; "array test")] ; "array test")]
#[test_case(indoc! {" #[test_case(indoc! {"

View File

@ -662,13 +662,17 @@ impl Unifier {
for (k, v) in fields.iter() { for (k, v) in fields.iter() {
match *k { match *k {
RecordKey::Int(_) => { RecordKey::Int(_) => {
if *num_dims > 1 { // .<n> is generated during generic scalar indexing lowering.
unreachable!("xxx implement unification for scalar indexing of multidimensional array"); let indexed_ty = if *num_dims == 1 {
} *ty
self.unify_impl(v.ty, *ty, false).map_err(|e| e.at(v.loc))? } else {
self.add_ty(TNDArray { ty: *ty, num_dims: *num_dims - 1 })
};
self.unify_impl(v.ty, indexed_ty, false).map_err(|e| e.at(v.loc))?
} }
RecordKey::Str(_) => { RecordKey::Str(_) => {
return Err(TypeError::new(TypeErrorKind::NoSuchField(*k, b), v.loc)) // xxx: Implement .shape here?
return Err(TypeError::new(TypeErrorKind::NoSuchField(*k, b), v.loc));
} }
} }
} }