JVM IR: Ignore class type parameters if function is static

Otherwise, it leads to type parameters duplication in case of
suspendImpls, since they inherit type parameters from containing class.

 #KT-56407: Fixed
This commit is contained in:
Ilmir Usmanov
2023-02-06 17:56:19 +01:00
committed by Space Team
parent c7bc439661
commit e42efe1ee6
15 changed files with 285 additions and 0 deletions
@@ -10519,6 +10519,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@Test
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@Test
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
@@ -192,6 +192,10 @@ val IrClass.typeConstructorParameters: Sequence<IrTypeParameter>
// Ideally this should be fixed in FE.
null
}
current is IrSimpleFunction && current.isStatic -> {
// Static functions don't capture type parameters.
null
}
current.isAnonymousObject -> {
// Anonymous classes don't capture type parameters.
null
+90
View File
@@ -0,0 +1,90 @@
@kotlin.Metadata
public interface Client {
// source: 'kt56407.kt'
public abstract @org.jetbrains.annotations.Nullable method connectToServer(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object
}
@kotlin.coroutines.jvm.internal.DebugMetadata
@kotlin.Metadata
final class DefaultAuthorizableClient$connectToServer$2 {
// source: 'kt56407.kt'
enclosing method DefaultAuthorizableClient.connectToServer$suspendImpl(LDefaultAuthorizableClient;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
synthetic final field $nextObjectQuery: DefaultAuthorizableClient$connectToServer$NextObjectQuery
field label: int
synthetic final field this$0: DefaultAuthorizableClient
inner (anonymous) class DefaultAuthorizableClient$connectToServer$2
inner (local) class DefaultAuthorizableClient$connectToServer$NextObjectQuery NextObjectQuery
method <init>(p0: DefaultAuthorizableClient, p1: DefaultAuthorizableClient$connectToServer$NextObjectQuery, p2: kotlin.coroutines.Continuation): void
public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation
public final @org.jetbrains.annotations.Nullable method invoke(@org.jetbrains.annotations.NotNull p0: java.lang.String, @org.jetbrains.annotations.Nullable p1: kotlin.coroutines.Continuation): java.lang.Object
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
public final class DefaultAuthorizableClient$connectToServer$NextObjectQuery {
// source: 'kt56407.kt'
enclosing method DefaultAuthorizableClient.connectToServer$suspendImpl(LDefaultAuthorizableClient;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
inner (local) class DefaultAuthorizableClient$connectToServer$NextObjectQuery NextObjectQuery
public method <init>(): void
}
@kotlin.Metadata
public abstract class DefaultAuthorizableClient {
// source: 'kt56407.kt'
inner (anonymous) class DefaultAuthorizableClient$connectToServer$2
inner (local) class DefaultAuthorizableClient$connectToServer$NextObjectQuery NextObjectQuery
public method <init>(): void
synthetic static method connectToServer$suspendImpl(p0: DefaultAuthorizableClient, p1: kotlin.coroutines.Continuation): java.lang.Object
public @org.jetbrains.annotations.Nullable method connectToServer(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object
}
@kotlin.Metadata
public final class Kt56407Kt$box$1$1 {
// source: 'kt56407.kt'
enclosing method Kt56407Kt$box$1.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
inner (anonymous) class Kt56407Kt$box$1
inner (anonymous) class Kt56407Kt$box$1$1
method <init>(): void
}
@kotlin.coroutines.jvm.internal.DebugMetadata
@kotlin.Metadata
final class Kt56407Kt$box$1 {
// source: 'kt56407.kt'
enclosing method Kt56407Kt.box()Ljava/lang/String;
field label: int
inner (anonymous) class Kt56407Kt$box$1
inner (anonymous) class Kt56407Kt$box$1$1
method <init>(p0: kotlin.coroutines.Continuation): void
public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation
public final @org.jetbrains.annotations.Nullable method invoke(@org.jetbrains.annotations.NotNull p0: java.lang.String, @org.jetbrains.annotations.Nullable p1: kotlin.coroutines.Continuation): java.lang.Object
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
public final class Kt56407Kt$builder$$inlined$Continuation$1 {
// source: 'Continuation.kt'
enclosing method Kt56407Kt.builder(Lkotlin/jvm/functions/Function2;)V
synthetic final field $context: kotlin.coroutines.CoroutineContext
inner (anonymous) class Kt56407Kt$builder$$inlined$Continuation$1
public method <init>(p0: kotlin.coroutines.CoroutineContext): void
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.CoroutineContext
public method resumeWith(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
}
@kotlin.Metadata
public final class Kt56407Kt {
// source: 'kt56407.kt'
inner (anonymous) class Kt56407Kt$box$1
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method builder(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function2): void
private final static method consumeEach$$forInline(p0: java.lang.Object, p1: kotlin.jvm.functions.Function1, p2: kotlin.coroutines.Continuation): java.lang.Object
public final static @org.jetbrains.annotations.Nullable method consumeEach(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.jvm.functions.Function1, @org.jetbrains.annotations.NotNull p2: kotlin.coroutines.Continuation): java.lang.Object
}
@kotlin.Metadata
public interface ServerBase {
// source: 'kt56407.kt'
}
+40
View File
@@ -0,0 +1,40 @@
// WITH_STDLIB
// CHECK_BYTECODE_LISTING
import kotlin.coroutines.*
interface ServerBase
interface Client<ServerType : ServerBase> {
suspend fun connectToServer()
}
public suspend inline fun <E> E.consumeEach(action: (E) -> Unit): Unit = action(this)
fun builder(c: suspend (String) -> Unit) {
c.startCoroutine("", Continuation(EmptyCoroutineContext) {
it.getOrThrow()
})
}
abstract class DefaultAuthorizableClient<ServerType : ServerBase> : Client<ServerType> {
override suspend fun connectToServer() {
class NextObjectQuery
val nextObjectQuery = NextObjectQuery()
builder {
consumeEach { nextObjectQuery }
}
}
}
fun box(): String {
builder {
// make sure all classfiles are loaded
object : DefaultAuthorizableClient<ServerBase>() {}.connectToServer()
}
return "OK"
}
+87
View File
@@ -0,0 +1,87 @@
@kotlin.Metadata
public interface Client {
// source: 'kt56407.kt'
public abstract @org.jetbrains.annotations.Nullable method connectToServer(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object
}
@kotlin.coroutines.jvm.internal.DebugMetadata
@kotlin.Metadata
final class DefaultAuthorizableClient$connectToServer$2 {
// source: 'kt56407.kt'
enclosing method DefaultAuthorizableClient.connectToServer(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
synthetic final field $nextObjectQuery: DefaultAuthorizableClient$connectToServer$NextObjectQuery
field label: int
synthetic final field this$0: DefaultAuthorizableClient
inner (anonymous) class DefaultAuthorizableClient$connectToServer$2
method <init>(p0: DefaultAuthorizableClient, p1: DefaultAuthorizableClient$connectToServer$NextObjectQuery, p2: kotlin.coroutines.Continuation): void
public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation
public final method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
public final class DefaultAuthorizableClient$connectToServer$NextObjectQuery {
// source: 'kt56407.kt'
enclosing method DefaultAuthorizableClient.connectToServer(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
inner (local) class DefaultAuthorizableClient$connectToServer$NextObjectQuery NextObjectQuery
public method <init>(): void
}
@kotlin.Metadata
public abstract class DefaultAuthorizableClient {
// source: 'kt56407.kt'
inner (anonymous) class DefaultAuthorizableClient$connectToServer$2
inner (local) class DefaultAuthorizableClient$connectToServer$NextObjectQuery NextObjectQuery
public method <init>(): void
synthetic static method connectToServer$suspendImpl(p0: DefaultAuthorizableClient, p1: kotlin.coroutines.Continuation): java.lang.Object
public @org.jetbrains.annotations.Nullable method connectToServer(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object
}
@kotlin.Metadata
public final class Kt56407Kt$box$1$1 {
// source: 'kt56407.kt'
enclosing method Kt56407Kt$box$1.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
inner (anonymous) class Kt56407Kt$box$1
inner (anonymous) class Kt56407Kt$box$1$1
method <init>(): void
}
@kotlin.coroutines.jvm.internal.DebugMetadata
@kotlin.Metadata
final class Kt56407Kt$box$1 {
// source: 'kt56407.kt'
enclosing method Kt56407Kt.box()Ljava/lang/String;
field label: int
inner (anonymous) class Kt56407Kt$box$1
inner (anonymous) class Kt56407Kt$box$1$1
method <init>(p0: kotlin.coroutines.Continuation): void
public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation
public final method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
public final class Kt56407Kt$builder$$inlined$Continuation$1 {
// source: 'Continuation.kt'
enclosing method Kt56407Kt.builder(Lkotlin/jvm/functions/Function2;)V
synthetic final field $context: kotlin.coroutines.CoroutineContext
inner (anonymous) class Kt56407Kt$builder$$inlined$Continuation$1
public method <init>(p0: kotlin.coroutines.CoroutineContext): void
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.CoroutineContext
public method resumeWith(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
}
@kotlin.Metadata
public final class Kt56407Kt {
// source: 'kt56407.kt'
inner (anonymous) class Kt56407Kt$box$1
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method builder(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function2): void
private final static @org.jetbrains.annotations.Nullable method consumeEach$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.jvm.functions.Function1, @org.jetbrains.annotations.NotNull p2: kotlin.coroutines.Continuation): java.lang.Object
public final static @org.jetbrains.annotations.Nullable method consumeEach(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.jvm.functions.Function1, @org.jetbrains.annotations.NotNull p2: kotlin.coroutines.Continuation): java.lang.Object
}
@kotlin.Metadata
public interface ServerBase {
// source: 'kt56407.kt'
}
@@ -10321,6 +10321,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@Test
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@Test
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
@@ -10519,6 +10519,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@Test
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@Test
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
@@ -8117,6 +8117,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/lastExpressionIsLoop.kt");
@@ -7299,6 +7299,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@Test
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@Test
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
@@ -7395,6 +7395,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@Test
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@Test
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
@@ -7395,6 +7395,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@Test
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@Test
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
@@ -7395,6 +7395,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@Test
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@Test
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
@@ -8352,6 +8352,12 @@ public class K2NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTes
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@Test
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@Test
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
@@ -8263,6 +8263,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@Test
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@Test
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
@@ -6497,6 +6497,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
runTest("compiler/testData/codegen/box/coroutines/kt55494.kt");
}
@TestMetadata("kt56407.kt")
public void testKt56407() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/kt56407.kt");
}
@TestMetadata("lastExpressionIsLoop.kt")
public void testLastExpressionIsLoop() throws Exception {
runTest("compiler/testData/codegen/box/coroutines/lastExpressionIsLoop.kt");