diff --git a/src/main/wacc/typeChecker.scala b/src/main/wacc/typeChecker.scala index d9ebecc..8c01379 100644 --- a/src/main/wacc/typeChecker.scala +++ b/src/main/wacc/typeChecker.scala @@ -159,17 +159,18 @@ object typeChecker { ctx.typeOf(id).satisfies(constraint, id.pos) case ArrayElem(id, indices) => val arrayTy = ctx.typeOf(id) - val elemTy = indices.foldLeft(arrayTy) { (acc, elem) => + val elemTy = indices.foldLeftM(arrayTy) { (acc, elem) => checkValue(elem, Constraint.Is(KnownType.Int, "array index must be an int")) acc match { - case KnownType.Array(innerTy) => innerTy - case _ => + case KnownType.Array(innerTy) => Some(innerTy) + case nonArrayTy => ctx.error( Error.TypeMismatch(elem.pos, KnownType.Array(?), acc, "cannot index into a non-array") ) + None } } - elemTy.satisfies(constraint, id.pos) + elemTy.getOrElse(?).satisfies(constraint, id.pos) case Parens(expr) => checkValue(expr, constraint) case l @ ArrayLiter(elems) => KnownType