Skip to content

StackOverflow on recursive generic class serialization #1612

@altavir

Description

@altavir

Describe the bug

Here is the reproducer: https://github.com/altavir/serialization-bug-demo/blob/44bad76052505897764f365fc65aa6371e0d2643/src/main/kotlin/Demo2.kt#L10

A class with recursive generic breaks the compilation even when a custom serializer is provided

Expected behavior

Should ignore recursive types when external serializer is provided and report fail-fast error without custom serializer.

Environment

  • Kotlin version: 1.5.10 - 1.5.21
  • Library version: 1.2.2

The stack trace:

e: java.lang.StackOverflowError
	at java.base/java.util.AbstractCollection.toArray(AbstractCollection.java:200)
	at org.jetbrains.kotlin.types.IndexedParametersSubstitution.<init>(TypeSubstitution.kt:184)
	at org.jetbrains.kotlin.types.TypeConstructorSubstitution$Companion.create(TypeSubstitution.kt:83)
	at org.jetbrains.kotlin.types.KotlinTypeFactory.computeMemberScope(KotlinTypeFactory.kt:54)
	at org.jetbrains.kotlin.types.KotlinTypeFactory.simpleType(KotlinTypeFactory.kt:85)
	at org.jetbrains.kotlin.types.KotlinTypeFactory.simpleType$default(KotlinTypeFactory.kt:72)
	at org.jetbrains.kotlin.types.TypeSubstitutionKt.replace(TypeSubstitution.kt:157)
	at org.jetbrains.kotlin.types.TypeSubstitutionKt.replace(TypeSubstitution.kt:142)
	at org.jetbrains.kotlin.types.TypeSubstitutionKt.replace$default(TypeSubstitution.kt:130)
	at org.jetbrains.kotlin.types.TypeSubstitutionKt.replace(TypeSubstitution.kt)
	at org.jetbrains.kotlin.types.TypeSubstitutor.substituteCompoundType(TypeSubstitutor.java:352)
	at org.jetbrains.kotlin.types.TypeSubstitutor.unsafeSubstitute(TypeSubstitutor.java:284)
	at org.jetbrains.kotlin.types.TypeSubstitutor.substituteWithoutApproximation(TypeSubstitutor.java:162)
	at org.jetbrains.kotlin.types.TypeSubstitutor.substitute(TypeSubstitutor.java:147)
	at org.jetbrains.kotlin.types.TypeSubstitutor.substitute(TypeSubstitutor.java:140)
	at org.jetbrains.kotlin.types.TypeUtils.createSubstitutedSupertype(TypeUtils.java:263)
	at org.jetbrains.kotlin.types.TypeUtils.getImmediateSupertypes(TypeUtils.java:249)
	at org.jetbrains.kotlin.types.TypeUtils.collectAllSupertypes(TypeUtils.java:271)
	at org.jetbrains.kotlin.types.TypeUtils.collectAllSupertypes(TypeUtils.java:274)
	at org.jetbrains.kotlin.types.TypeUtils.getAllSupertypes(TypeUtils.java:284)
	at org.jetbrains.kotlin.types.typeUtil.TypeUtilsKt.supertypes(TypeUtils.kt:53)
	at org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker.checkSerializerNullability(SerializationPluginDeclarationChecker.kt:326)
	at org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker.checkType(SerializationPluginDeclarationChecker.kt:289)
	at org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker.checkTypeArguments(SerializationPluginDeclarationChecker.kt:253)
	at org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker.checkType(SerializationPluginDeclarationChecker.kt:290)
	at org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker.checkTypeArguments(SerializationPluginDeclarationChecker.kt:253)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions