From 2e6d53a43fc7017927a763c69aa18695e7389e7c Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 21 Sep 2018 17:13:00 +0300 Subject: [PATCH] Fix extension receiver coercion for inline classes #KT-27031 --- .../jetbrains/kotlin/codegen/StackValue.java | 2 +- .../extLambdaInInlineClassFun.kt | 10 ++++++++ .../extLambdaInInlineClassFun2.kt | 10 ++++++++ .../inlineExtLambdaInInlineClassFun.kt | 10 ++++++++ .../inlineExtLambdaInInlineClassFun2.kt | 10 ++++++++ .../inlineLambdaInInlineClassFun.kt | 10 ++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 25 +++++++++++++++++++ .../LightAnalysisModeTestGenerated.java | 25 +++++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 25 +++++++++++++++++++ .../IrJsCodegenBoxTestGenerated.java | 25 +++++++++++++++++++ .../semantics/JsCodegenBoxTestGenerated.java | 25 +++++++++++++++++++ 11 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun.kt create mode 100644 compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun2.kt create mode 100644 compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun.kt create mode 100644 compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun2.kt create mode 100644 compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java index 07fca59b815..639fe9bf162 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java @@ -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); } diff --git a/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun.kt b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun.kt new file mode 100644 index 00000000000..06dc6b0a999 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun.kt @@ -0,0 +1,10 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +fun T.runExt(fn: T.() -> String) = fn() + +inline class R(private val r: Int) { + fun test() = runExt { "OK" } +} + +fun box() = R(0).test() \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun2.kt b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun2.kt new file mode 100644 index 00000000000..6c3794c3e3c --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/extLambdaInInlineClassFun2.kt @@ -0,0 +1,10 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +fun T.runExt(fn: T.() -> String) = fn() + +inline class R(private val r: String) { + fun test() = runExt { r } +} + +fun box() = R("OK").test() \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun.kt b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun.kt new file mode 100644 index 00000000000..d97a5e72856 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun.kt @@ -0,0 +1,10 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +inline fun T.runInlineExt(fn: T.() -> String) = fn() + +inline class R(private val r: Int) { + fun test() = runInlineExt { "OK" } +} + +fun box() = R(0).test() \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun2.kt b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun2.kt new file mode 100644 index 00000000000..284987fd877 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineExtLambdaInInlineClassFun2.kt @@ -0,0 +1,10 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +inline fun T.runInlineExt(fn: T.() -> String) = fn() + +inline class R(private val r: String) { + fun test() = runInlineExt { r } +} + +fun box() = R("OK").test() \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt new file mode 100644 index 00000000000..8de6f70a109 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt @@ -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() \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 035ddb43dc6..45693ba4f59 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -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"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index f98e8acaa6d..e816f4c5700 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -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"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index ca8ae57420f..2010ee0706e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -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"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index 5d5ce1212b4..667f70f08b7 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -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"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 350027cd0fc..01b20c34b44 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -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");