From 0c8951d0156622c9ff8760fdf5fe7248809821c9 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Mon, 13 Sep 2021 09:27:34 +0200 Subject: [PATCH] Fix unused variable elimination in for-array statements (fixes #125) --- src/main/scala/millfork/node/Node.scala | 2 +- .../scala/millfork/test/ForArraySuite.scala | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/scala/millfork/node/Node.scala b/src/main/scala/millfork/node/Node.scala index ff784d03..776b9326 100644 --- a/src/main/scala/millfork/node/Node.scala +++ b/src/main/scala/millfork/node/Node.scala @@ -813,7 +813,7 @@ case class MemsetStatement(start: Expression, size: Constant, value: Expression, } case class ForEachStatement(variable: String, pointerVariable: Option[String], values: Either[Expression, List[Expression]], body: List[ExecutableStatement]) extends CompoundStatement { - override def getAllExpressions: List[Expression] = VariableExpression(variable) :: (values.fold[List[Expression]](_ => Nil, identity) ++ body.flatMap(_.getAllExpressions)) + override def getAllExpressions: List[Expression] = VariableExpression(variable) :: (pointerVariable.map(VariableExpression).toList ++ values.fold[List[Expression]](List(_), identity) ++ body.flatMap(_.getAllExpressions)) override def getChildStatements: Seq[Statement] = body override def flatMap(f: ExecutableStatement => Option[ExecutableStatement]): Option[ExecutableStatement] = { diff --git a/src/test/scala/millfork/test/ForArraySuite.scala b/src/test/scala/millfork/test/ForArraySuite.scala index 13f2f81e..5c92675c 100644 --- a/src/test/scala/millfork/test/ForArraySuite.scala +++ b/src/test/scala/millfork/test/ForArraySuite.scala @@ -43,4 +43,36 @@ class ForArraySuite extends FunSuite with Matchers { m.readByte(0xc000) should equal(18) } } + + test("Issue #125") { + val src = """ + | byte output @$c000 + | import stdio + | array(byte) data=[1,2,3,4] + | void main(){ + | byte i + | for i:data{ + | output += i + | } + |} + """.stripMargin + val m = EmuOptimizedRun(src) + m.readByte(0xc000) should equal(6) + } + + test("Issue #125 (ver. 2)") { + val src = """ + | byte output @$c000 + | import stdio + | array(byte) data=[1,2,3,4] + | void main(){ + | byte i,v + | for i,v:data{ + | output += v + | } + |} + """.stripMargin + val m = EmuOptimizedRun(src) + m.readByte(0xc000) should equal(10) + } }