diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index 6b79a758d27..5f57df71ad4 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -37,7 +37,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM } if (result.type is LLVMReferenceType) { - codeBuilder.addAnyReturn(LLVMVoidType()) + genReferenceReturn(result) } else { codeBuilder.addReturnOperator(result) } @@ -121,7 +121,12 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM val receiverName = receiverExpr.text val selectorExpr = expr.selectorExpression!! - var receiver = variableManager.getLLVMvalue(receiverName) + var receiver = when (receiverExpr) { + is KtCallExpression, + is KtBinaryExpression -> evaluateExpression(receiverExpr, scopeDepth) as LLVMVariable + else -> variableManager.getLLVMvalue(receiverName) + } + if (receiver != null) { if (receiver.pointer == 2) { receiver = codeBuilder.loadAndGetVariable(receiver) @@ -679,14 +684,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM val type = retVar?.type ?: LLVMVoidType() when (type) { - is LLVMReferenceType -> { - if (retVar!!.pointer == 2) { - retVar = codeBuilder.loadAndGetVariable(retVar as LLVMVariable) - } - - codeBuilder.storeVariable(returnType!!, retVar) - codeBuilder.addAnyReturn(LLVMVoidType()) - } + is LLVMReferenceType -> genReferenceReturn(retVar!!) is LLVMVoidType -> { codeBuilder.addAnyReturn(LLVMVoidType()) } @@ -700,4 +698,14 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM } return null } + + private fun genReferenceReturn(retVar: LLVMSingleValue) { + var result = retVar + if (result.pointer == 2) { + result = codeBuilder.loadAndGetVariable(retVar as LLVMVariable) + } + + codeBuilder.storeVariable(returnType!!, result) + codeBuilder.addAnyReturn(LLVMVoidType()) + } } \ No newline at end of file diff --git a/translator/src/test/kotlin/tests/input/complex_dot_expr.txt b/translator/src/test/kotlin/tests/input/complex_dot_expr.txt new file mode 100644 index 00000000000..680416f84f3 --- /dev/null +++ b/translator/src/test/kotlin/tests/input/complex_dot_expr.txt @@ -0,0 +1,2 @@ +test1_Int(1) == 1 +test2_Int(2) == 2 diff --git a/translator/src/test/kotlin/tests/kotlin/complex_dot_expr.kt b/translator/src/test/kotlin/tests/kotlin/complex_dot_expr.kt new file mode 100644 index 00000000000..9a9606fbc44 --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/complex_dot_expr.kt @@ -0,0 +1,7 @@ + +class MyClass(val i: Int) + +fun gen(i: Int) = MyClass(i) +fun test1(q: Int) = gen(q).i +fun test2(w: Int) = MyClass(w).i +