diff --git a/compiler/src/prog8/ast/processing/AstChecker.kt b/compiler/src/prog8/ast/processing/AstChecker.kt index 35a2de5d0..c048137f2 100644 --- a/compiler/src/prog8/ast/processing/AstChecker.kt +++ b/compiler/src/prog8/ast/processing/AstChecker.kt @@ -110,9 +110,6 @@ internal class AstChecker(private val program: Program, } override fun visit(forLoop: ForLoop) { - if(forLoop.body.containsNoCodeNorVars()) - errors.warn("for loop body is empty", forLoop.position) - val iterableDt = forLoop.iterable.inferType(program).typeOrElse(DataType.BYTE) if(iterableDt !in IterableDatatypes && forLoop.iterable !is RangeExpr) { errors.err("can only loop over an iterable type", forLoop.position) diff --git a/compiler/src/prog8/optimizer/StatementOptimizer.kt b/compiler/src/prog8/optimizer/StatementOptimizer.kt index 3bc311b1c..fd648c5b1 100644 --- a/compiler/src/prog8/optimizer/StatementOptimizer.kt +++ b/compiler/src/prog8/optimizer/StatementOptimizer.kt @@ -195,7 +195,7 @@ internal class StatementOptimizer(private val program: Program, override fun after(forLoop: ForLoop, parent: Node): Iterable { if(forLoop.body.containsNoCodeNorVars()) { - // remove empty for loop + errors.warn("removing empty for loop", forLoop.position) return listOf(IAstModification.Remove(forLoop, parent)) } else if(forLoop.body.statements.size==1) { val loopvar = forLoop.body.statements[0] as? VarDecl diff --git a/examples/bdmusic.p8 b/examples/bdmusic.p8 index d84d5f6b2..cc688ca86 100644 --- a/examples/bdmusic.p8 +++ b/examples/bdmusic.p8 @@ -37,10 +37,8 @@ sub start() { } sub delay() { - ubyte d - for d in 0 to 12 { - while c64.RASTER!=0 { - ; tempo delay synced to screen refresh + repeat 32 { + while c64.RASTER { } } } diff --git a/examples/fibonacci.p8 b/examples/fibonacci.p8 index d0d27306d..f658106b0 100644 --- a/examples/fibonacci.p8 +++ b/examples/fibonacci.p8 @@ -7,8 +7,7 @@ main { sub start() { c64scr.print("fibonacci sequence\n") - ubyte i - for i in 0 to 20 { + repeat 21 { c64scr.print_uw(fib_next()) c64.CHROUT('\n') } diff --git a/examples/test.p8 b/examples/test.p8 index f866196b5..e7ccfea7f 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -7,64 +7,7 @@ main { - ; TODO check removal of empty loops - - - sub start() { - ubyte i - for i in 1 to 20 { - c64.CHROUT('*') - } - c64.CHROUT('\n') - - i=0 - do { - c64.CHROUT('*') - i++ - } until i==20 - c64.CHROUT('\n') - - repeat { - break - continue - c64.CHROUT('*') - } - c64.CHROUT('\n') - - repeat 0 { - c64.CHROUT('@') - break - continue - } - c64.CHROUT('\n') - - repeat 1 { - c64.CHROUT('1') - continue - break - } - c64.CHROUT('\n') - - repeat 255 { - c64.CHROUT('@') - } - c64.CHROUT('\n') - repeat 256 { - c64.CHROUT('!') - } - c64.CHROUT('\n') - - uword teller - repeat 4000 { - teller++ - } - c64scr.print_uw(teller) - c64.CHROUT('\n') - - - repeat { - } } } diff --git a/examples/turtle-gfx.p8 b/examples/turtle-gfx.p8 index a8cbdfeb9..306080ff6 100644 --- a/examples/turtle-gfx.p8 +++ b/examples/turtle-gfx.p8 @@ -11,12 +11,12 @@ main { graphics.enable_bitmap_mode() turtle.init() - ubyte i - for i in 0 to 255 { + repeat 100 { while c64.RASTER { } } + ubyte i for i in 0 to 100 { turtle.fd(i+20) turtle.rt(94)