diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index 79c7b058ad3..b8b51544480 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -1064,7 +1064,8 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va when (type) { is LLVMReferenceType -> genReferenceReturn(retVar!!) - is LLVMVoidType -> { + is LLVMVoidType, + is LLVMNullType -> { codeBuilder.addAnyReturn(LLVMVoidType()) } else -> { diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt index 7207507eef3..bfa1e9f4baa 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -22,6 +22,7 @@ class LLVMBuilder(val arm: Boolean = false) { "declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1)", "declare i8* @malloc_static(i32)", "declare i32 @printf(i8*, ...)", + "%class.Nothing = type { }", "declare void @abort()") declares.forEach { globalCode.appendln(it) } @@ -77,8 +78,8 @@ class LLVMBuilder(val arm: Boolean = false) { localCode.appendln("ret ${llvmVariable.type} $llvmVariable") } - fun addAnyReturn(type: LLVMType, value: String = type.defaultValue) { - localCode.appendln("ret $type $value") + fun addAnyReturn(type: LLVMType, value: String = type.defaultValue, pointer: Int = 0) { + localCode.appendln("ret $type${"*".repeat(pointer)} $value") } private fun initializeString(string: String): LLVMVariable { diff --git a/translator/src/test/kotlin/tests/input/nullable_1.txt b/translator/src/test/kotlin/tests/input/nullable_1.txt index 3bab68cb5b7..94d6b6a5c9b 100644 --- a/translator/src/test/kotlin/tests/input/nullable_1.txt +++ b/translator/src/test/kotlin/tests/input/nullable_1.txt @@ -1,3 +1,4 @@ nullable_1_test_Int(1) == 1 nullable_1_test_2_Int(4) == 5 nullable_1_test_2_npe_operator_Int(23) == 578 +nullable_1_test_null_return() == 11 diff --git a/translator/src/test/kotlin/tests/kotlin/nullable_1.kt b/translator/src/test/kotlin/tests/kotlin/nullable_1.kt index f916d101a78..854042d2a9d 100644 --- a/translator/src/test/kotlin/tests/kotlin/nullable_1.kt +++ b/translator/src/test/kotlin/tests/kotlin/nullable_1.kt @@ -18,4 +18,13 @@ fun nullable_1_test_2_npe_operator(i: Int): Int { val x: nullable_1_MyAwesomeClass? = nullable_1_MyAwesomeClass(i) x!! return x.i + 555 +} + +fun nullable_1_test_null_return_slave():nullable_1_MyAwesomeClass?{ + return null +} + +fun nullable_1_test_null_return():Int{ + return 11 + //return if (nullable_1_test_null_return_slave() == null) 11 else -24 } \ No newline at end of file