diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java index e813857f0de..1255b108ef2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java @@ -5,6 +5,7 @@ import org.jetbrains.jet.codegen.ExpressionCodegen; import org.jetbrains.jet.codegen.JetTypeMapper; import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.lang.psi.JetExpression; +import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import org.objectweb.asm.commons.InstructionAdapter; @@ -31,11 +32,11 @@ public class BinaryOp implements IntrinsicMethod { if (receiver != null) { receiver.put(expectedType, v); } - codegen.gen(arguments.get(0), expectedType); + codegen.gen(arguments.get(0), shift() ? Type.INT_TYPE : expectedType); } else { codegen.gen(arguments.get(0), expectedType); - codegen.gen(arguments.get(1), expectedType); + codegen.gen(arguments.get(1), shift() ? Type.INT_TYPE : expectedType); } v.visitInsn(expectedType.getOpcode(opcode)); @@ -44,4 +45,8 @@ public class BinaryOp implements IntrinsicMethod { } return StackValue.onStack(expectedType); } + + private boolean shift() { + return opcode == Opcodes.ISHL || opcode == Opcodes.ISHR || opcode == Opcodes.IUSHR; + } } diff --git a/compiler/testData/codegen/regressions/kt753.jet b/compiler/testData/codegen/regressions/kt753.jet new file mode 100644 index 00000000000..a1b81de8138 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt753.jet @@ -0,0 +1,11 @@ +namespace bitwise_demo + +fun Long?.shl(bits : Int?) : Long = this.sure().shl(bits.sure()) + +fun box() : String { + val x : Long? = 10 + val y : Int? = 12 + + System.out?.println(x.shl(y)) + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java index 30edd4d4a3d..39edddeae2a 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java @@ -317,7 +317,7 @@ public class PrimitiveTypesTest extends CodegenTestCase { public void testKt737() throws Exception { loadText("fun box() = if(3.compareTo(2) != 1) \"fail\" else if(5.byt.compareTo(10.lng) >= 0) \"fail\" else \"OK\""); - System.out.println(generateToText()); +// System.out.println(generateToText()); assertEquals("OK", blackBox()); } @@ -340,6 +340,11 @@ public class PrimitiveTypesTest extends CodegenTestCase { public void testKt752 () { blackBoxFile("regressions/kt752.jet"); - System.out.println(generateToText()); +// System.out.println(generateToText()); + } + + public void testKt753 () { + blackBoxFile("regressions/kt753.jet"); +// System.out.println(generateToText()); } }