Andreas Martin Mørch
05/20/2025, 7:53 AMjava.lang.IllegalArgumentException: Only componentN functions should be cached this way, but got: hashCode
at org.jetbrains.kotlin.fir.backend.Fir2IrDeclarationStorage.cacheIrFunctionSymbol(Fir2IrDeclarationStorage.kt:426)
at org.jetbrains.kotlin.fir.backend.Fir2IrDeclarationStorage.getIrFunctionSymbol(Fir2IrDeclarationStorage.kt:1133)
at org.jetbrains.kotlin.fir.backend.Fir2IrDeclarationStorage.getIrFunctionSymbol$default(Fir2IrDeclarationStorage.kt:1101)
at org.jetbrains.kotlin.fir.backend.generators.Fir2IrDataClassGeneratedMemberBodyGenerator$MyDataClassMethodsGenerator$irDataClassMembersGenerator$1.getHashCodeFunctionInfo(Fir2IrDataClassMembersGenerator.kt:362)
at org.jetbrains.kotlin.ir.util.DataClassMembersGenerator.getHashCodeOf(DataClassMembersGenerator.kt:282)
at org.jetbrains.kotlin.ir.util.DataClassMembersGenerator$MemberFunctionBuilder.getHashCodeOfProperty(DataClassMembersGenerator.kt:229)
at org.jetbrains.kotlin.ir.util.DataClassMembersGenerator$MemberFunctionBuilder.generateHashCodeMethodBody(DataClassMembersGenerator.kt:211)
at org.jetbrains.kotlin.ir.util.IrBasedDataClassMembersGenerator.generateHashCodeMethod(DataClassMembersGenerator.kt:367)
I only found this issue where someone had a similar issue, but they get it by using the IJ debugger and evaluating an expression:
KT-70376 K2 IDE / Kotlin Debugger: IAE “Only componentN functions should be cached this way, but got: toString” on evaluating toString() method for value class
I tried a variety of versions from 2.0.x to 2.2.0-RC giving me the same error.
Is there any way to figure out which code this exception refers to? Maybe that will make it possible to create a minimal reproducerAnna Kozlova
05/20/2025, 7:58 AMdmitriy.novozhilov
05/20/2025, 8:02 AMAndreas Martin Mørch
05/20/2025, 8:11 AMjava.lang.IllegalArgumentException: Only componentN functions should be cached this way, but got: hashCode
at org.jetbrains.kotlin.fir.backend.Fir2IrDeclarationStorage.cacheIrFunctionSymbol(Fir2IrDeclarationStorage.kt:426)
at org.jetbrains.kotlin.fir.backend.Fir2IrDeclarationStorage.getIrFunctionSymbol(Fir2IrDeclarationStorage.kt:1133)
at org.jetbrains.kotlin.fir.backend.Fir2IrDeclarationStorage.getIrFunctionSymbol$default(Fir2IrDeclarationStorage.kt:1101)
at org.jetbrains.kotlin.fir.backend.generators.Fir2IrDataClassGeneratedMemberBodyGenerator$MyDataClassMethodsGenerator$irDataClassMembersGenerator$1.getHashCodeFunctionInfo(Fir2IrDataClassMembersGenerator.kt:362)
at org.jetbrains.kotlin.ir.util.DataClassMembersGenerator.getHashCodeOf(DataClassMembersGenerator.kt:282)
at org.jetbrains.kotlin.ir.util.DataClassMembersGenerator$MemberFunctionBuilder.getHashCodeOfProperty(DataClassMembersGenerator.kt:229)
at org.jetbrains.kotlin.ir.util.DataClassMembersGenerator$MemberFunctionBuilder.generateHashCodeMethodBody(DataClassMembersGenerator.kt:211)
at org.jetbrains.kotlin.ir.util.IrBasedDataClassMembersGenerator.generateHashCodeMethod(DataClassMembersGenerator.kt:367)
at org.jetbrains.kotlin.fir.backend.generators.Fir2IrDataClassGeneratedMemberBodyGenerator$MyDataClassMethodsGenerator.generateBodies(Fir2IrDataClassMembersGenerator.kt:248)
at org.jetbrains.kotlin.fir.backend.generators.Fir2IrDataClassGeneratedMemberBodyGenerator.generateBodiesForClassesWithSyntheticDataClassMembers(Fir2IrDataClassMembersGenerator.kt:228)
at org.jetbrains.kotlin.fir.pipeline.Fir2IrPipeline.generateSyntheticBodiesOfDataValueMembers(convertToIr.kt:267)
at org.jetbrains.kotlin.fir.pipeline.Fir2IrPipeline.runActualizationPipeline(convertToIr.kt:205)
at org.jetbrains.kotlin.fir.pipeline.Fir2IrPipeline.convertToIrAndActualize(convertToIr.kt:130)
at org.jetbrains.kotlin.fir.pipeline.ConvertToIrKt.convertToIrAndActualize(convertToIr.kt:100)
at org.jetbrains.kotlin.fir.pipeline.ConvertToIrKt.convertToIrAndActualize$default(convertToIr.kt:75)
at org.jetbrains.kotlin.cli.jvm.compiler.legacy.pipeline.JvmCompilerPipelineKt.convertToIrAndActualizeForJvm(jvmCompilerPipeline.kt:108)
at org.jetbrains.kotlin.cli.pipeline.jvm.JvmFir2IrPipelinePhase.executePhase(JvmFir2IrPipelinePhase.kt:26)
at org.jetbrains.kotlin.cli.pipeline.jvm.JvmFir2IrPipelinePhase.executePhase(JvmFir2IrPipelinePhase.kt:17)
at org.jetbrains.kotlin.cli.pipeline.PipelinePhase.phaseBody(PipelinePhase.kt:68)
at org.jetbrains.kotlin.cli.pipeline.PipelinePhase.phaseBody(PipelinePhase.kt:58)
at org.jetbrains.kotlin.config.phaser.SimpleNamedCompilerPhase.phaseBody(CompilerPhase.kt:215)
at org.jetbrains.kotlin.config.phaser.NamedCompilerPhase.invoke(CompilerPhase.kt:111)
at org.jetbrains.kotlin.backend.common.phaser.CompositePhase.invoke(PhaseBuilders.kt:28)
at org.jetbrains.kotlin.config.phaser.CompilerPhaseKt.invokeToplevel(CompilerPhase.kt:62)
at org.jetbrains.kotlin.cli.pipeline.AbstractCliPipeline.runPhasedPipeline(AbstractCliPipeline.kt:106)
at org.jetbrains.kotlin.cli.pipeline.AbstractCliPipeline.execute(AbstractCliPipeline.kt:65)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecutePhased(K2JVMCompiler.kt:61)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecutePhased(K2JVMCompiler.kt:36)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:80)
at org.jetbrains.kotlin.cli.common.CLICompiler.exec(CLICompiler.kt:337)
at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:466)
at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:75)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.doCompile(IncrementalCompilerRunner.kt:514)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:431)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileNonIncrementally(IncrementalCompilerRunner.kt:310)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:137)
at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:678)
at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:92)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1805)
at jdk.internal.reflect.GeneratedMethodAccessor15.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:691)
at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:832)
Only compiler plugin used is the kotlinx-serialization one. I can try to bump it and see if I get a different result (current version used is 1.6.10)Andreas Martin Mørch
05/20/2025, 8:13 AMdmitriy.novozhilov
05/20/2025, 8:14 AM1.6.10
is a version of kotlinx-serialization
library.
The plugin version is alligned.
Could you please report an issue with this stacktrace and maybe some reproducer?
This is definitely a compiler bugAndreas Martin Mørch
05/20/2025, 8:18 AMdmitriy.novozhilov
05/20/2025, 8:24 AMdata
modifier), but it's kinda tedious
2. Debug the compiler itself on your project, but it's something too complicated to ask you to do. I can assist with it, but I'll understand if you'll discard this optiondmitriy.novozhilov
05/20/2025, 8:31 AMAndreas Martin Mørch
05/20/2025, 8:37 AMdmitriy.novozhilov
05/20/2025, 8:37 AMdmitriy.novozhilov
05/20/2025, 8:42 AMvalue
class (they are processed similarly to data
classes for equals/hashCode/toString
methods)dmitriy.novozhilov
05/20/2025, 8:53 AMAndreas Martin Mørch
05/20/2025, 8:53 AMdmitriy.novozhilov
05/20/2025, 8:54 AMdmitriy.novozhilov
05/20/2025, 12:07 PM2.1.21-319
maven("<https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev>")
dmitriy.novozhilov
05/20/2025, 12:09 PMAndreas Martin Mørch
05/20/2025, 12:09 PMAndreas Martin Mørch
05/20/2025, 12:43 PMjava.lang.IllegalArgumentException: Only componentN functions should be cached this way, but got: public open fun hashCode(): R|kotlin/Int|
seems to just print out the signature of the hashCode function instead of a class?Andreas Martin Mørch
05/20/2025, 12:44 PMjava.lang.IllegalArgumentException: Only componentN functions should be cached this way, but got: public open fun hashCode(): R|kotlin/Int|
at org.jetbrains.kotlin.fir.backend.Fir2IrDeclarationStorage.cacheIrFunctionSymbol(Fir2IrDeclarationStorage.kt:426)
at org.jetbrains.kotlin.fir.backend.Fir2IrDeclarationStorage.getIrFunctionSymbol(Fir2IrDeclarationStorage.kt:1133)
at org.jetbrains.kotlin.fir.backend.Fir2IrDeclarationStorage.getIrFunctionSymbol$default(Fir2IrDeclarationStorage.kt:1101)
at org.jetbrains.kotlin.fir.backend.generators.Fir2IrDataClassGeneratedMemberBodyGenerator$MyDataClassMethodsGenerator$irDataClassMembersGenerator$1.getHashCodeFunctionInfo(Fir2IrDataClassMembersGenerator.kt:362)
at org.jetbrains.kotlin.ir.util.DataClassMembersGenerator.getHashCodeOf(DataClassMembersGenerator.kt:282)
at org.jetbrains.kotlin.ir.util.DataClassMembersGenerator$MemberFunctionBuilder.getHashCodeOfProperty(DataClassMembersGenerator.kt:229)
at org.jetbrains.kotlin.ir.util.DataClassMembersGenerator$MemberFunctionBuilder.generateHashCodeMethodBody(DataClassMembersGenerator.kt:211)
at org.jetbrains.kotlin.ir.util.IrBasedDataClassMembersGenerator.generateHashCodeMethod(DataClassMembersGenerator.kt:367)
at org.jetbrains.kotlin.fir.backend.generators.Fir2IrDataClassGeneratedMemberBodyGenerator$MyDataClassMethodsGenerator.generateBodies(Fir2IrDataClassMembersGenerator.kt:248)
at org.jetbrains.kotlin.fir.backend.generators.Fir2IrDataClassGeneratedMemberBodyGenerator.generateBodiesForClassesWithSyntheticDataClassMembers(Fir2IrDataClassMembersGenerator.kt:228)
at org.jetbrains.kotlin.fir.pipeline.Fir2IrPipeline.generateSyntheticBodiesOfDataValueMembers(convertToIr.kt:267)
at org.jetbrains.kotlin.fir.pipeline.Fir2IrPipeline.runActualizationPipeline(convertToIr.kt:205)
at org.jetbrains.kotlin.fir.pipeline.Fir2IrPipeline.convertToIrAndActualize(convertToIr.kt:130)
at org.jetbrains.kotlin.fir.pipeline.ConvertToIrKt.convertToIrAndActualize(convertToIr.kt:100)
at org.jetbrains.kotlin.fir.pipeline.ConvertToIrKt.convertToIrAndActualize$default(convertToIr.kt:75)
at org.jetbrains.kotlin.cli.jvm.compiler.legacy.pipeline.JvmCompilerPipelineKt.convertToIrAndActualizeForJvm(jvmCompilerPipeline.kt:108)
at org.jetbrains.kotlin.cli.pipeline.jvm.JvmFir2IrPipelinePhase.executePhase(JvmFir2IrPipelinePhase.kt:26)
at org.jetbrains.kotlin.cli.pipeline.jvm.JvmFir2IrPipelinePhase.executePhase(JvmFir2IrPipelinePhase.kt:17)
at org.jetbrains.kotlin.cli.pipeline.PipelinePhase.phaseBody(PipelinePhase.kt:68)
at org.jetbrains.kotlin.cli.pipeline.PipelinePhase.phaseBody(PipelinePhase.kt:58)
at org.jetbrains.kotlin.config.phaser.SimpleNamedCompilerPhase.phaseBody(CompilerPhase.kt:215)
at org.jetbrains.kotlin.config.phaser.NamedCompilerPhase.invoke(CompilerPhase.kt:111)
at org.jetbrains.kotlin.backend.common.phaser.CompositePhase.invoke(PhaseBuilders.kt:28)
at org.jetbrains.kotlin.config.phaser.CompilerPhaseKt.invokeToplevel(CompilerPhase.kt:62)
at org.jetbrains.kotlin.cli.pipeline.AbstractCliPipeline.runPhasedPipeline(AbstractCliPipeline.kt:106)
at org.jetbrains.kotlin.cli.pipeline.AbstractCliPipeline.execute(AbstractCliPipeline.kt:65)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecutePhased(K2JVMCompiler.kt:61)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecutePhased(K2JVMCompiler.kt:36)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:80)
at org.jetbrains.kotlin.cli.common.CLICompiler.exec(CLICompiler.kt:337)
at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:466)
at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:75)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.doCompile(IncrementalCompilerRunner.kt:514)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:431)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileNonIncrementally(IncrementalCompilerRunner.kt:310)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:137)
at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:678)
at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:92)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1805)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:691)
at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:832)
dmitriy.novozhilov
05/20/2025, 12:45 PMAndreas Martin Mørch
05/20/2025, 12:45 PMdmitriy.novozhilov
05/20/2025, 2:08 PM2.1.21-321
Andreas Martin Mørch
05/20/2025, 2:28 PMdmitriy.novozhilov
05/20/2025, 2:30 PMdata class Some(val x: ClassFromThatLibrary)
Andreas Martin Mørch
05/20/2025, 2:30 PMdata class Weapon(val name:String)
Andreas Martin Mørch
05/20/2025, 2:30 PMjava.lang.IllegalArgumentException: Only componentN functions should be cached this way, but got: public open fun hashCode(): R|kotlin/Int|
fakeOverrideOwnerLookupTag: Weapon
Dispatch receiver: org/hltv/csrules/Weapon
Andreas Martin Mørch
05/20/2025, 2:30 PMAndreas Martin Mørch
05/20/2025, 2:31 PMAndreas Martin Mørch
05/20/2025, 2:33 PMdata class WeaponStat(val ordinal: Int, val weapon: Weapon, val kills: Int)
Where the data class from the Kotlin 1.5.31 library looks like this:
data class Weapon(val name:String)
Andreas Martin Mørch
05/20/2025, 2:33 PMdmitriy.novozhilov
05/20/2025, 2:33 PMdmitriy.novozhilov
05/20/2025, 2:34 PMJust realized this code looks quite morbid, sorry about that. It's about Counter Strike (the game), not real weaponsIt was my first thought, actually.
Andreas Martin Mørch
05/20/2025, 2:35 PMdmitriy.novozhilov
05/20/2025, 2:38 PMWeapon.class
file from .jar
of this library?dmitriy.novozhilov
05/20/2025, 2:47 PMWeapon.class
was somehow modified, so hashCode
function was removed from it, so the compiler tries to generate it as it would generate for source classes, which is something unexpected.Andreas Martin Mørch
05/20/2025, 6:19 PMpublic final data class Weapon public constructor(name: kotlin.String) {
public final val name: kotlin.String /* compiled code */
public final operator fun component1(): kotlin.String { /* compiled code */ }
public final fun copy(name: kotlin.String = COMPILED_CODE): org.hltv.csrules.Weapon { /* compiled code */ }
}
Andreas Martin Mørch
05/20/2025, 7:02 PMdmitriy.novozhilov
05/21/2025, 7:31 AMIt was actually compiled with Kotlin 1.0.5 (!!).Such an ancient time/
As it did work in K1, I assume you might still consider this a bug?Well, it depends on if 1.0.5 really didn't put the
hashCode
into bytecode or if your binary was postprocessed by something else. In the latter case I wound consider it as undefined behavior. But anyway the fact that compiler crashes instead of giving reasonable message is not ok.
I'll try to reproduce it for myself and I'll create ticket if I'll succeed.
so thanks a lot for your help!Thank you for your responsiveness. As an additional outcome of this story I've added this expanded error message (and a lot of similar ones) to
master
of compiler, so in future, if something like this will strike again, it would be much easier to understand what's going on. I wanted to do it for a long time, but you actually gave me an incentive.dmitriy.novozhilov
05/21/2025, 8:41 AMAndreas Martin Mørch
05/21/2025, 11:42 AM