From 164edd266eac311751174ef5b78d92f26e747858 Mon Sep 17 00:00:00 2001 From: David Nadlinger Date: Fri, 22 Apr 2022 22:28:59 +0100 Subject: [PATCH] core/typecheck: Explicitly give errors on "advanced" (subset) indexing --- nac3core/src/typecheck/type_inferencer/mod.rs | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/nac3core/src/typecheck/type_inferencer/mod.rs b/nac3core/src/typecheck/type_inferencer/mod.rs index db86ccdb..b92dab67 100644 --- a/nac3core/src/typecheck/type_inferencer/mod.rs +++ b/nac3core/src/typecheck/type_inferencer/mod.rs @@ -1181,21 +1181,38 @@ impl<'a> Inferencer<'a> { slice.location, ), TypeEnum::TNDArray { ty: elem_ty, num_dims } => { - let num_idxs = if let TypeEnum::TTuple { ty: idx_tys } = - &*self.unifier.get_ty(slice.custom.unwrap()) - { - for idx_ty in idx_tys.iter() { - self.constrain(*idx_ty, self.primitives.int32, &slice.location)?; + let num_idxs = match &*self.unifier.get_ty(slice.custom.unwrap()) { + TypeEnum::TTuple { ty: idx_tys } => { + for idx_ty in idx_tys.iter() { + // xxx: NumPy supports a tuple of tuples for "advanced indexing" + // of multidimensional arrays (sequence index -> subset). We + // 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 {