Fix unused variable elimination in for-array statements (fixes #125)

This commit is contained in:
Karol Stasiak 2021-09-13 09:27:34 +02:00
parent 84dde8589c
commit 0c8951d015
2 changed files with 33 additions and 1 deletions

View File

@ -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] = {

View File

@ -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)
}
}