Skip to content

IllegalAccessException on startup when using App, implicit function, anonymous function, and either multiple assignment or a nested block #6019

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
scabug opened this issue Jul 3, 2012 · 2 comments

Comments

@scabug
Copy link

scabug commented Jul 3, 2012

I have a simple application:

object Test extends App {
  implicit def t2mapper[X, X0 <: X, X1 <: X](t: (X0, X1)) = new {
    def map[R](f: X => R) = (f(t._1), f(t._2))
  }
  println("Hello!")
  val (foo, bar) = (1, 2) map (_ * 2)
  println((foo, bar))
}

(The t2mapper is from Stack Overflow: [http://stackoverflow.com/a/4022510/319931].)

The code compiles fine:

$ scalac -version
Scala compiler version 2.9.1 -- Copyright 2002-2011, LAMP/EPFL
$ scalac -unchecked Test.scala
$ 

but when run, it throws an IllegalAccessError (before Hello! gets printed):

$ java -version
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.1) (6b24-1.11.1-4ubuntu3)
OpenJDK Server VM (build 20.0-b12, mixed mode)
$ scala Test
java.lang.IllegalAccessError: tried to access field Test$.reflParams$Cache1 from class Test$delayedInit$body
        at Test$delayedInit$body.<clinit>(Test.scala:6)
        at Test$.<init>(Test.scala:1)
        at Test$.<clinit>(Test.scala)
        at Test.main(Test.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:78)
        at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24)
        at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:88)
        at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:78)
        at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:33)
        at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:40)
        at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:56)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

Note that with the last two lines replaced with

{code}...
println((1, 2) map (_ * 2))
{code}

or

{code}...
val (foo, bar) = (2, 4)
println((foo, bar))
{code}

or

{code}...
val intermediate = (1, 2) map (_ * 2)
val (foo, bar) = intermediate
println((foo, bar))
{code}

it prints (2,4) as expected. But when wrapped in a block

{code}...
{
val intermediate = (1, 2) map (_ * 2)
val (foo, bar) = intermediate
println((foo, bar))
}
{code}

or

{code}...
private val blah = {
val intermediate = (1, 2) map (_ * 2)
val (foo, bar) = intermediate
println((foo, bar))
}
{code}

it throws the exception.

Related

I described the issue at [http://stackoverflow.com/questions/11302291/why-does-this-scala-code-throw-illegalaccesserror-at-runtime]; reported here too since it seemed to be a compiler bug.

Possibly related to [#SI-5251].

@scabug
Copy link
Author

scabug commented Jul 3, 2012

Imported From: https://issues.scala-lang.org/browse/SI-6019?orig=1
Reporter: Mechanical snail (mechanicalsnail)
Affected Versions: 2.9.1, 2.9.2
Duplicates #5565

@scabug
Copy link
Author

scabug commented Jul 3, 2012

@paulp said:
Duplicate of #5565. Workaround is to skip App and write a main method.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants