Skip to content

A locally defined scala.Enumeration blows up at runtime #11052

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
dwijnand opened this issue Jan 10, 2021 · 2 comments · Fixed by #15412
Closed

A locally defined scala.Enumeration blows up at runtime #11052

dwijnand opened this issue Jan 10, 2021 · 2 comments · Fixed by #15412

Comments

@dwijnand
Copy link
Member

Minimized code

class Foo {
  implicit class StringShould(private val s: String) {
    def should(right: => Unit) = right
  }

  "Foo" should {
    object Weekdays extends Enumeration {
      val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
    }
    println(Weekdays.Mon.toString)
  }
}

object Main {
  def main(args: Array[String]): Unit = new Foo()
}

Output

$ scala3 Foo.scala
Exception in thread "main" java.lang.IllegalAccessException: class scala.Enumeration cannot access a member of class Foo$Weekdays$1$ with modifiers "public"
	at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
	at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
	at java.base/java.lang.reflect.Method.invoke(Method.java:558)
	at scala.Enumeration.$anonfun$populateNameMap$3(Enumeration.scala:208)
	at scala.Enumeration.populateNameMap(Enumeration.scala:205)
	at scala.Enumeration.$anonfun$nameOf$1(Enumeration.scala:220)
	at scala.collection.mutable.HashMap.getOrElse(HashMap.scala:436)
	at scala.Enumeration.scala$Enumeration$$nameOf(Enumeration.scala:220)
	at scala.Enumeration$Val.toString(Enumeration.scala:263)
	at Foo.$init$$$anonfun$1(Foo.scala:10)
	at Foo$StringShould.should(Foo.scala:3)
	at Foo.<init>(Foo.scala:11)
	at Main$.main(Foo.scala:15)
	at Main.main(Foo.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 dotty.tools.scripting.ScriptingDriver.compileAndRun(ScriptingDriver.scala:29)
	at dotty.tools.scripting.Main$.main(Main.scala:18)
	at dotty.tools.scripting.Main.main(Main.scala)

Expectation

No runtime exception.

@griggt
Copy link
Contributor

griggt commented Jan 10, 2021

A slightly simpler example:

object Test {
  def main(args: Array[String]): Unit = {
    object Weekdays extends Enumeration {
      val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
    }
    println(Weekdays.Mon.toString)
  }
}

Scala 2.13.4 sets the ACC_PUBLIC flag on the Test$Weekdays$1$ class, whereas 3.0.0-M3 does not:

Classfile /src/dotty-issues/i11052/2.13.4/Test$Weekdays$1$.class
  Last modified Jan 10, 2021; size 1240 bytes
  MD5 checksum f780afb1c834667f5acfb93297e8a279
  Compiled from "i11052.scala"
public class Test$Weekdays$1$ extends scala.Enumeration
  minor version: 0
  major version: 52
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
Classfile /src/dotty-issues/i11052/3.0.0-M3/Test$Weekdays$1$.class
  Last modified Jan 10, 2021; size 1100 bytes
  MD5 checksum f1fd7bc67fcbf80245a8d813cf917803
  Compiled from "i11052.scala"
final class Test$Weekdays$1$ extends scala.Enumeration
  minor version: 0
  major version: 52
  flags: (0x003a) ACC_FINAL, ACC_SUPER, 0x8, 0x2

@liufengyun liufengyun reopened this Feb 22, 2021
anatoliykmetyuk added a commit to dotty-staging/dotty that referenced this issue Jun 9, 2022
@anatoliykmetyuk anatoliykmetyuk linked a pull request Jun 9, 2022 that will close this issue
nicolasstucki added a commit that referenced this issue Jun 9, 2022
@griggt
Copy link
Contributor

griggt commented Jun 10, 2022

Fixed by #14686

bishabosha pushed a commit to dotty-staging/dotty that referenced this issue Oct 18, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants