Skip to content

Commit 5f843f6

Browse files
committed
Fix intrinsic for String.plus for explicit calls
#KT-14567 Fixed
1 parent fcb4db0 commit 5f843f6

File tree

6 files changed

+57
-3
lines changed

6 files changed

+57
-3
lines changed

compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Concat.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ class Concat : IntrinsicMethod() {
4747
codegen.invokeAppend(element.right)
4848
}
4949
else {
50-
// LHS?.plus(RHS)
51-
receiver.put(AsmTypes.OBJECT_TYPE, v)
50+
// Explicit plus call LHS?.plus(RHS) or LHS.plus(RHS)
51+
receiver.put(AsmTypes.JAVA_STRING_TYPE, v)
5252
genStringBuilderConstructor(v)
5353
v.swap()
5454
genInvokeAppendMethod(v, returnType)
55-
codegen.invokeAppend(arguments.get(0))
55+
codegen.invokeAppend(arguments[0])
5656
}
5757

5858
v.invokevirtual("java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// WITH_RUNTIME
2+
3+
fun bar1(): String {
4+
val l: List<String> = listOf("O")
5+
val s = l[0].plus("K")
6+
return s
7+
}
8+
9+
fun bar2(): String {
10+
val l: List<String?> = listOf("O")
11+
val s = l[0]?.plus("K")
12+
return s!!
13+
}
14+
15+
fun bar3(): String {
16+
val l: List<String> = listOf("O")
17+
with(l[0]) {
18+
return plus("K")
19+
}
20+
return "fail"
21+
}
22+
23+
fun box(): String {
24+
if (bar1() != "OK") return "fail 1"
25+
if (bar2() != "OK") return "fail 2"
26+
if (bar3() != "OK") return "fail 3"
27+
28+
return "OK"
29+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
@kotlin.Metadata
2+
public final class PlusExplicitKt {
3+
public final static @org.jetbrains.annotations.NotNull method bar1(): java.lang.String
4+
public final static @org.jetbrains.annotations.NotNull method bar2(): java.lang.String
5+
public final static @org.jetbrains.annotations.NotNull method bar3(): java.lang.String
6+
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
7+
}

compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11207,6 +11207,12 @@ public void testPercentAsModOnBigIntegerWithoutRem() throws Exception {
1120711207
doTest(fileName);
1120811208
}
1120911209

11210+
@TestMetadata("plusExplicit.kt")
11211+
public void testPlusExplicit() throws Exception {
11212+
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/plusExplicit.kt");
11213+
doTest(fileName);
11214+
}
11215+
1121011216
@TestMetadata("remAssignmentOperation.kt")
1121111217
public void testRemAssignmentOperation() throws Exception {
1121211218
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/remAssignmentOperation.kt");

compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11207,6 +11207,12 @@ public void testPercentAsModOnBigIntegerWithoutRem() throws Exception {
1120711207
doTest(fileName);
1120811208
}
1120911209

11210+
@TestMetadata("plusExplicit.kt")
11211+
public void testPlusExplicit() throws Exception {
11212+
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/plusExplicit.kt");
11213+
doTest(fileName);
11214+
}
11215+
1121011216
@TestMetadata("remAssignmentOperation.kt")
1121111217
public void testRemAssignmentOperation() throws Exception {
1121211218
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/remAssignmentOperation.kt");

js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12936,6 +12936,12 @@ public void testOverloadedSet() throws Exception {
1293612936
doTest(fileName);
1293712937
}
1293812938

12939+
@TestMetadata("plusExplicit.kt")
12940+
public void testPlusExplicit() throws Exception {
12941+
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/plusExplicit.kt");
12942+
doTest(fileName);
12943+
}
12944+
1293912945
@TestMetadata("remAssignmentOperation.kt")
1294012946
public void testRemAssignmentOperation() throws Exception {
1294112947
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/remAssignmentOperation.kt");

0 commit comments

Comments
 (0)