scala / bug

Scala 2 bug reports only. Please, no questions — proper bug reports only.
https://scala-lang.org
231 stars 21 forks source link

overriding checks can be subverted with param list multiplicity and/or implicity #9848

Open scabug opened 8 years ago

scabug commented 8 years ago

I might have already noted these before, but I can't find the ticket. Maybe it was during code review on dotty?

scala> class C[A] { final def foo(x: A)(y: Int) = 0 }; class D extends C[Int] { def foo(x: Int, y: Int) = 1 }
defined class C
defined class D

scala> new D().foo(0)(0)
java.lang.VerifyError: class D overrides final method foo.(Ljava/lang/Object;I)I
  at java.lang.ClassLoader.defineClass1(Native Method)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
  at scala.reflect.internal.util.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:64)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  ... 37 elided

scala> class C[A] { final def foo(implicit x: A) = 0 }; class D extends C[Int] { def foo(x: Int) = 0 }
defined class C
defined class D

scala> new D().foo(0)
java.lang.VerifyError: class D overrides final method foo.(Ljava/lang/Object;)I
  at java.lang.ClassLoader.defineClass1(Native Method)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
  at scala.reflect.internal.util.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:64)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  ... 37 elided
scabug commented 8 years ago

Imported From: https://issues.scala-lang.org/browse/SI-9848?orig=1 Reporter: @retronym Affected Versions: 2.11.8

retronym commented 7 years ago

In https://github.com/retronym/scala/tree/ticket/9848, I've made matches agnostic to the IMPLICIT flag (adding instead a check that overriding pairs agree on IMPLICITness).