diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index f90d59c0014..43dc17b02f5 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -20057,6 +20057,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/modifiers/const/constInteraction.kt"); } + @Test + @TestMetadata("enumConstName.kt") + public void testEnumConstName() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/enumConstName.kt"); + } + @Test @TestMetadata("fromJava.kt") public void testFromJava() throws Exception { @@ -20069,6 +20075,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/modifiers/const/fromJavaSubclass.kt"); } + @Test + @TestMetadata("ifConstVal.kt") + public void testIfConstVal() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/ifConstVal.kt"); + } + + @Test + @TestMetadata("kCallable.kt") + public void testKCallable() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kCallable.kt"); + } + @Test @TestMetadata("kt12248.kt") public void testKt12248() throws Exception { @@ -20081,11 +20099,23 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/modifiers/const/kt15913.kt"); } + @Test + @TestMetadata("stdlibConstFun.kt") + public void testStdlibConstFun() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/stdlibConstFun.kt"); + } + @Test @TestMetadata("types.kt") public void testTypes() throws Exception { runTest("compiler/testData/diagnostics/tests/modifiers/const/types.kt"); } + + @Test + @TestMetadata("unsigned.kt") + public void testUnsigned() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/unsigned.kt"); + } } @Nested diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 8f4bc8e2391..2eabb05d90c 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -20110,6 +20110,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti public void testTypes() throws Exception { runTest("compiler/testData/diagnostics/tests/modifiers/const/types.kt"); } + + @Test + @TestMetadata("unsigned.kt") + public void testUnsigned() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/unsigned.kt"); + } } @Nested diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 94bb2e3fb7d..4eaa187b6c0 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -20110,6 +20110,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac public void testTypes() throws Exception { runTest("compiler/testData/diagnostics/tests/modifiers/const/types.kt"); } + + @Test + @TestMetadata("unsigned.kt") + public void testUnsigned() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/unsigned.kt"); + } } @Nested diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java index a367fdd4c1d..33a33d0f1d2 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java @@ -34,6 +34,24 @@ public class LoweredIrInterpreterTestGenerated extends AbstractLoweredIrInterpre KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/ir/loweredIr/interpreter"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("booleanOperations.kt") + public void testBooleanOperations() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/booleanOperations.kt"); + } + + @Test + @TestMetadata("byteOperations.kt") + public void testByteOperations() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/byteOperations.kt"); + } + + @Test + @TestMetadata("charOperations.kt") + public void testCharOperations() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/charOperations.kt"); + } + @Test @TestMetadata("constTrimIndent.kt") public void testConstTrimIndent() throws Exception { @@ -46,18 +64,36 @@ public class LoweredIrInterpreterTestGenerated extends AbstractLoweredIrInterpre runTest("compiler/testData/ir/loweredIr/interpreter/constTrimMargin.kt"); } + @Test + @TestMetadata("doubleOperations.kt") + public void testDoubleOperations() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/doubleOperations.kt"); + } + @Test @TestMetadata("enumName.kt") public void testEnumName() throws Exception { runTest("compiler/testData/ir/loweredIr/interpreter/enumName.kt"); } + @Test + @TestMetadata("floatOperations.kt") + public void testFloatOperations() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/floatOperations.kt"); + } + @Test @TestMetadata("ifConstVal.kt") public void testIfConstVal() throws Exception { runTest("compiler/testData/ir/loweredIr/interpreter/ifConstVal.kt"); } + @Test + @TestMetadata("intOperations.kt") + public void testIntOperations() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/intOperations.kt"); + } + @Test @TestMetadata("kCallableName.kt") public void testKCallableName() throws Exception { @@ -65,9 +101,15 @@ public class LoweredIrInterpreterTestGenerated extends AbstractLoweredIrInterpre } @Test - @TestMetadata("primitiveOperations.kt") - public void testPrimitiveOperations() throws Exception { - runTest("compiler/testData/ir/loweredIr/interpreter/primitiveOperations.kt"); + @TestMetadata("longOperations.kt") + public void testLongOperations() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/longOperations.kt"); + } + + @Test + @TestMetadata("shortOperations.kt") + public void testShortOperations() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/shortOperations.kt"); } @Test @@ -75,5 +117,17 @@ public class LoweredIrInterpreterTestGenerated extends AbstractLoweredIrInterpre public void testStdlibConst() throws Exception { runTest("compiler/testData/ir/loweredIr/interpreter/stdlibConst.kt"); } + + @Test + @TestMetadata("stringOperations.kt") + public void testStringOperations() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/stringOperations.kt"); + } + + @Test + @TestMetadata("unsignedConst.kt") + public void testUnsignedConst() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/unsignedConst.kt"); + } } } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt new file mode 100644 index 00000000000..065962cca4b --- /dev/null +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt @@ -0,0 +1,85 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.common.lower + +import org.jetbrains.kotlin.backend.common.BackendContext +import org.jetbrains.kotlin.backend.common.FileLoweringPass +import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.declarations.IrProperty +import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction +import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl +import org.jetbrains.kotlin.ir.util.isSubclassOf +import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid +import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid +import org.jetbrains.kotlin.name.Name + +val kCallableNamePropertyPhase = makeIrFilePhase( + ::KCallableNamePropertyLowering, + name = "KCallableNameProperty", + description = "Replace name references for callables with constants" +) + +private class KCallableNamePropertyLowering(val context: BackendContext) : FileLoweringPass { + override fun lower(irFile: IrFile) { + irFile.transformChildrenVoid(KCallableNamePropertyTransformer(this)) + } +} + +private class KCallableNamePropertyTransformer(val lower: KCallableNamePropertyLowering) : IrElementTransformerVoid() { + private fun nameForCallableMember(reference: IrCallableReference<*>): Name { + return when (reference) { + is IrFunctionReference -> reference.symbol.owner.name + is IrPropertyReference -> reference.symbol.owner.name + is IrLocalDelegatedPropertyReference -> reference.symbol.owner.name + else -> error("Unexpected callable reference type ${reference.render()}") + } + } + + override fun visitCall(expression: IrCall): IrExpression { + val callableReference = expression.dispatchReceiver as? IrCallableReference<*> + ?: return super.visitCall(expression) + + val directMember = expression.symbol.owner.let { + (it as? IrSimpleFunction)?.correspondingPropertySymbol?.owner ?: it + } + + val irClass = directMember.parent as? IrClass + ?: return super.visitCall(expression) + if (!irClass.isSubclassOf(lower.context.irBuiltIns.kCallableClass.owner)) { + return super.visitCall(expression) + } + + val name = when (directMember) { + is IrSimpleFunction -> directMember.name + is IrProperty -> directMember.name + else -> throw AssertionError("Should be IrSimpleFunction or IrProperty, got $directMember") + } + if (name.asString() != "name") return expression + + val receiver = callableReference.dispatchReceiver ?: callableReference.extensionReceiver + + return IrCompositeImpl(expression.startOffset, expression.endOffset, lower.context.irBuiltIns.stringType).apply { + receiver?.let { + //put receiver for bound callable reference + statements.add(it) + } + + statements.add( + IrConstImpl.string( + expression.startOffset, + expression.endOffset, + lower.context.irBuiltIns.stringType, + nameForCallableMember(callableReference).asString() + ) + ) + } + } +} diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index ef4be53e798..242e9e234f2 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -278,6 +278,7 @@ private val jvmFilePhases = listOf( mainMethodGenerationPhase, inventNamesForLocalClassesPhase, + kCallableNamePropertyPhase, annotationPhase, annotationImplementationPhase, polymorphicSignaturePhase, diff --git a/compiler/testData/codegen/bytecodeListing/callableNameIntrinsic.kt b/compiler/testData/codegen/bytecodeListing/callableNameIntrinsic.kt index 38a313fb58f..c607b5ba4ba 100644 --- a/compiler/testData/codegen/bytecodeListing/callableNameIntrinsic.kt +++ b/compiler/testData/codegen/bytecodeListing/callableNameIntrinsic.kt @@ -7,7 +7,7 @@ class A { val b = A::b.name val c = ::A.name -// val d = this::a.name // Not supported -// val e = A()::b.name // Not supported + val d = this::a.name + val e = A()::b.name } } diff --git a/compiler/testData/diagnostics/tests/modifiers/const/unsigned.kt b/compiler/testData/diagnostics/tests/modifiers/const/unsigned.kt new file mode 100644 index 00000000000..ee27f14d2ee --- /dev/null +++ b/compiler/testData/diagnostics/tests/modifiers/const/unsigned.kt @@ -0,0 +1,72 @@ +// FIR_IDENTICAL +// WITH_STDLIB +const val byteVal: UByte = 1u +const val shortVal: UShort = 2u +const val intVal: UInt = 3u +const val longVal: ULong = 4uL + +const val compareTo1 = byteVal.compareTo(byteVal) +const val compareTo2 = byteVal.compareTo(shortVal) +const val compareTo3 = byteVal.compareTo(intVal) +const val compareTo4 = byteVal.compareTo(longVal) + +const val plus1 = byteVal.plus(byteVal) +const val plus2 = byteVal.plus(shortVal) +const val plus3 = byteVal.plus(intVal) +const val plus4 = byteVal.plus(longVal) + +const val minus1 = byteVal.minus(byteVal) +const val minus2 = byteVal.minus(shortVal) +const val minus3 = byteVal.minus(intVal) +const val minus4 = byteVal.minus(longVal) + +const val times1 = byteVal.times(byteVal) +const val times2 = byteVal.times(shortVal) +const val times3 = byteVal.times(intVal) +const val times4 = byteVal.times(longVal) + +const val div1 = byteVal.div(byteVal) +const val div2 = byteVal.div(shortVal) +const val div3 = byteVal.div(intVal) +const val div4 = byteVal.div(longVal) + +const val rem1 = byteVal.rem(byteVal) +const val rem2 = byteVal.rem(shortVal) +const val rem3 = byteVal.rem(intVal) +const val rem4 = byteVal.rem(longVal) + +const val floorDiv1 = byteVal.floorDiv(byteVal) +const val floorDiv2 = byteVal.floorDiv(shortVal) +const val floorDiv3 = byteVal.floorDiv(intVal) +const val floorDiv4 = byteVal.floorDiv(longVal) + +const val mod1 = byteVal.mod(byteVal) +const val mod2 = byteVal.mod(shortVal) +const val mod3 = byteVal.mod(intVal) +const val mod4 = byteVal.mod(longVal) + +const val and = byteVal.and(byteVal) +const val or = byteVal.or(byteVal) +const val xor = byteVal.xor(byteVal) +const val inv = byteVal.inv() + +const val convert1 = byteVal.toByte() +const val convert2 = byteVal.toShort() +const val convert3 = byteVal.toInt() +const val convert4 = byteVal.toLong() +const val convert5 = byteVal.toFloat() +const val convert6 = byteVal.toDouble() +const val convert7 = byteVal.toUByte() +const val convert8 = byteVal.toUShort() +const val convert9 = byteVal.toUInt() +const val convert10 = byteVal.toULong() + +const val toString1 = byteVal.toString() +const val toString2 = shortVal.toString() +const val toString3 = intVal.toString() +const val toString4 = longVal.toString() + +const val equals1 = byteVal.equals(byteVal) +const val equals2 = byteVal.equals(shortVal) +const val equals3 = byteVal.equals(intVal) +const val equals4 = byteVal.equals(longVal) diff --git a/compiler/testData/diagnostics/tests/modifiers/const/unsigned.txt b/compiler/testData/diagnostics/tests/modifiers/const/unsigned.txt new file mode 100644 index 00000000000..181ec168fae --- /dev/null +++ b/compiler/testData/diagnostics/tests/modifiers/const/unsigned.txt @@ -0,0 +1,61 @@ +package + +public const val and: kotlin.UByte +public const val byteVal: kotlin.UByte = 1.toUByte() +public const val compareTo1: kotlin.Int +public const val compareTo2: kotlin.Int +public const val compareTo3: kotlin.Int +public const val compareTo4: kotlin.Int +public const val convert1: kotlin.Byte +public const val convert10: kotlin.ULong +public const val convert2: kotlin.Short +public const val convert3: kotlin.Int +public const val convert4: kotlin.Long +public const val convert5: kotlin.Float +public const val convert6: kotlin.Double +public const val convert7: kotlin.UByte +public const val convert8: kotlin.UShort +public const val convert9: kotlin.UInt +public const val div1: kotlin.UInt +public const val div2: kotlin.UInt +public const val div3: kotlin.UInt +public const val div4: kotlin.ULong +public const val equals1: kotlin.Boolean +public const val equals2: kotlin.Boolean +public const val equals3: kotlin.Boolean +public const val equals4: kotlin.Boolean +public const val floorDiv1: kotlin.UInt +public const val floorDiv2: kotlin.UInt +public const val floorDiv3: kotlin.UInt +public const val floorDiv4: kotlin.ULong +public const val intVal: kotlin.UInt = 3.toUInt() +public const val inv: kotlin.UByte +public const val longVal: kotlin.ULong = 4.toULong() +public const val minus1: kotlin.UInt +public const val minus2: kotlin.UInt +public const val minus3: kotlin.UInt +public const val minus4: kotlin.ULong +public const val mod1: kotlin.UByte +public const val mod2: kotlin.UShort +public const val mod3: kotlin.UInt +public const val mod4: kotlin.ULong +public const val or: kotlin.UByte +public const val plus1: kotlin.UInt +public const val plus2: kotlin.UInt +public const val plus3: kotlin.UInt +public const val plus4: kotlin.ULong +public const val rem1: kotlin.UInt +public const val rem2: kotlin.UInt +public const val rem3: kotlin.UInt +public const val rem4: kotlin.ULong +public const val shortVal: kotlin.UShort = 2.toUShort() +public const val times1: kotlin.UInt +public const val times2: kotlin.UInt +public const val times3: kotlin.UInt +public const val times4: kotlin.ULong +public const val toString1: kotlin.String +public const val toString2: kotlin.String +public const val toString3: kotlin.String +public const val toString4: kotlin.String +public const val xor: kotlin.UByte + diff --git a/compiler/testData/ir/loweredIr/interpreter/booleanOperations.kt b/compiler/testData/ir/loweredIr/interpreter/booleanOperations.kt new file mode 100644 index 00000000000..54d8237b391 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/booleanOperations.kt @@ -0,0 +1,69 @@ +const val trueVal = true +const val falseVal = false + +const val not1 = trueVal.not() +const val not2 = falseVal.not() + +const val and1 = trueVal.and(trueVal) +const val and2 = trueVal.and(falseVal) +const val and3 = falseVal.and(trueVal) +const val and4 = falseVal.and(falseVal) + +const val or1 = trueVal.or(trueVal) +const val or2 = trueVal.or(falseVal) +const val or3 = falseVal.or(trueVal) +const val or4 = falseVal.or(falseVal) + +const val xor1 = trueVal.xor(trueVal) +const val xor2 = trueVal.xor(falseVal) +const val xor3 = falseVal.xor(trueVal) +const val xor4 = falseVal.xor(falseVal) + +const val compareTo1 = trueVal.compareTo(trueVal) +const val compareTo2 = trueVal.compareTo(falseVal) +const val compareTo3 = falseVal.compareTo(trueVal) +const val compareTo4 = falseVal.compareTo(falseVal) + +const val equals1 = trueVal.equals(trueVal) +const val equals2 = trueVal.equals(falseVal) +const val equals3 = falseVal.equals(trueVal) +const val equals4 = falseVal.equals(falseVal) +const val equals5 = falseVal.equals(1) + +const val toString1 = trueVal.toString() +const val toString2 = falseVal.toString() + +fun box(): String { + if (not1 != false) return "Fail 1.1" + if (not2 != true) return "Fail 1.2" + + if (and1 != true) return "Fail 2.1" + if (and2 != false) return "Fail 2.2" + if (and3 != false) return "Fail 2.3" + if (and4 != false) return "Fail 2.4" + + if (or1 != true) return "Fail 3.1" + if (or2 != true) return "Fail 3.2" + if (or3 != true) return "Fail 3.3" + if (or4 != false) return "Fail 3.4" + + if (xor1 != false) return "Fail 4.1" + if (xor2 != true) return "Fail 4.2" + if (xor3 != true) return "Fail 4.3" + if (xor4 != false) return "Fail 4.4" + + if (compareTo1 != 0) return "Fail 5.1" + if (compareTo2 != 1) return "Fail 5.2" + if (compareTo3 != -1) return "Fail 5.3" + if (compareTo4 != 0) return "Fail 5.4" + + if (equals1 != true) return "Fail 6.1" + if (equals2 != false) return "Fail 6.2" + if (equals3 != false) return "Fail 6.3" + if (equals4 != true) return "Fail 6.4" + if (equals5 != false) return "Fail 6.5" + + if (toString1 != "true") return "Fail 7.1" + if (toString2 != "false") return "Fail 7.2" + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/byteOperations.kt b/compiler/testData/ir/loweredIr/interpreter/byteOperations.kt new file mode 100644 index 00000000000..30993cf58f7 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/byteOperations.kt @@ -0,0 +1,168 @@ +const val minusOneVal = (-1).toByte() +const val oneVal = 1.toByte() +const val twoVal = 2.toByte() +const val threeVal = 3.toByte() +const val fourVal = 4.toByte() + +const val byteVal = 2.toByte() +const val shortVal = 2.toShort() +const val intVal = 2 +const val longVal = 2L +const val floatVal = 2.0f +const val doubleVal = 2.0 + +const val compareTo1 = oneVal.compareTo(twoVal) +const val compareTo2 = twoVal.compareTo(twoVal) +const val compareTo3 = threeVal.compareTo(twoVal) +const val compareTo4 = twoVal.compareTo(shortVal) +const val compareTo5 = twoVal.compareTo(intVal) +const val compareTo6 = twoVal.compareTo(longVal) +const val compareTo7 = twoVal.compareTo(floatVal) +const val compareTo8 = twoVal.compareTo(doubleVal) + +const val plus1 = oneVal.plus(twoVal) +const val plus2 = twoVal.plus(twoVal) +const val plus3 = threeVal.plus(twoVal) +const val plus4 = twoVal.plus(shortVal) +const val plus5 = twoVal.plus(intVal) +const val plus6 = twoVal.plus(longVal) +const val plus7 = twoVal.plus(floatVal) +const val plus8 = twoVal.plus(doubleVal) + +const val minus1 = oneVal.minus(twoVal) +const val minus2 = twoVal.minus(twoVal) +const val minus3 = threeVal.minus(twoVal) +const val minus4 = twoVal.minus(shortVal) +const val minus5 = twoVal.minus(intVal) +const val minus6 = twoVal.minus(longVal) +const val minus7 = twoVal.minus(floatVal) +const val minus8 = twoVal.minus(doubleVal) + +const val times1 = oneVal.times(twoVal) +const val times2 = twoVal.times(twoVal) +const val times3 = threeVal.times(twoVal) +const val times4 = twoVal.times(shortVal) +const val times5 = twoVal.times(intVal) +const val times6 = twoVal.times(longVal) +const val times7 = twoVal.times(floatVal) +const val times8 = twoVal.times(doubleVal) + +const val div1 = oneVal.div(twoVal) +const val div2 = twoVal.div(twoVal) +const val div3 = threeVal.div(twoVal) +const val div4 = twoVal.div(shortVal) +const val div5 = twoVal.div(intVal) +const val div6 = twoVal.div(longVal) +const val div7 = twoVal.div(floatVal) +const val div8 = twoVal.div(doubleVal) + +const val rem1 = oneVal.rem(twoVal) +const val rem2 = twoVal.rem(twoVal) +const val rem3 = threeVal.rem(twoVal) +const val rem4 = twoVal.rem(shortVal) +const val rem5 = twoVal.rem(intVal) +const val rem6 = twoVal.rem(longVal) +const val rem7 = twoVal.rem(floatVal) +const val rem8 = twoVal.rem(doubleVal) + +const val unaryPlus1 = oneVal.unaryPlus() +const val unaryPlus2 = minusOneVal.unaryPlus() +const val unaryMinus1 = oneVal.unaryMinus() +const val unaryMinus2 = minusOneVal.unaryMinus() + +const val convert1 = oneVal.toByte() +const val convert2 = oneVal.toChar() +const val convert3 = oneVal.toShort() +const val convert4 = oneVal.toInt() +const val convert5 = oneVal.toLong() +const val convert6 = oneVal.toFloat() +const val convert7 = oneVal.toDouble() + +const val equals1 = oneVal.equals(twoVal) +const val equals2 = twoVal.equals(twoVal) +const val equals3 = threeVal.equals(twoVal) +const val equals4 = fourVal.equals(twoVal) +const val equals5 = oneVal.equals("1") + +const val toString1 = oneVal.toString() +const val toString2 = twoVal.toString() + +fun box(): String { + if (compareTo1 != -1) return "Fail 1.1" + if (compareTo2 != 0) return "Fail 1.2" + if (compareTo3 != 1) return "Fail 1.3" + if (compareTo4 != 0) return "Fail 1.4" + if (compareTo5 != 0) return "Fail 1.5" + if (compareTo6 != 0) return "Fail 1.6" + if (compareTo7 != 0) return "Fail 1.7" + if (compareTo8 != 0) return "Fail 1.8" + + if (plus1 != 3) return "Fail 2.1" + if (plus2 != 4) return "Fail 2.2" + if (plus3 != 5) return "Fail 2.3" + if (plus4 != 4) return "Fail 2.4" + if (plus5 != 4) return "Fail 2.5" + if (plus6 != 4) return "Fail 2.6" + if (plus7 != 4) return "Fail 2.7" + if (plus8 != 4) return "Fail 2.8" + + if (minus1 != -1) return "Fail 3.1" + if (minus2 != 0) return "Fail 3.2" + if (minus3 != 1) return "Fail 3.3" + if (minus4 != 0) return "Fail 3.4" + if (minus5 != 0) return "Fail 3.5" + if (minus6 != 0) return "Fail 3.6" + if (minus7 != 0.0f) return "Fail 3.7" + if (minus8 != 0.0) return "Fail 3.8" + + if (times1 != 2) return "Fail 4.1" + if (times2 != 4) return "Fail 4.2" + if (times3 != 6) return "Fail 4.3" + if (times4 != 4) return "Fail 4.4" + if (times5 != 4) return "Fail 4.5" + if (times6 != 4) return "Fail 4.6" + if (times7 != 4.0f) return "Fail 4.7" + if (times8 != 4.0) return "Fail 4.8" + + if (div1 != 0) return "Fail 5.1" + if (div2 != 1) return "Fail 5.2" + if (div3 != 1) return "Fail 5.3" + if (div4 != 1) return "Fail 5.4" + if (div5 != 1) return "Fail 5.5" + if (div6 != 1) return "Fail 5.6" + if (div7 != 1.0f) return "Fail 5.7" + if (div8 != 1.0) return "Fail 5.8" + + if (rem1 != 1) return "Fail 6.1" + if (rem2 != 0) return "Fail 6.2" + if (rem3 != 1) return "Fail 6.3" + if (rem4 != 0) return "Fail 6.4" + if (rem5 != 0) return "Fail 6.5" + if (rem6 != 0) return "Fail 6.6" + if (rem7 != 0.0f) return "Fail 6.7" + if (rem8 != 0.0) return "Fail 6.8" + + if (unaryPlus1 != 1) return "Fail 7.1" + if (unaryPlus2 != -1) return "Fail 7.2" + if (unaryMinus1 != -1) return "Fail 7.3" + if (unaryMinus2 != 1) return "Fail 7.4" + + if (convert1 != 1) return "Fail 8.1" + if (convert2 != '') return "Fail 8.2" + if (convert3 != 1) return "Fail 8.3" + if (convert4 != 1) return "Fail 8.4" + if (convert5 != 1) return "Fail 8.5" + if (convert6 != 1.0f) return "Fail 8.6" + if (convert7 != 1.0) return "Fail 8.7" + + if (equals1 != false) return "Fail 9.1" + if (equals2 != true) return "Fail 9.2" + if (equals3 != false) return "Fail 9.3" + if (equals4 != false) return "Fail 9.4" + if (equals5 != false) return "Fail 9.5" + + if (toString1 != "1") return "Fail 10.1" + if (toString2 != "2") return "Fail 10.2" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/charOperations.kt b/compiler/testData/ir/loweredIr/interpreter/charOperations.kt new file mode 100644 index 00000000000..3dfc98bfca5 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/charOperations.kt @@ -0,0 +1,94 @@ +// WITH_STDLIB +const val oneVal = '1' +const val twoVal = '2' +const val threeVal = '3' +const val fourVal = '4' + +const val intVal = 5 + +const val compareTo1 = oneVal.compareTo(twoVal) +const val compareTo2 = twoVal.compareTo(twoVal) +const val compareTo3 = threeVal.compareTo(twoVal) +const val compareTo4 = fourVal.compareTo(twoVal) + +const val plus1 = oneVal.plus(intVal) +const val plus2 = twoVal.plus(intVal) +const val plus3 = threeVal.plus(intVal) +const val plus4 = fourVal.plus(intVal) + +const val minusChar1 = oneVal.minus(twoVal) +const val minusChar2 = twoVal.minus(twoVal) +const val minusChar3 = threeVal.minus(twoVal) +const val minusChar4 = fourVal.minus(twoVal) + +const val minusInt1 = oneVal.minus(intVal) +const val minusInt2 = twoVal.minus(intVal) +const val minusInt3 = threeVal.minus(intVal) +const val minusInt4 = fourVal.minus(intVal) + +const val convert1 = oneVal.toByte() +const val convert2 = oneVal.toChar() +const val convert3 = oneVal.toShort() +const val convert4 = oneVal.toInt() +const val convert5 = oneVal.toLong() +const val convert6 = oneVal.toFloat() +const val convert7 = oneVal.toDouble() + +const val equals1 = oneVal.equals(twoVal) +const val equals2 = twoVal.equals(twoVal) +const val equals3 = threeVal.equals(twoVal) +const val equals4 = fourVal.equals(twoVal) +const val equals5 = oneVal.equals(1) + +const val toString1 = oneVal.toString() +const val toString2 = twoVal.toString() + +const val code1 = oneVal.code +const val code2 = twoVal.code +const val code3 = threeVal.code +const val code4 = fourVal.code + +fun box(): String { + if (compareTo1 != -1) return "Fail 1.1" + if (compareTo2 != 0) return "Fail 1.2" + if (compareTo3 != 1) return "Fail 1.3" + if (compareTo4 != 1) return "Fail 1.4" + + if (plus1 != '6') return "Fail 2.1" + if (plus2 != '7') return "Fail 2.2" + if (plus3 != '8') return "Fail 2.3" + if (plus4 != '9') return "Fail 2.4" + + if (minusChar1 != -1) return "Fail 3.1" + if (minusChar2 != 0) return "Fail 3.2" + if (minusChar3 != 1) return "Fail 3.3" + if (minusChar4 != 2) return "Fail 3.4" + + if (minusInt1 != ',') return "Fail 4.1" + if (minusInt2 != '-') return "Fail 4.2" + if (minusInt3 != '.') return "Fail 4.3" + if (minusInt4 != '/') return "Fail 4.4" + + if (convert1 != 49.toByte()) return "Fail 5.1" + if (convert2 != '1') return "Fail 5.2" + if (convert3 != 49.toShort()) return "Fail 5.3" + if (convert4 != 49) return "Fail 5.4" + if (convert5 != 49L) return "Fail 5.5" + if (convert6 != 49.0f) return "Fail 5.6" + if (convert7 != 49.0) return "Fail 5.7" + + if (equals1 != false) return "Fail 6.1" + if (equals2 != true) return "Fail 6.2" + if (equals3 != false) return "Fail 6.3" + if (equals4 != false) return "Fail 6.4" + if (equals5 != false) return "Fail 6.5" + + if (toString1 != "1") return "Fail 7.1" + if (toString2 != "2") return "Fail 7.2" + + if (code1 != 49) return "Fail 8.1" + if (code2 != 50) return "Fail 8.2" + if (code3 != 51) return "Fail 8.3" + if (code4 != 52) return "Fail 8.4" + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/doubleOperations.kt b/compiler/testData/ir/loweredIr/interpreter/doubleOperations.kt new file mode 100644 index 00000000000..8b43925b820 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/doubleOperations.kt @@ -0,0 +1,164 @@ +const val minusOneVal = -1.0 +const val oneVal = 1.0 +const val twoVal = 2.0 +const val threeVal = 3.0 +const val fourVal = 4.0 + +const val byteVal = 2.toByte() +const val shortVal = 2.toShort() +const val intVal = 2 +const val longVal = 2L +const val floatVal = 2.0f +const val doubleVal = 2.0 + +const val compareTo1 = oneVal.compareTo(twoVal) +const val compareTo2 = twoVal.compareTo(twoVal) +const val compareTo3 = threeVal.compareTo(twoVal) +const val compareTo4 = twoVal.compareTo(byteVal) +const val compareTo5 = twoVal.compareTo(shortVal) +const val compareTo6 = twoVal.compareTo(intVal) +const val compareTo7 = twoVal.compareTo(longVal) +const val compareTo8 = twoVal.compareTo(floatVal) + +const val plus1 = oneVal.plus(twoVal) +const val plus2 = twoVal.plus(twoVal) +const val plus3 = threeVal.plus(twoVal) +const val plus4 = twoVal.plus(byteVal) +const val plus5 = twoVal.plus(shortVal) +const val plus6 = twoVal.plus(intVal) +const val plus7 = twoVal.plus(longVal) +const val plus8 = twoVal.plus(floatVal) + +const val minus1 = oneVal.minus(twoVal) +const val minus2 = twoVal.minus(twoVal) +const val minus3 = threeVal.minus(twoVal) +const val minus4 = twoVal.minus(byteVal) +const val minus5 = twoVal.minus(shortVal) +const val minus6 = twoVal.minus(intVal) +const val minus7 = twoVal.minus(longVal) +const val minus8 = twoVal.minus(floatVal) + +const val times1 = oneVal.times(twoVal) +const val times2 = twoVal.times(twoVal) +const val times3 = threeVal.times(twoVal) +const val times4 = twoVal.times(byteVal) +const val times5 = twoVal.times(shortVal) +const val times6 = twoVal.times(intVal) +const val times7 = twoVal.times(longVal) +const val times8 = twoVal.times(floatVal) + +const val div1 = oneVal.div(twoVal) +const val div2 = twoVal.div(twoVal) +const val div3 = threeVal.div(twoVal) +const val div4 = twoVal.div(byteVal) +const val div5 = twoVal.div(shortVal) +const val div6 = twoVal.div(intVal) +const val div7 = twoVal.div(longVal) +const val div8 = twoVal.div(floatVal) + +const val rem1 = oneVal.rem(twoVal) +const val rem2 = twoVal.rem(twoVal) +const val rem3 = threeVal.rem(twoVal) +const val rem4 = twoVal.rem(byteVal) +const val rem5 = twoVal.rem(shortVal) +const val rem6 = twoVal.rem(intVal) +const val rem7 = twoVal.rem(longVal) +const val rem8 = twoVal.rem(floatVal) + +const val unaryPlus1 = oneVal.unaryPlus() +const val unaryPlus2 = minusOneVal.unaryPlus() +const val unaryMinus1 = oneVal.unaryMinus() +const val unaryMinus2 = minusOneVal.unaryMinus() + +const val convert1 = oneVal.toChar() +const val convert2 = oneVal.toInt() +const val convert3 = oneVal.toLong() +const val convert4 = oneVal.toFloat() +const val convert5 = oneVal.toDouble() + +const val equals1 = oneVal.equals(twoVal) +const val equals2 = twoVal.equals(twoVal) +const val equals3 = threeVal.equals(twoVal) +const val equals4 = fourVal.equals(twoVal) +const val equals5 = oneVal.equals("1") + +const val toString1 = oneVal.toString() +const val toString2 = twoVal.toString() + +fun box(): String { + if (compareTo1 != -1) return "Fail 1.1" + if (compareTo2 != 0) return "Fail 1.2" + if (compareTo3 != 1) return "Fail 1.3" + if (compareTo4 != 0) return "Fail 1.4" + if (compareTo5 != 0) return "Fail 1.5" + if (compareTo6 != 0) return "Fail 1.6" + if (compareTo7 != 0) return "Fail 1.7" + if (compareTo8 != 0) return "Fail 1.8" + + if (plus1 != 3) return "Fail 2.1" + if (plus2 != 4) return "Fail 2.2" + if (plus3 != 5) return "Fail 2.3" + if (plus4 != 4) return "Fail 2.4" + if (plus5 != 4) return "Fail 2.5" + if (plus6 != 4) return "Fail 2.6" + if (plus7 != 4) return "Fail 2.7" + if (plus8 != 4) return "Fail 2.8" + + if (minus1 != -1) return "Fail 3.1" + if (minus2 != 0) return "Fail 3.2" + if (minus3 != 1) return "Fail 3.3" + if (minus4 != 0) return "Fail 3.4" + if (minus5 != 0) return "Fail 3.5" + if (minus6 != 0) return "Fail 3.6" + if (minus7 != 0.0f) return "Fail 3.7" + if (minus8 != 0.0) return "Fail 3.8" + + if (times1 != 2) return "Fail 4.1" + if (times2 != 4) return "Fail 4.2" + if (times3 != 6) return "Fail 4.3" + if (times4 != 4) return "Fail 4.4" + if (times5 != 4) return "Fail 4.5" + if (times6 != 4) return "Fail 4.6" + if (times7 != 4.0f) return "Fail 4.7" + if (times8 != 4.0) return "Fail 4.8" + + if (div1 != 0.5) return "Fail 5.1" + if (div2 != 1.0) return "Fail 5.2" + if (div3 != 1.5) return "Fail 5.3" + if (div4 != 1) return "Fail 5.4" + if (div5 != 1) return "Fail 5.5" + if (div6 != 1) return "Fail 5.6" + if (div7 != 1.0f) return "Fail 5.7" + if (div8 != 1.0) return "Fail 5.8" + + if (rem1 != 1) return "Fail 6.1" + if (rem2 != 0) return "Fail 6.2" + if (rem3 != 1) return "Fail 6.3" + if (rem4 != 0) return "Fail 6.4" + if (rem5 != 0) return "Fail 6.5" + if (rem6 != 0) return "Fail 6.6" + if (rem7 != 0.0f) return "Fail 6.7" + if (rem8 != 0.0) return "Fail 6.8" + + if (unaryPlus1 != 1) return "Fail 7.1" + if (unaryPlus2 != -1) return "Fail 7.2" + if (unaryMinus1 != -1) return "Fail 7.3" + if (unaryMinus2 != 1) return "Fail 7.4" + + if (convert1 != '') return "Fail 8.1" + if (convert2 != 1) return "Fail 8.2" + if (convert3 != 1) return "Fail 8.3" + if (convert4 != 1.0f) return "Fail 8.4" + if (convert5 != 1.0) return "Fail 8.5" + + if (equals1 != false) return "Fail 9.1" + if (equals2 != true) return "Fail 9.2" + if (equals3 != false) return "Fail 9.3" + if (equals4 != false) return "Fail 9.4" + if (equals5 != false) return "Fail 9.5" + + if (toString1 != "1.0") return "Fail 10.1" + if (toString2 != "2.0") return "Fail 10.2" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/floatOperations.kt b/compiler/testData/ir/loweredIr/interpreter/floatOperations.kt new file mode 100644 index 00000000000..cbbb0b66848 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/floatOperations.kt @@ -0,0 +1,164 @@ +const val minusOneVal = -1.0f +const val oneVal = 1.0f +const val twoVal = 2.0f +const val threeVal = 3.0f +const val fourVal = 4.0f + +const val byteVal = 2.toByte() +const val shortVal = 2.toShort() +const val intVal = 2 +const val longVal = 2L +const val floatVal = 2.0f +const val doubleVal = 2.0 + +const val compareTo1 = oneVal.compareTo(twoVal) +const val compareTo2 = twoVal.compareTo(twoVal) +const val compareTo3 = threeVal.compareTo(twoVal) +const val compareTo4 = twoVal.compareTo(byteVal) +const val compareTo5 = twoVal.compareTo(shortVal) +const val compareTo6 = twoVal.compareTo(intVal) +const val compareTo7 = twoVal.compareTo(longVal) +const val compareTo8 = twoVal.compareTo(doubleVal) + +const val plus1 = oneVal.plus(twoVal) +const val plus2 = twoVal.plus(twoVal) +const val plus3 = threeVal.plus(twoVal) +const val plus4 = twoVal.plus(byteVal) +const val plus5 = twoVal.plus(shortVal) +const val plus6 = twoVal.plus(intVal) +const val plus7 = twoVal.plus(longVal) +const val plus8 = twoVal.plus(doubleVal) + +const val minus1 = oneVal.minus(twoVal) +const val minus2 = twoVal.minus(twoVal) +const val minus3 = threeVal.minus(twoVal) +const val minus4 = twoVal.minus(byteVal) +const val minus5 = twoVal.minus(shortVal) +const val minus6 = twoVal.minus(intVal) +const val minus7 = twoVal.minus(longVal) +const val minus8 = twoVal.minus(doubleVal) + +const val times1 = oneVal.times(twoVal) +const val times2 = twoVal.times(twoVal) +const val times3 = threeVal.times(twoVal) +const val times4 = twoVal.times(byteVal) +const val times5 = twoVal.times(shortVal) +const val times6 = twoVal.times(intVal) +const val times7 = twoVal.times(longVal) +const val times8 = twoVal.times(doubleVal) + +const val div1 = oneVal.div(twoVal) +const val div2 = twoVal.div(twoVal) +const val div3 = threeVal.div(twoVal) +const val div4 = twoVal.div(byteVal) +const val div5 = twoVal.div(shortVal) +const val div6 = twoVal.div(intVal) +const val div7 = twoVal.div(longVal) +const val div8 = twoVal.div(doubleVal) + +const val rem1 = oneVal.rem(twoVal) +const val rem2 = twoVal.rem(twoVal) +const val rem3 = threeVal.rem(twoVal) +const val rem4 = twoVal.rem(byteVal) +const val rem5 = twoVal.rem(shortVal) +const val rem6 = twoVal.rem(intVal) +const val rem7 = twoVal.rem(longVal) +const val rem8 = twoVal.rem(doubleVal) + +const val unaryPlus1 = oneVal.unaryPlus() +const val unaryPlus2 = minusOneVal.unaryPlus() +const val unaryMinus1 = oneVal.unaryMinus() +const val unaryMinus2 = minusOneVal.unaryMinus() + +const val convert1 = oneVal.toChar() +const val convert2 = oneVal.toInt() +const val convert3 = oneVal.toLong() +const val convert4 = oneVal.toFloat() +const val convert5 = oneVal.toDouble() + +const val equals1 = oneVal.equals(twoVal) +const val equals2 = twoVal.equals(twoVal) +const val equals3 = threeVal.equals(twoVal) +const val equals4 = fourVal.equals(twoVal) +const val equals5 = oneVal.equals("1") + +const val toString1 = oneVal.toString() +const val toString2 = twoVal.toString() + +fun box(): String { + if (compareTo1 != -1) return "Fail 1.1" + if (compareTo2 != 0) return "Fail 1.2" + if (compareTo3 != 1) return "Fail 1.3" + if (compareTo4 != 0) return "Fail 1.4" + if (compareTo5 != 0) return "Fail 1.5" + if (compareTo6 != 0) return "Fail 1.6" + if (compareTo7 != 0) return "Fail 1.7" + if (compareTo8 != 0) return "Fail 1.8" + + if (plus1 != 3) return "Fail 2.1" + if (plus2 != 4) return "Fail 2.2" + if (plus3 != 5) return "Fail 2.3" + if (plus4 != 4) return "Fail 2.4" + if (plus5 != 4) return "Fail 2.5" + if (plus6 != 4) return "Fail 2.6" + if (plus7 != 4) return "Fail 2.7" + if (plus8 != 4) return "Fail 2.8" + + if (minus1 != -1) return "Fail 3.1" + if (minus2 != 0) return "Fail 3.2" + if (minus3 != 1) return "Fail 3.3" + if (minus4 != 0) return "Fail 3.4" + if (minus5 != 0) return "Fail 3.5" + if (minus6 != 0) return "Fail 3.6" + if (minus7 != 0.0f) return "Fail 3.7" + if (minus8 != 0.0) return "Fail 3.8" + + if (times1 != 2) return "Fail 4.1" + if (times2 != 4) return "Fail 4.2" + if (times3 != 6) return "Fail 4.3" + if (times4 != 4) return "Fail 4.4" + if (times5 != 4) return "Fail 4.5" + if (times6 != 4) return "Fail 4.6" + if (times7 != 4.0f) return "Fail 4.7" + if (times8 != 4.0) return "Fail 4.8" + + if (div1 != 0.5f) return "Fail 5.1" + if (div2 != 1.0f) return "Fail 5.2" + if (div3 != 1.5f) return "Fail 5.3" + if (div4 != 1) return "Fail 5.4" + if (div5 != 1) return "Fail 5.5" + if (div6 != 1) return "Fail 5.6" + if (div7 != 1.0f) return "Fail 5.7" + if (div8 != 1.0) return "Fail 5.8" + + if (rem1 != 1) return "Fail 6.1" + if (rem2 != 0) return "Fail 6.2" + if (rem3 != 1) return "Fail 6.3" + if (rem4 != 0) return "Fail 6.4" + if (rem5 != 0) return "Fail 6.5" + if (rem6 != 0) return "Fail 6.6" + if (rem7 != 0.0f) return "Fail 6.7" + if (rem8 != 0.0) return "Fail 6.8" + + if (unaryPlus1 != 1) return "Fail 7.1" + if (unaryPlus2 != -1) return "Fail 7.2" + if (unaryMinus1 != -1) return "Fail 7.3" + if (unaryMinus2 != 1) return "Fail 7.4" + + if (convert1 != '') return "Fail 8.1" + if (convert2 != 1) return "Fail 8.2" + if (convert3 != 1) return "Fail 8.3" + if (convert4 != 1.0f) return "Fail 8.4" + if (convert5 != 1.0) return "Fail 8.5" + + if (equals1 != false) return "Fail 9.1" + if (equals2 != true) return "Fail 9.2" + if (equals3 != false) return "Fail 9.3" + if (equals4 != false) return "Fail 9.4" + if (equals5 != false) return "Fail 9.5" + + if (toString1 != "1.0") return "Fail 10.1" + if (toString2 != "2.0") return "Fail 10.2" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/intOperations.kt b/compiler/testData/ir/loweredIr/interpreter/intOperations.kt new file mode 100644 index 00000000000..3693dcfef8e --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/intOperations.kt @@ -0,0 +1,168 @@ +const val minusOneVal = -1 +const val oneVal = 1 +const val twoVal = 2 +const val threeVal = 3 +const val fourVal = 4 + +const val byteVal = 2.toByte() +const val shortVal = 2.toShort() +const val intVal = 2 +const val longVal = 2L +const val floatVal = 2.0f +const val doubleVal = 2.0 + +const val compareTo1 = oneVal.compareTo(twoVal) +const val compareTo2 = twoVal.compareTo(twoVal) +const val compareTo3 = threeVal.compareTo(twoVal) +const val compareTo4 = twoVal.compareTo(byteVal) +const val compareTo5 = twoVal.compareTo(shortVal) +const val compareTo6 = twoVal.compareTo(longVal) +const val compareTo7 = twoVal.compareTo(floatVal) +const val compareTo8 = twoVal.compareTo(doubleVal) + +const val plus1 = oneVal.plus(twoVal) +const val plus2 = twoVal.plus(twoVal) +const val plus3 = threeVal.plus(twoVal) +const val plus4 = twoVal.plus(byteVal) +const val plus5 = twoVal.plus(shortVal) +const val plus6 = twoVal.plus(longVal) +const val plus7 = twoVal.plus(floatVal) +const val plus8 = twoVal.plus(doubleVal) + +const val minus1 = oneVal.minus(twoVal) +const val minus2 = twoVal.minus(twoVal) +const val minus3 = threeVal.minus(twoVal) +const val minus4 = twoVal.minus(byteVal) +const val minus5 = twoVal.minus(shortVal) +const val minus6 = twoVal.minus(longVal) +const val minus7 = twoVal.minus(floatVal) +const val minus8 = twoVal.minus(doubleVal) + +const val times1 = oneVal.times(twoVal) +const val times2 = twoVal.times(twoVal) +const val times3 = threeVal.times(twoVal) +const val times4 = twoVal.times(byteVal) +const val times5 = twoVal.times(shortVal) +const val times6 = twoVal.times(longVal) +const val times7 = twoVal.times(floatVal) +const val times8 = twoVal.times(doubleVal) + +const val div1 = oneVal.div(twoVal) +const val div2 = twoVal.div(twoVal) +const val div3 = threeVal.div(twoVal) +const val div4 = twoVal.div(byteVal) +const val div5 = twoVal.div(shortVal) +const val div6 = twoVal.div(longVal) +const val div7 = twoVal.div(floatVal) +const val div8 = twoVal.div(doubleVal) + +const val rem1 = oneVal.rem(twoVal) +const val rem2 = twoVal.rem(twoVal) +const val rem3 = threeVal.rem(twoVal) +const val rem4 = twoVal.rem(byteVal) +const val rem5 = twoVal.rem(shortVal) +const val rem6 = twoVal.rem(longVal) +const val rem7 = twoVal.rem(floatVal) +const val rem8 = twoVal.rem(doubleVal) + +const val unaryPlus1 = oneVal.unaryPlus() +const val unaryPlus2 = minusOneVal.unaryPlus() +const val unaryMinus1 = oneVal.unaryMinus() +const val unaryMinus2 = minusOneVal.unaryMinus() + +const val convert1 = oneVal.toByte() +const val convert2 = oneVal.toChar() +const val convert3 = oneVal.toShort() +const val convert4 = oneVal.toInt() +const val convert5 = oneVal.toLong() +const val convert6 = oneVal.toFloat() +const val convert7 = oneVal.toDouble() + +const val equals1 = oneVal.equals(twoVal) +const val equals2 = twoVal.equals(twoVal) +const val equals3 = threeVal.equals(twoVal) +const val equals4 = fourVal.equals(twoVal) +const val equals5 = oneVal.equals("1") + +const val toString1 = oneVal.toString() +const val toString2 = twoVal.toString() + +fun box(): String { + if (compareTo1 != -1) return "Fail 1.1" + if (compareTo2 != 0) return "Fail 1.2" + if (compareTo3 != 1) return "Fail 1.3" + if (compareTo4 != 0) return "Fail 1.4" + if (compareTo5 != 0) return "Fail 1.5" + if (compareTo6 != 0) return "Fail 1.6" + if (compareTo7 != 0) return "Fail 1.7" + if (compareTo8 != 0) return "Fail 1.8" + + if (plus1 != 3) return "Fail 2.1" + if (plus2 != 4) return "Fail 2.2" + if (plus3 != 5) return "Fail 2.3" + if (plus4 != 4) return "Fail 2.4" + if (plus5 != 4) return "Fail 2.5" + if (plus6 != 4) return "Fail 2.6" + if (plus7 != 4) return "Fail 2.7" + if (plus8 != 4) return "Fail 2.8" + + if (minus1 != -1) return "Fail 3.1" + if (minus2 != 0) return "Fail 3.2" + if (minus3 != 1) return "Fail 3.3" + if (minus4 != 0) return "Fail 3.4" + if (minus5 != 0) return "Fail 3.5" + if (minus6 != 0) return "Fail 3.6" + if (minus7 != 0.0f) return "Fail 3.7" + if (minus8 != 0.0) return "Fail 3.8" + + if (times1 != 2) return "Fail 4.1" + if (times2 != 4) return "Fail 4.2" + if (times3 != 6) return "Fail 4.3" + if (times4 != 4) return "Fail 4.4" + if (times5 != 4) return "Fail 4.5" + if (times6 != 4) return "Fail 4.6" + if (times7 != 4.0f) return "Fail 4.7" + if (times8 != 4.0) return "Fail 4.8" + + if (div1 != 0) return "Fail 5.1" + if (div2 != 1) return "Fail 5.2" + if (div3 != 1) return "Fail 5.3" + if (div4 != 1) return "Fail 5.4" + if (div5 != 1) return "Fail 5.5" + if (div6 != 1) return "Fail 5.6" + if (div7 != 1.0f) return "Fail 5.7" + if (div8 != 1.0) return "Fail 5.8" + + if (rem1 != 1) return "Fail 6.1" + if (rem2 != 0) return "Fail 6.2" + if (rem3 != 1) return "Fail 6.3" + if (rem4 != 0) return "Fail 6.4" + if (rem5 != 0) return "Fail 6.5" + if (rem6 != 0) return "Fail 6.6" + if (rem7 != 0.0f) return "Fail 6.7" + if (rem8 != 0.0) return "Fail 6.8" + + if (unaryPlus1 != 1) return "Fail 7.1" + if (unaryPlus2 != -1) return "Fail 7.2" + if (unaryMinus1 != -1) return "Fail 7.3" + if (unaryMinus2 != 1) return "Fail 7.4" + + if (convert1 != 1) return "Fail 8.1" + if (convert2 != '') return "Fail 8.2" + if (convert3 != 1) return "Fail 8.3" + if (convert4 != 1) return "Fail 8.4" + if (convert5 != 1) return "Fail 8.5" + if (convert6 != 1.0f) return "Fail 8.6" + if (convert7 != 1.0) return "Fail 8.7" + + if (equals1 != false) return "Fail 9.1" + if (equals2 != true) return "Fail 9.2" + if (equals3 != false) return "Fail 9.3" + if (equals4 != false) return "Fail 9.4" + if (equals5 != false) return "Fail 9.5" + + if (toString1 != "1") return "Fail 10.1" + if (toString2 != "2") return "Fail 10.2" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/longOperations.kt b/compiler/testData/ir/loweredIr/interpreter/longOperations.kt new file mode 100644 index 00000000000..c9b80706cf7 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/longOperations.kt @@ -0,0 +1,168 @@ +const val minusOneVal = -1L +const val oneVal = 1L +const val twoVal = 2L +const val threeVal = 3L +const val fourVal = 4L + +const val byteVal = 2.toByte() +const val shortVal = 2.toShort() +const val intVal = 2 +const val longVal = 2L +const val floatVal = 2.0f +const val doubleVal = 2.0 + +const val compareTo1 = oneVal.compareTo(twoVal) +const val compareTo2 = twoVal.compareTo(twoVal) +const val compareTo3 = threeVal.compareTo(twoVal) +const val compareTo4 = twoVal.compareTo(byteVal) +const val compareTo5 = twoVal.compareTo(shortVal) +const val compareTo6 = twoVal.compareTo(intVal) +const val compareTo7 = twoVal.compareTo(floatVal) +const val compareTo8 = twoVal.compareTo(doubleVal) + +const val plus1 = oneVal.plus(twoVal) +const val plus2 = twoVal.plus(twoVal) +const val plus3 = threeVal.plus(twoVal) +const val plus4 = twoVal.plus(byteVal) +const val plus5 = twoVal.plus(shortVal) +const val plus6 = twoVal.plus(intVal) +const val plus7 = twoVal.plus(floatVal) +const val plus8 = twoVal.plus(doubleVal) + +const val minus1 = oneVal.minus(twoVal) +const val minus2 = twoVal.minus(twoVal) +const val minus3 = threeVal.minus(twoVal) +const val minus4 = twoVal.minus(byteVal) +const val minus5 = twoVal.minus(shortVal) +const val minus6 = twoVal.minus(intVal) +const val minus7 = twoVal.minus(floatVal) +const val minus8 = twoVal.minus(doubleVal) + +const val times1 = oneVal.times(twoVal) +const val times2 = twoVal.times(twoVal) +const val times3 = threeVal.times(twoVal) +const val times4 = twoVal.times(byteVal) +const val times5 = twoVal.times(shortVal) +const val times6 = twoVal.times(intVal) +const val times7 = twoVal.times(floatVal) +const val times8 = twoVal.times(doubleVal) + +const val div1 = oneVal.div(twoVal) +const val div2 = twoVal.div(twoVal) +const val div3 = threeVal.div(twoVal) +const val div4 = twoVal.div(byteVal) +const val div5 = twoVal.div(shortVal) +const val div6 = twoVal.div(intVal) +const val div7 = twoVal.div(floatVal) +const val div8 = twoVal.div(doubleVal) + +const val rem1 = oneVal.rem(twoVal) +const val rem2 = twoVal.rem(twoVal) +const val rem3 = threeVal.rem(twoVal) +const val rem4 = twoVal.rem(byteVal) +const val rem5 = twoVal.rem(shortVal) +const val rem6 = twoVal.rem(intVal) +const val rem7 = twoVal.rem(floatVal) +const val rem8 = twoVal.rem(doubleVal) + +const val unaryPlus1 = oneVal.unaryPlus() +const val unaryPlus2 = minusOneVal.unaryPlus() +const val unaryMinus1 = oneVal.unaryMinus() +const val unaryMinus2 = minusOneVal.unaryMinus() + +const val convert1 = oneVal.toByte() +const val convert2 = oneVal.toChar() +const val convert3 = oneVal.toShort() +const val convert4 = oneVal.toInt() +const val convert5 = oneVal.toLong() +const val convert6 = oneVal.toFloat() +const val convert7 = oneVal.toDouble() + +const val equals1 = oneVal.equals(twoVal) +const val equals2 = twoVal.equals(twoVal) +const val equals3 = threeVal.equals(twoVal) +const val equals4 = fourVal.equals(twoVal) +const val equals5 = oneVal.equals("1") + +const val toString1 = oneVal.toString() +const val toString2 = twoVal.toString() + +fun box(): String { + if (compareTo1 != -1) return "Fail 1.1" + if (compareTo2 != 0) return "Fail 1.2" + if (compareTo3 != 1) return "Fail 1.3" + if (compareTo4 != 0) return "Fail 1.4" + if (compareTo5 != 0) return "Fail 1.5" + if (compareTo6 != 0) return "Fail 1.6" + if (compareTo7 != 0) return "Fail 1.7" + if (compareTo8 != 0) return "Fail 1.8" + + if (plus1 != 3) return "Fail 2.1" + if (plus2 != 4) return "Fail 2.2" + if (plus3 != 5) return "Fail 2.3" + if (plus4 != 4) return "Fail 2.4" + if (plus5 != 4) return "Fail 2.5" + if (plus6 != 4) return "Fail 2.6" + if (plus7 != 4) return "Fail 2.7" + if (plus8 != 4) return "Fail 2.8" + + if (minus1 != -1) return "Fail 3.1" + if (minus2 != 0) return "Fail 3.2" + if (minus3 != 1) return "Fail 3.3" + if (minus4 != 0) return "Fail 3.4" + if (minus5 != 0) return "Fail 3.5" + if (minus6 != 0) return "Fail 3.6" + if (minus7 != 0.0f) return "Fail 3.7" + if (minus8 != 0.0) return "Fail 3.8" + + if (times1 != 2) return "Fail 4.1" + if (times2 != 4) return "Fail 4.2" + if (times3 != 6) return "Fail 4.3" + if (times4 != 4) return "Fail 4.4" + if (times5 != 4) return "Fail 4.5" + if (times6 != 4) return "Fail 4.6" + if (times7 != 4.0f) return "Fail 4.7" + if (times8 != 4.0) return "Fail 4.8" + + if (div1 != 0) return "Fail 5.1" + if (div2 != 1) return "Fail 5.2" + if (div3 != 1) return "Fail 5.3" + if (div4 != 1) return "Fail 5.4" + if (div5 != 1) return "Fail 5.5" + if (div6 != 1) return "Fail 5.6" + if (div7 != 1.0f) return "Fail 5.7" + if (div8 != 1.0) return "Fail 5.8" + + if (rem1 != 1) return "Fail 6.1" + if (rem2 != 0) return "Fail 6.2" + if (rem3 != 1) return "Fail 6.3" + if (rem4 != 0) return "Fail 6.4" + if (rem5 != 0) return "Fail 6.5" + if (rem6 != 0) return "Fail 6.6" + if (rem7 != 0.0f) return "Fail 6.7" + if (rem8 != 0.0) return "Fail 6.8" + + if (unaryPlus1 != 1) return "Fail 7.1" + if (unaryPlus2 != -1) return "Fail 7.2" + if (unaryMinus1 != -1) return "Fail 7.3" + if (unaryMinus2 != 1) return "Fail 7.4" + + if (convert1 != 1) return "Fail 8.1" + if (convert2 != '') return "Fail 8.2" + if (convert3 != 1) return "Fail 8.3" + if (convert4 != 1) return "Fail 8.4" + if (convert5 != 1) return "Fail 8.5" + if (convert6 != 1.0f) return "Fail 8.6" + if (convert7 != 1.0) return "Fail 8.7" + + if (equals1 != false) return "Fail 9.1" + if (equals2 != true) return "Fail 9.2" + if (equals3 != false) return "Fail 9.3" + if (equals4 != false) return "Fail 9.4" + if (equals5 != false) return "Fail 9.5" + + if (toString1 != "1") return "Fail 10.1" + if (toString2 != "2") return "Fail 10.2" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/primitiveOperations.kt b/compiler/testData/ir/loweredIr/interpreter/primitiveOperations.kt deleted file mode 100644 index 7b388da51e2..00000000000 --- a/compiler/testData/ir/loweredIr/interpreter/primitiveOperations.kt +++ /dev/null @@ -1,36 +0,0 @@ -const val add = 1 + 2 + 3 + 4 -const val concat = "1" + 2 + 3 + 4 -const val divide = 1 / 2.0 -const val mul = 10 * 100L - -const val toString1 = 1.toString() -const val toString2 = "2".toString() -const val toString3 = '3'.toString() -const val toString4 = 4L.toString() -const val toString5 = 5.0.toString() - -const val equals1 = "1" == toString1 -const val equals2 = "4" == toString4 -const val equals3 = "5.0" == toString5 -const val equals4 = mul == 100L -const val equals5 = divide == 0.5 - -fun box(): String { - if (add != 10) return "Fail 1" - if (concat != "1234") return "Fail 2" - if (divide != 0.5) return "Fail 3" - if (mul != 1000L) return "Fail 4" - - if (toString1 != "1") return "Fail 5" - if (toString2 != "2") return "Fail 6" - if (toString3 != "3") return "Fail 7" - if (toString4 != "4") return "Fail 8" - if (toString5 != "5.0") return "Fail 9" - - if (equals1 != true) return "Fail 10" - if (equals2 != true) return "Fail 11" - if (equals3 != true) return "Fail 12" - if (equals4 != false) return "Fail 13" - if (equals5 != true) return "Fail 14" - return "OK" -} \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/shortOperations.kt b/compiler/testData/ir/loweredIr/interpreter/shortOperations.kt new file mode 100644 index 00000000000..d8c037dab4b --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/shortOperations.kt @@ -0,0 +1,168 @@ +const val minusOneVal = (-1).toShort() +const val oneVal = 1.toShort() +const val twoVal = 2.toShort() +const val threeVal = 3.toShort() +const val fourVal = 4.toShort() + +const val byteVal = 2.toByte() +const val shortVal = 2.toShort() +const val intVal = 2 +const val longVal = 2L +const val floatVal = 2.0f +const val doubleVal = 2.0 + +const val compareTo1 = oneVal.compareTo(twoVal) +const val compareTo2 = twoVal.compareTo(twoVal) +const val compareTo3 = threeVal.compareTo(twoVal) +const val compareTo4 = twoVal.compareTo(byteVal) +const val compareTo5 = twoVal.compareTo(intVal) +const val compareTo6 = twoVal.compareTo(longVal) +const val compareTo7 = twoVal.compareTo(floatVal) +const val compareTo8 = twoVal.compareTo(doubleVal) + +const val plus1 = oneVal.plus(twoVal) +const val plus2 = twoVal.plus(twoVal) +const val plus3 = threeVal.plus(twoVal) +const val plus4 = twoVal.plus(byteVal) +const val plus5 = twoVal.plus(intVal) +const val plus6 = twoVal.plus(longVal) +const val plus7 = twoVal.plus(floatVal) +const val plus8 = twoVal.plus(doubleVal) + +const val minus1 = oneVal.minus(twoVal) +const val minus2 = twoVal.minus(twoVal) +const val minus3 = threeVal.minus(twoVal) +const val minus4 = twoVal.minus(byteVal) +const val minus5 = twoVal.minus(intVal) +const val minus6 = twoVal.minus(longVal) +const val minus7 = twoVal.minus(floatVal) +const val minus8 = twoVal.minus(doubleVal) + +const val times1 = oneVal.times(twoVal) +const val times2 = twoVal.times(twoVal) +const val times3 = threeVal.times(twoVal) +const val times4 = twoVal.times(byteVal) +const val times5 = twoVal.times(intVal) +const val times6 = twoVal.times(longVal) +const val times7 = twoVal.times(floatVal) +const val times8 = twoVal.times(doubleVal) + +const val div1 = oneVal.div(twoVal) +const val div2 = twoVal.div(twoVal) +const val div3 = threeVal.div(twoVal) +const val div4 = twoVal.div(byteVal) +const val div5 = twoVal.div(intVal) +const val div6 = twoVal.div(longVal) +const val div7 = twoVal.div(floatVal) +const val div8 = twoVal.div(doubleVal) + +const val rem1 = oneVal.rem(twoVal) +const val rem2 = twoVal.rem(twoVal) +const val rem3 = threeVal.rem(twoVal) +const val rem4 = twoVal.rem(byteVal) +const val rem5 = twoVal.rem(intVal) +const val rem6 = twoVal.rem(longVal) +const val rem7 = twoVal.rem(floatVal) +const val rem8 = twoVal.rem(doubleVal) + +const val unaryPlus1 = oneVal.unaryPlus() +const val unaryPlus2 = minusOneVal.unaryPlus() +const val unaryMinus1 = oneVal.unaryMinus() +const val unaryMinus2 = minusOneVal.unaryMinus() + +const val convert1 = oneVal.toByte() +const val convert2 = oneVal.toChar() +const val convert3 = oneVal.toShort() +const val convert4 = oneVal.toInt() +const val convert5 = oneVal.toLong() +const val convert6 = oneVal.toFloat() +const val convert7 = oneVal.toDouble() + +const val equals1 = oneVal.equals(twoVal) +const val equals2 = twoVal.equals(twoVal) +const val equals3 = threeVal.equals(twoVal) +const val equals4 = fourVal.equals(twoVal) +const val equals5 = oneVal.equals("1") + +const val toString1 = oneVal.toString() +const val toString2 = twoVal.toString() + +fun box(): String { + if (compareTo1 != -1) return "Fail 1.1" + if (compareTo2 != 0) return "Fail 1.2" + if (compareTo3 != 1) return "Fail 1.3" + if (compareTo4 != 0) return "Fail 1.4" + if (compareTo5 != 0) return "Fail 1.5" + if (compareTo6 != 0) return "Fail 1.6" + if (compareTo7 != 0) return "Fail 1.7" + if (compareTo8 != 0) return "Fail 1.8" + + if (plus1 != 3) return "Fail 2.1" + if (plus2 != 4) return "Fail 2.2" + if (plus3 != 5) return "Fail 2.3" + if (plus4 != 4) return "Fail 2.4" + if (plus5 != 4) return "Fail 2.5" + if (plus6 != 4) return "Fail 2.6" + if (plus7 != 4) return "Fail 2.7" + if (plus8 != 4) return "Fail 2.8" + + if (minus1 != -1) return "Fail 3.1" + if (minus2 != 0) return "Fail 3.2" + if (minus3 != 1) return "Fail 3.3" + if (minus4 != 0) return "Fail 3.4" + if (minus5 != 0) return "Fail 3.5" + if (minus6 != 0) return "Fail 3.6" + if (minus7 != 0.0f) return "Fail 3.7" + if (minus8 != 0.0) return "Fail 3.8" + + if (times1 != 2) return "Fail 4.1" + if (times2 != 4) return "Fail 4.2" + if (times3 != 6) return "Fail 4.3" + if (times4 != 4) return "Fail 4.4" + if (times5 != 4) return "Fail 4.5" + if (times6 != 4) return "Fail 4.6" + if (times7 != 4.0f) return "Fail 4.7" + if (times8 != 4.0) return "Fail 4.8" + + if (div1 != 0) return "Fail 5.1" + if (div2 != 1) return "Fail 5.2" + if (div3 != 1) return "Fail 5.3" + if (div4 != 1) return "Fail 5.4" + if (div5 != 1) return "Fail 5.5" + if (div6 != 1) return "Fail 5.6" + if (div7 != 1.0f) return "Fail 5.7" + if (div8 != 1.0) return "Fail 5.8" + + if (rem1 != 1) return "Fail 6.1" + if (rem2 != 0) return "Fail 6.2" + if (rem3 != 1) return "Fail 6.3" + if (rem4 != 0) return "Fail 6.4" + if (rem5 != 0) return "Fail 6.5" + if (rem6 != 0) return "Fail 6.6" + if (rem7 != 0.0f) return "Fail 6.7" + if (rem8 != 0.0) return "Fail 6.8" + + if (unaryPlus1 != 1) return "Fail 7.1" + if (unaryPlus2 != -1) return "Fail 7.2" + if (unaryMinus1 != -1) return "Fail 7.3" + if (unaryMinus2 != 1) return "Fail 7.4" + + if (convert1 != 1) return "Fail 8.1" + if (convert2 != '') return "Fail 8.2" + if (convert3 != 1) return "Fail 8.3" + if (convert4 != 1) return "Fail 8.4" + if (convert5 != 1) return "Fail 8.5" + if (convert6 != 1.0f) return "Fail 8.6" + if (convert7 != 1.0) return "Fail 8.7" + + if (equals1 != false) return "Fail 9.1" + if (equals2 != true) return "Fail 9.2" + if (equals3 != false) return "Fail 9.3" + if (equals4 != false) return "Fail 9.4" + if (equals5 != false) return "Fail 9.5" + + if (toString1 != "1") return "Fail 10.1" + if (toString2 != "2") return "Fail 10.2" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/stringOperations.kt b/compiler/testData/ir/loweredIr/interpreter/stringOperations.kt new file mode 100644 index 00000000000..471ca1b1bd9 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/stringOperations.kt @@ -0,0 +1,49 @@ +const val someStr = "123" +const val otherStr = "other" + +const val oneVal = 1 + +const val plus1 = someStr.plus(otherStr) +const val plus2 = someStr.plus(oneVal) + +const val length1 = someStr.length +const val length2 = otherStr.length + +const val get1 = someStr.get(0) +const val get2 = otherStr.get(oneVal) + +const val compareTo1 = someStr.compareTo("123") +const val compareTo2 = someStr.compareTo(otherStr) +const val compareTo3 = otherStr.compareTo(someStr) + +const val equals1 = someStr.equals("123") +const val equals2 = someStr.equals(otherStr) +const val equals3 = otherStr.equals(someStr) +const val equals4 = someStr.equals(oneVal) +const val equals5 = someStr.equals(1) + +const val toString1 = someStr.toString() + +fun box(): String { + if (plus1 != "123other") return "Fail 1.1" + if (plus2 != "1231") return "Fail 1.2" + + if (length1 != 3) return "Fail 2.1" + if (length2 != 5) return "Fail 2.2" + + if (get1 != '1') return "Fail 3.1" + if (get2 != 't') return "Fail 3.2" + + if (compareTo1 != 0) return "Fail 4.1" + if (compareTo2 >= 0) return "Fail 4.2" + if (compareTo3 <= 0) return "Fail 4.3" + + if (equals1 != true) return "Fail 5.1" + if (equals2 != false) return "Fail 5.2" + if (equals3 != false) return "Fail 5.3" + if (equals4 != false) return "Fail 5.4" + if (equals5 != false) return "Fail 5.5" + + if (toString1 != "123") return "Fail 6.1" + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/unsignedConst.kt b/compiler/testData/ir/loweredIr/interpreter/unsignedConst.kt new file mode 100644 index 00000000000..820abb98d2e --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/unsignedConst.kt @@ -0,0 +1,13 @@ +// WITH_STDLIB +const val byteVal: UByte = 1u +const val shortVal: UShort = 2u +const val intVal: UInt = 3u +const val longVal: ULong = 4uL + +fun box(): String { + if (byteVal != 1u.toUByte()) return "Fail 1" + if (shortVal != 2u.toUShort()) return "Fail 2" + if (intVal != 3u.toUInt()) return "Fail 3" + if (longVal != 4u.toULong()) return "Fail 4" + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 1e998d4bf2b..f4776eafbc5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -20116,6 +20116,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { public void testTypes() throws Exception { runTest("compiler/testData/diagnostics/tests/modifiers/const/types.kt"); } + + @Test + @TestMetadata("unsigned.kt") + public void testUnsigned() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/unsigned.kt"); + } } @Nested