Fix extension receiver coercion for inline classes

#KT-27031
This commit is contained in:
Dmitry Petrov
2018-09-21 17:13:00 +03:00
parent 20d7210239
commit 2e6d53a43f
11 changed files with 176 additions and 1 deletions
@@ -721,7 +721,7 @@ public abstract class StackValue {
) {
// Coerce 'this' for the case when it is smart cast.
// Do not coerce for other cases due to the 'protected' access issues (JVMS 7, 4.9.2 Structural Constraints).
boolean coerceType = descriptor.getKind() == ClassKind.INTERFACE || (castReceiver && !isSuper);
boolean coerceType = descriptor.getKind() == ClassKind.INTERFACE || descriptor.isInline() || (castReceiver && !isSuper);
return new ThisOuter(codegen, descriptor, isSuper, coerceType);
}
@@ -0,0 +1,10 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM_IR
fun <T> T.runExt(fn: T.() -> String) = fn()
inline class R(private val r: Int) {
fun test() = runExt { "OK" }
}
fun box() = R(0).test()
@@ -0,0 +1,10 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM_IR
fun <T> T.runExt(fn: T.() -> String) = fn()
inline class R(private val r: String) {
fun test() = runExt { r }
}
fun box() = R("OK").test()
@@ -0,0 +1,10 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM_IR
inline fun <T> T.runInlineExt(fn: T.() -> String) = fn()
inline class R(private val r: Int) {
fun test() = runInlineExt { "OK" }
}
fun box() = R(0).test()
@@ -0,0 +1,10 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM_IR
inline fun <T> T.runInlineExt(fn: T.() -> String) = fn()
inline class R(private val r: String) {
fun test() = runInlineExt { r }
}
fun box() = R("OK").test()
@@ -0,0 +1,10 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM_IR
inline fun runInline(fn: () -> String) = fn()
inline class R(private val r: Int) {
fun test() = runInline { "OK" }
}
fun box() = R(0).test()
@@ -11911,6 +11911,31 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
}
@TestMetadata("extLambdaInInlineClassFun.kt")
public void testExtLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun.kt");
}
@TestMetadata("extLambdaInInlineClassFun2.kt")
public void testExtLambdaInInlineClassFun2() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun2.kt");
}
@TestMetadata("inlineExtLambdaInInlineClassFun.kt")
public void testInlineExtLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun.kt");
}
@TestMetadata("inlineExtLambdaInInlineClassFun2.kt")
public void testInlineExtLambdaInInlineClassFun2() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun2.kt");
}
@TestMetadata("inlineLambdaInInlineClassFun.kt")
public void testInlineLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
}
@TestMetadata("lambdaInInlineClassFun.kt")
public void testLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/lambdaInInlineClassFun.kt");
@@ -11911,6 +11911,31 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
}
@TestMetadata("extLambdaInInlineClassFun.kt")
public void testExtLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun.kt");
}
@TestMetadata("extLambdaInInlineClassFun2.kt")
public void testExtLambdaInInlineClassFun2() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun2.kt");
}
@TestMetadata("inlineExtLambdaInInlineClassFun.kt")
public void testInlineExtLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun.kt");
}
@TestMetadata("inlineExtLambdaInInlineClassFun2.kt")
public void testInlineExtLambdaInInlineClassFun2() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun2.kt");
}
@TestMetadata("inlineLambdaInInlineClassFun.kt")
public void testInlineLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
}
@TestMetadata("lambdaInInlineClassFun.kt")
public void testLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/lambdaInInlineClassFun.kt");
@@ -11916,6 +11916,31 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true);
}
@TestMetadata("extLambdaInInlineClassFun.kt")
public void testExtLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun.kt");
}
@TestMetadata("extLambdaInInlineClassFun2.kt")
public void testExtLambdaInInlineClassFun2() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun2.kt");
}
@TestMetadata("inlineExtLambdaInInlineClassFun.kt")
public void testInlineExtLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun.kt");
}
@TestMetadata("inlineExtLambdaInInlineClassFun2.kt")
public void testInlineExtLambdaInInlineClassFun2() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun2.kt");
}
@TestMetadata("inlineLambdaInInlineClassFun.kt")
public void testInlineLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
}
@TestMetadata("lambdaInInlineClassFun.kt")
public void testLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/lambdaInInlineClassFun.kt");
@@ -10451,6 +10451,31 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS_IR, true);
}
@TestMetadata("extLambdaInInlineClassFun.kt")
public void testExtLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun.kt");
}
@TestMetadata("extLambdaInInlineClassFun2.kt")
public void testExtLambdaInInlineClassFun2() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun2.kt");
}
@TestMetadata("inlineExtLambdaInInlineClassFun.kt")
public void testInlineExtLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun.kt");
}
@TestMetadata("inlineExtLambdaInInlineClassFun2.kt")
public void testInlineExtLambdaInInlineClassFun2() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun2.kt");
}
@TestMetadata("inlineLambdaInInlineClassFun.kt")
public void testInlineLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
}
@TestMetadata("lambdaInInlineClassFun.kt")
public void testLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/lambdaInInlineClassFun.kt");
@@ -11496,6 +11496,31 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true);
}
@TestMetadata("extLambdaInInlineClassFun.kt")
public void testExtLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun.kt");
}
@TestMetadata("extLambdaInInlineClassFun2.kt")
public void testExtLambdaInInlineClassFun2() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun2.kt");
}
@TestMetadata("inlineExtLambdaInInlineClassFun.kt")
public void testInlineExtLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun.kt");
}
@TestMetadata("inlineExtLambdaInInlineClassFun2.kt")
public void testInlineExtLambdaInInlineClassFun2() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun2.kt");
}
@TestMetadata("inlineLambdaInInlineClassFun.kt")
public void testInlineLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");
}
@TestMetadata("lambdaInInlineClassFun.kt")
public void testLambdaInInlineClassFun() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/lambdaInInlineClassFun.kt");