From e96cf045ddba580fb5e5e9c997b5153bfbf76468 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 27 May 2013 14:38:05 +0400 Subject: [PATCH] KT-3652: Char is converted to Int when used inside string interpolation #KT-3652 Fixed --- .../backend/src/org/jetbrains/jet/codegen/AsmUtil.java | 4 ++-- .../src/org/jetbrains/jet/codegen/ExpressionCodegen.java | 3 ++- .../org/jetbrains/jet/codegen/intrinsics/ToString.java | 2 +- compiler/testData/codegen/box/strings/kt3652.kt | 9 +++++++++ .../codegen/generated/BlackBoxCodegenTestGenerated.java | 9 +++++++-- 5 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/box/strings/kt3652.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java index 76d717a323b..8a818ac3f6d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java @@ -354,8 +354,8 @@ public class AsmUtil { v.invokevirtual("java/lang/StringBuilder", "append", "(" + type.getDescriptor() + ")Ljava/lang/StringBuilder;"); } - public static StackValue genToString(InstructionAdapter v, StackValue receiver) { - Type type = stringValueOfOrStringBuilderAppendType(receiver.type); + public static StackValue genToString(InstructionAdapter v, StackValue receiver, Type receiverType) { + Type type = stringValueOfOrStringBuilderAppendType(receiverType); receiver.put(type, v); v.invokestatic("java/lang/String", "valueOf", "(" + type.getDescriptor() + ")Ljava/lang/String;"); return StackValue.onStack(JAVA_STRING_TYPE); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index adb1cf703f6..46b869544f4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1173,7 +1173,8 @@ public class ExpressionCodegen extends JetVisitor implem JetStringTemplateEntry[] entries = expression.getEntries(); if (entries.length == 1 && entries[0] instanceof JetStringTemplateEntryWithExpression) { - return genToString(v, gen(entries[0].getExpression())); + JetExpression expr = entries[0].getExpression(); + return genToString(v, gen(expr), expressionType(expr)); } for (JetStringTemplateEntry entry : entries) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java index e9ba927ae5f..be44473606d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java @@ -40,6 +40,6 @@ public class ToString implements IntrinsicMethod { StackValue receiver, @NotNull GenerationState state ) { - return genToString(v, receiver); + return genToString(v, receiver, receiver.type); } } diff --git a/compiler/testData/codegen/box/strings/kt3652.kt b/compiler/testData/codegen/box/strings/kt3652.kt new file mode 100644 index 00000000000..f9e678089b8 --- /dev/null +++ b/compiler/testData/codegen/box/strings/kt3652.kt @@ -0,0 +1,9 @@ +fun box(): String { + var a = 'a' + + if ("${a++}x" != "ax") return "fail1" + + if ("${a++}" != "b") return "fail2" + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 2d7d964b432..aa30ff43a69 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -1546,8 +1546,8 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/defaultArguments/constructor/kt2852.kt"); } - } - + } + @TestMetadata("compiler/testData/codegen/box/defaultArguments/function") public static class Function extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInFunction() throws Exception { @@ -3686,6 +3686,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/strings/ea35743.kt"); } + @TestMetadata("kt3652.kt") + public void testKt3652() throws Exception { + doTest("compiler/testData/codegen/box/strings/kt3652.kt"); + } + @TestMetadata("kt881.kt") public void testKt881() throws Exception { doTest("compiler/testData/codegen/box/strings/kt881.kt");