'while' and 'do-while' loop generator fixes.
Generate 'do-while' loop body as IrComposite, because variables declared in loop body should be visible in loop condition. Wrap 'do-while' loop in IrBlock so that variables declared in loop body are not visible outside of the loop. Generate 'while' and 'do-while' loops as expressions of type Unit.
This commit is contained in:
+15
-15
@@ -12,21 +12,21 @@ FILE /coercionInLoop.kt
|
||||
WHILE label=null origin=WHILE_LOOP
|
||||
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=null
|
||||
$this: GET_VAR 'x: DoubleIterator' type=kotlin.collections.DoubleIterator origin=null
|
||||
body: TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||
BLOCK type=kotlin.Int origin=null
|
||||
WHEN type=kotlin.Unit origin=null
|
||||
BRANCH
|
||||
if: CALL 'NOT(Boolean): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||
arg0: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||
arg0: CALL 'get(Int): Double' type=kotlin.Double origin=GET_ARRAY_ELEMENT
|
||||
$this: GET_VAR 'a: DoubleArray' type=kotlin.DoubleArray origin=null
|
||||
index: GET_VAR 'i: Int' type=kotlin.Int origin=null
|
||||
arg1: CALL 'next(): Double' type=kotlin.Double origin=null
|
||||
$this: GET_VAR 'x: DoubleIterator' type=kotlin.collections.DoubleIterator origin=null
|
||||
then: RETURN type=kotlin.Nothing from='box(): String'
|
||||
STRING_CONCATENATION type=kotlin.String
|
||||
CONST String type=kotlin.String value='Fail '
|
||||
GET_VAR 'i: Int' type=kotlin.Int origin=null
|
||||
body: BLOCK type=kotlin.Unit origin=null
|
||||
WHEN type=kotlin.Unit origin=null
|
||||
BRANCH
|
||||
if: CALL 'NOT(Boolean): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||
arg0: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||
arg0: CALL 'get(Int): Double' type=kotlin.Double origin=GET_ARRAY_ELEMENT
|
||||
$this: GET_VAR 'a: DoubleArray' type=kotlin.DoubleArray origin=null
|
||||
index: GET_VAR 'i: Int' type=kotlin.Int origin=null
|
||||
arg1: CALL 'next(): Double' type=kotlin.Double origin=null
|
||||
$this: GET_VAR 'x: DoubleIterator' type=kotlin.collections.DoubleIterator origin=null
|
||||
then: RETURN type=kotlin.Nothing from='box(): String'
|
||||
STRING_CONCATENATION type=kotlin.String
|
||||
CONST String type=kotlin.String value='Fail '
|
||||
GET_VAR 'i: Int' type=kotlin.Int origin=null
|
||||
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||
BLOCK type=kotlin.Int origin=POSTFIX_INCR
|
||||
VAR IR_TEMPORARY_VARIABLE val tmp0: kotlin.Int
|
||||
GET_VAR 'i: Int' type=kotlin.Int origin=POSTFIX_INCR
|
||||
|
||||
Reference in New Issue
Block a user