diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index 37a2bd6ef6a..0235d143cfa 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -746,11 +746,14 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va KtTokens.LTEQ -> firstOp.type!!.operatorLeq(firstNativeOp, secondNativeOp) KtTokens.GTEQ -> firstOp.type!!.operatorGeq(firstNativeOp, secondNativeOp) KtTokens.EQEQ -> - if (firstOp.type is LLVMReferenceType) + if ((firstOp.type is LLVMReferenceType) && (secondOp.type !is LLVMReferenceType)) firstOp.type!!.operatorEq(firstNativeOp, secondOp) else firstOp.type!!.operatorEq(firstNativeOp, secondNativeOp) + KtTokens.EQEQEQ -> + firstOp.type!!.operatorEq(firstNativeOp, secondNativeOp) KtTokens.EXCLEQ -> firstOp.type!!.operatorNeq(firstNativeOp, secondNativeOp) + KtTokens.EXCLEQEQEQ -> firstOp.type!!.operatorNeq(firstNativeOp, secondNativeOp) KtTokens.EQ -> { if (secondOp.type is LLVMNullType) { val result = codeBuilder.getNewVariable(firstOp.type!!, firstOp.pointer) diff --git a/translator/src/test/kotlin/tests/input/referential_equality_1.txt b/translator/src/test/kotlin/tests/input/referential_equality_1.txt new file mode 100644 index 00000000000..11f8b1d968b --- /dev/null +++ b/translator/src/test/kotlin/tests/input/referential_equality_1.txt @@ -0,0 +1,8 @@ +referential_equality_1_EQEQ_true() == 1 +referential_equality_1_EQEQ_false() == 0 +referential_equality_1_EQEQEQ_true() == 1 +referential_equality_1_EQEQEQ_false() == 0 +referential_equality_1_EXCLEQEQ_true() == 1 +referential_equality_1_EXCLEQEQ_false() == 0 +referential_equality_1_EXCLEQEQEQ_true() == 1 +referential_equality_1_EXCLEQEQEQ_false() == 0 diff --git a/translator/src/test/kotlin/tests/kotlin/referential_equality_1.kt b/translator/src/test/kotlin/tests/kotlin/referential_equality_1.kt new file mode 100644 index 00000000000..987067d3b19 --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/referential_equality_1.kt @@ -0,0 +1,54 @@ +class referential_equality_1 + +fun referential_equality_1_EQEQ_true(): Int { + val instance = referential_equality_1() + var instance2 = referential_equality_1() + instance2 = instance + //problem with boolean in auto generated functions in clang + return if (instance == instance2) 1 else 0 +} + +fun referential_equality_1_EQEQ_false(): Int { + val instance = referential_equality_1() + val instance2 = referential_equality_1() + return if (instance == instance2) 1 else 0 +} + +fun referential_equality_1_EQEQEQ_true(): Int { + val instance = referential_equality_1() + var instance2 = referential_equality_1() + instance2 = instance + return if (instance === instance2) 1 else 0 +} + +fun referential_equality_1_EQEQEQ_false(): Int { + val instance = referential_equality_1() + val instance2 = referential_equality_1() + return if (instance === instance2) 1 else 0 +} + +fun referential_equality_1_EXCLEQEQ_false(): Int { + val instance = referential_equality_1() + var instance2 = referential_equality_1() + instance2 = instance + return if (instance != instance2) 1 else 0 +} + +fun referential_equality_1_EXCLEQEQ_true(): Int { + val instance = referential_equality_1() + val instance2 = referential_equality_1() + return if (instance != instance2) 1 else 0 +} + +fun referential_equality_1_EXCLEQEQEQ_false(): Int { + val instance = referential_equality_1() + var instance2 = referential_equality_1() + instance2 = instance + return if (instance !== instance2) 1 else 0 +} + +fun referential_equality_1_EXCLEQEQEQ_true(): Int { + val instance = referential_equality_1() + val instance2 = referential_equality_1() + return if (instance !== instance2) 1 else 0 +} \ No newline at end of file