Skip to content

erased class used as parameter leads to runtime java.lang.NoSuchFieldError #23305

Closed
@mrdziuban

Description

@mrdziuban

Compiler version

3.6.4, 3.7.1, and latest nightly 3.7.2-RC1-bin-20250601-45ecc31-NIGHTLY

Minimized code

//> using scala 3.7.0
//> using options -language:experimental.erasedDefinitions

erased trait DBMeta[A]

trait Table[A]

case class Saved[A]()
object Saved {
  def table[A](using dbm: DBMeta[A]): Table[Saved[A]] = new Table[Saved[A]] {}
}

case class deleteBulk[A](as: List[Saved[A]])(using dbm: DBMeta[A], tbl: Table[A]) {
  final given savedTable: Table[Saved[A]] = Saved.table[A]
}

case class Foo()
object Foo {
  given dbMeta: DBMeta[Foo] = new DBMeta[Foo] {}
  given table: Table[Foo] = new Table[Foo] {}
}

val del = deleteBulk(List(Saved[Foo]()))
del.savedTable

Output

On the last line, del.savedTable, an exception is thrown:

java.lang.NoSuchFieldError: Class rs$line$1$deleteBulk does not have member field 'rs$line$1$DBMeta dbm'
	at rs$line$1$deleteBulk.savedTable$lzyINIT1(rs$line$1:11)
	at rs$line$1$deleteBulk.savedTable(rs$line$1:11)
	at rs$line$1$.<clinit>(rs$line$1:23)
	at rs$line$1.res0(rs$line$1)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at dotty.tools.repl.Rendering.$anonfun$4(Rendering.scala:120)
	at scala.Option.flatMap(Option.scala:283)
	at dotty.tools.repl.Rendering.valueOf(Rendering.scala:120)
	at dotty.tools.repl.Rendering.renderVal(Rendering.scala:160)
	at dotty.tools.repl.ReplDriver.$anonfun$8(ReplDriver.scala:415)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:334)
	at dotty.tools.repl.ReplDriver.extractAndFormatMembers$1(ReplDriver.scala:415)
	at dotty.tools.repl.ReplDriver.renderDefinitions$$anonfun$2(ReplDriver.scala:453)
	at scala.Option.map(Option.scala:242)
	at dotty.tools.repl.ReplDriver.renderDefinitions(ReplDriver.scala:452)
	at dotty.tools.repl.ReplDriver.compile$$anonfun$2(ReplDriver.scala:357)
	at scala.util.Either.fold(Either.scala:197)
	at dotty.tools.repl.ReplDriver.compile(ReplDriver.scala:339)
	at dotty.tools.repl.ReplDriver.interpret(ReplDriver.scala:298)
	at dotty.tools.repl.ReplDriver.loop$1(ReplDriver.scala:216)
	at dotty.tools.repl.ReplDriver.runUntilQuit$$anonfun$1(ReplDriver.scala:219)
	at dotty.tools.repl.ReplDriver.withRedirectedOutput(ReplDriver.scala:253)
	at dotty.tools.repl.ReplDriver.runBody$$anonfun$1(ReplDriver.scala:227)
	at dotty.tools.runner.ScalaClassLoader$.asContext(ScalaClassLoader.scala:80)
	at dotty.tools.repl.ReplDriver.runBody(ReplDriver.scala:227)
	at dotty.tools.repl.ReplDriver.runUntilQuit(ReplDriver.scala:219)
	at dotty.tools.repl.ReplDriver.tryRunning(ReplDriver.scala:156)
	at dotty.tools.repl.Main$.main(Main.scala:7)
	at dotty.tools.repl.Main.main(Main.scala)

Expectation

There should be no references to the dbm: DBMeta[A] parameter generated in deleteBulk since DBMeta is erased.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions