Skip to content

VerifyError: class overrides final method #12532

@durban

Description

@durban

reproduction steps

using Scala 2.13.8 and sbt 1.6.2 with OpenJDK 11.0.13

package com.example

class Sync

class Async extends Sync

trait Base {
  def foo: Sync
}

trait BaseSync extends Base {
  override def foo: Sync
}

trait BaseAsync extends Base  {
  override def foo: Async
}

abstract class ImplAsync extends BaseAsync {
  final override def foo: Async =
    new Async
}

final class StrangeClass extends ImplAsync with BaseSync

object Main {
  def main(args: Array[String]): Unit = {
    println((new StrangeClass).foo)
  }
}

problem

When loading StrangeClass (I guess) the bytecode verifier (I think) throws an exception: java.lang.VerifyError: class com.example.StrangeClass overrides final method com.example.ImplAsync.foo()Lcom/example/Sync;

Exception in thread "sbt-bg-threads-52" java.lang.VerifyError: class com.example.StrangeClass overrides final method com.example.ImplAsync.foo()Lcom/example/Sync;
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
        at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:555)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
        at sbt.internal.ManagedClassLoader.findClass(ManagedClassLoader.java:102)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        at com.example.Main$.main(Strange.scala:28)
        at com.example.Main.main(Strange.scala)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at sbt.Run.invokeMain(Run.scala:143)
        at sbt.Run.execute$1(Run.scala:93)
        at sbt.Run.$anonfun$runWithLoader$5(Run.scala:120)
        at sbt.Run$.executeSuccess(Run.scala:186)
        at sbt.Run.runWithLoader(Run.scala:120)
        at sbt.Defaults$.$anonfun$bgRunTask$6(Defaults.scala:1983)
        at sbt.Defaults$.$anonfun$termWrapper$2(Defaults.scala:1922)
        at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
        at scala.util.Try$.apply(Try.scala:213)
        at sbt.internal.BackgroundThreadPool$BackgroundRunnable.run(DefaultBackgroundJobService.scala:369)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:829)

I'm not sure what to expect, but either a compile-time error, or a working program, and not a VerifyError.

Metadata

Metadata

Assignees

Labels

backendfixed in Scala 3This issue does not exist in the Scala 3 compiler (https://github.com/lampepfl/dotty/)has PR

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions