Compare commits

..

No commits in common. "188208b95935617985e56e8911559dc92a9fc71b" and "c74b7992f65bd0dba820ac6a2d4786a22b8c3b70" have entirely different histories.

3 changed files with 21 additions and 43 deletions

View File

@ -1181,38 +1181,21 @@ impl<'a> Inferencer<'a> {
slice.location, slice.location,
), ),
TypeEnum::TNDArray { ty: elem_ty, num_dims } => { TypeEnum::TNDArray { ty: elem_ty, num_dims } => {
let num_idxs = match &*self.unifier.get_ty(slice.custom.unwrap()) { let num_idxs = if let TypeEnum::TTuple { ty: idx_tys } =
TypeEnum::TTuple { ty: idx_tys } => { &*self.unifier.get_ty(slice.custom.unwrap())
for idx_ty in idx_tys.iter() { {
// xxx: NumPy supports a tuple of tuples for "advanced indexing" for idx_ty in idx_tys.iter() {
// of multidimensional arrays (sequence index -> subset). We self.constrain(*idx_ty, self.primitives.int32, &slice.location)?;
// don't support this, but could give a better error message.
self.constrain(
*idx_ty,
self.primitives.int32,
&slice.location,
)?;
}
idx_tys.len()
}
TypeEnum::TList { .. } | TypeEnum::TNDArray { .. } => {
return report_error(
concat!(
"ndarray index is list/array, but NumPy advanced (subset)",
"indexing is not supported yet"
),
slice.location,
);
}
_ => {
// xxx: Could lead to suboptimal error message, as higher-dimensional indexing is not mentioned?!
self.constrain(
slice.custom.unwrap(),
self.primitives.int32,
&slice.location,
)?;
1
} }
idx_tys.len()
} else {
// xxx: Could lead to suboptimal error message, as higher-dimensional indexing is not mentioned?!
self.constrain(
slice.custom.unwrap(),
self.primitives.int32,
&slice.location,
)?;
1
}; };
if *num_dims < num_idxs { if *num_dims < num_idxs {

View File

@ -518,13 +518,12 @@ 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]"), ("a0", "int32"), ("b", "ndarray[int32, 2]"), [("a", "ndarray[int32, 1]"), ("b", "ndarray[int32, 2]"), ("a0", "int32"), ("b00", "int32"), ("ac", "int32")].iter().cloned().collect(),
("b0", "ndarray[int32, 1]"), ("b00", "int32"), ("ac", "int32")].iter().cloned().collect(),
&[] &[]
; "array test")] ; "array test")]
#[test_case(indoc! {" #[test_case(indoc! {"

View File

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