From 28354599200a3f546e81b115bde3970b148353bb Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 4 Mar 2015 19:45:49 +0100 Subject: [PATCH] correctly generate 'in' expressions with IntRange on RHS and a type other than Int on LHS --- .../src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java | 5 +++-- .../codegen/boxWithStdlib/ranges/rangeContainsString.kt | 5 +++++ .../generated/BlackBoxWithStdlibCodegenTestGenerated.java | 6 ++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/boxWithStdlib/ranges/rangeContainsString.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 82fc6e8d1b9..ac0fb882654 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2906,7 +2906,8 @@ public class ExpressionCodegen extends JetVisitor implem return generateElvis(expression); } else if (opToken == JetTokens.IN_KEYWORD || opToken == JetTokens.NOT_IN) { - return generateIn(StackValue.expression(Type.INT_TYPE, expression.getLeft(), this), expression.getRight(), reference); + return generateIn(StackValue.expression(expressionType(expression.getLeft()), expression.getLeft(), this), + expression.getRight(), reference); } else { ResolvedCall resolvedCall = getResolvedCallWithAssert(expression, bindingContext); @@ -2935,7 +2936,7 @@ public class ExpressionCodegen extends JetVisitor implem return StackValue.operation(Type.BOOLEAN_TYPE, new Function1() { @Override public Unit invoke(InstructionAdapter v) { - if (isIntRangeExpr(deparenthesized)) { + if (isIntRangeExpr(deparenthesized) && AsmUtil.isIntPrimitive(leftValue.type)) { genInIntRange(leftValue, (JetBinaryExpression) deparenthesized); } else { diff --git a/compiler/testData/codegen/boxWithStdlib/ranges/rangeContainsString.kt b/compiler/testData/codegen/boxWithStdlib/ranges/rangeContainsString.kt new file mode 100644 index 00000000000..8636de58cea --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/ranges/rangeContainsString.kt @@ -0,0 +1,5 @@ +fun IntRange.contains(s: String): Boolean = true + +fun box(): String { + return if ("s" in 0..1) "OK" else "fail" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index b7605408261..3254ed26a82 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -2130,6 +2130,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } + @TestMetadata("rangeContainsString.kt") + public void testRangeContainsString() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/ranges/rangeContainsString.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("compiler/testData/codegen/boxWithStdlib/ranges/expression") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)