Skip to content
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

object generation compiles successfully. #12322

Closed
kynthus opened this issue Jan 26, 2021 · 7 comments · Fixed by scala/scala#9457
Closed

object generation compiles successfully. #12322

kynthus opened this issue Jan 26, 2021 · 7 comments · Fixed by scala/scala#9457
Assignees
Milestone

Comments

@kynthus
Copy link

kynthus commented Jan 26, 2021

reproduction steps

using Scala 2.13.4,

I can compile by instantiating an object.
The following code produces a java.lang.IllegalAccessError at runtime:

// ObjectNew.scala

object MyObj {
  val a: Int = 123
  val b: Double = 456.789
  val c: String = "ABC"
}

object ObjectNew {
  def main(args: Array[String]): Unit = {
    val mo: MyObj.type = new MyObj.type() // here
  }
}
# scalac -version
Scala compiler version 2.13.4 -- Copyright 2002-2020, LAMP/EPFL and Lightbend, Inc.
# scalac ObjectNew.scala
# scala ObjectNew
Exception in thread "main" java.lang.IllegalAccessError: tried to access method MyObj$.<init>()V from class Main$
        at Main$.main(ObjectNew.scala:11)
        at Main.main(ObjectNew.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at scala.reflect.internal.util.ScalaClassLoader.$anonfun$run$2(ScalaClassLoader.scala:105)
        at scala.reflect.internal.util.ScalaClassLoader.asContext(ScalaClassLoader.scala:40)
        at scala.reflect.internal.util.ScalaClassLoader.asContext$(ScalaClassLoader.scala:37)
        at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:130)
        at scala.reflect.internal.util.ScalaClassLoader.run(ScalaClassLoader.scala:105)
        at scala.reflect.internal.util.ScalaClassLoader.run$(ScalaClassLoader.scala:97)
        at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:130)
        at scala.tools.nsc.CommonRunner.run(ObjectRunner.scala:29)
        at scala.tools.nsc.CommonRunner.run$(ObjectRunner.scala:28)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:43)
        at scala.tools.nsc.CommonRunner.runAndCatch(ObjectRunner.scala:35)
        at scala.tools.nsc.CommonRunner.runAndCatch$(ObjectRunner.scala:34)
        at scala.tools.nsc.AbstractScriptRunner.runCompiled(ScriptRunner.scala:168)
        at scala.tools.nsc.AbstractScriptRunner.$anonfun$runScript$1(ScriptRunner.scala:177)
        at scala.tools.nsc.AbstractScriptRunner.$anonfun$withCompiledScript$9(ScriptRunner.scala:154)
        at scala.tools.nsc.util.package$.waitingForThreads(package.scala:55)
        at scala.tools.nsc.AbstractScriptRunner.runScript(ScriptRunner.scala:151)
        at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:74)
        at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:91)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:103)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:108)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

In Scala 2.13.3 or older, a compile error.

[root@localhost ~]# scalac -version
Scala compiler version 2.13.3 -- Copyright 2002-2020, LAMP/EPFL and Lightbend, Inc.
[root@localhost ~]# scalac ObjectNew.scala
ObjectNew.scala:11: error: class type required but MyObj.type found
    val mo: MyObj.type = new MyObj.type()
                                  ^
1 error

problem

Unable to detect object instantiation error at compile time.

@Jasper-M
Copy link
Member

Jasper-M commented Jan 26, 2021

If you wrap it in a class you get an AssertionError.

class Wrapper {
  object MyObj
  val obj = new MyObj.type
}
Click for AssertionError
java.lang.AssertionError: assertion failed: 
  transformCaseApply: name = MyObj tree = MyObj / class scala.reflect.internal.Trees$Ident
     while compiling: <pastie>
        during phase: refchecks
     library version: version 2.13.4
    compiler version: version 2.13.4

  last tree to typer: This(class Wrapper)
       tree position: line 3 of <pastie>
            tree tpe: Wrapper.this.type
              symbol: class Wrapper
   symbol definition: class Wrapper extends AnyRef (a ClassSymbol)
      symbol package: <empty>
       symbol owners: class Wrapper
           call site: object MyObj in class Wrapper in package <empty>

== Source file context for tree position ==

     1 class Wrapper {
     2   object MyObj
     3   val obj = new MyObj.type
     4 }
     5 
	at scala.reflect.internal.SymbolTable.throwAssertionError(SymbolTable.scala:170)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:1786)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:81)
	at scala.reflect.internal.Trees$SingletonTypeTree.transform(Trees.scala:913)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:1847)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:81)
	at scala.reflect.internal.Trees$New.transform(Trees.scala:733)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:1847)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:81)
	at scala.reflect.internal.Trees$Select.transform(Trees.scala:852)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:1847)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:81)
	at scala.reflect.internal.Trees$Apply.transform(Trees.scala:786)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:1847)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:81)
	at scala.reflect.internal.Trees$ValDef.$anonfun$transform$4(Trees.scala:433)
	at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2633)
	at scala.reflect.internal.Trees$ValDef.transform(Trees.scala:432)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:1847)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transformStat(RefChecks.scala:1228)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transformStats(RefChecks.scala:1212)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transformStats(RefChecks.scala:81)
	at scala.reflect.internal.Trees$Template.transform(Trees.scala:544)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:1847)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:81)
	at scala.reflect.api.Trees$Transformer.transformTemplate(Trees.scala:2595)
	at scala.reflect.internal.Trees$ClassDef.$anonfun$transform$2(Trees.scala:361)
	at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2633)
	at scala.reflect.internal.Trees$ClassDef.transform(Trees.scala:360)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:1847)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transformStat(RefChecks.scala:1240)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transformStats(RefChecks.scala:1212)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transformStats(RefChecks.scala:81)
	at scala.reflect.internal.Trees$PackageDef.$anonfun$transform$1(Trees.scala:342)
	at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2633)
	at scala.reflect.internal.Trees$PackageDef.transform(Trees.scala:342)
	at scala.tools.nsc.typechecker.RefChecks$RefCheckTransformer.transform(RefChecks.scala:1847)
	at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:182)
	at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:32)
	at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:454)
	at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:401)
	at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1515)
	at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1499)
	at scala.tools.nsc.Global$Run.compileSources(Global.scala:1491)
	at scala.tools.nsc.interpreter.IMain.compileSourcesKeepingRun(IMain.scala:431)
	at scala.tools.nsc.interpreter.IMain.compileSources(IMain.scala:439)
	at scala.tools.nsc.interpreter.shell.ILoop$paste$.compilePaste(ILoop.scala:855)
	at scala.tools.nsc.interpreter.shell.ILoop.$anonfun$pasteCommand$13(ILoop.scala:826)
	at scala.tools.nsc.interpreter.shell.ReplReporterImpl.indenting(Reporter.scala:51)
	at scala.tools.nsc.interpreter.shell.ILoop.pasteCommand(ILoop.scala:830)
	at scala.tools.nsc.interpreter.shell.ILoop.$anonfun$standardCommands$8(ILoop.scala:201)
	at scala.tools.nsc.interpreter.shell.LoopCommands$LineCmd.apply(LoopCommands.scala:160)
	at scala.tools.nsc.interpreter.shell.LoopCommands.colonCommand(LoopCommands.scala:122)
	at scala.tools.nsc.interpreter.shell.LoopCommands.colonCommand$(LoopCommands.scala:120)
	at scala.tools.nsc.interpreter.shell.ILoop.colonCommand(ILoop.scala:45)
	at scala.tools.nsc.interpreter.shell.ILoop.command(ILoop.scala:431)
	at scala.tools.nsc.interpreter.shell.ILoop.processLine(ILoop.scala:440)
	at scala.tools.nsc.interpreter.shell.ILoop.loop(ILoop.scala:458)
	at scala.tools.nsc.interpreter.shell.ILoop.run(ILoop.scala:968)
	at xsbt.ConsoleInterface.run(ConsoleInterface.scala:78)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sbt.internal.inc.AnalyzingCompiler.call(AnalyzingCompiler.scala:248)
	at sbt.internal.inc.AnalyzingCompiler.console(AnalyzingCompiler.scala:210)
	at sbt.Console.console0$1(Console.scala:48)
	at sbt.Console.$anonfun$apply$2(Console.scala:51)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
	at sbt.util.InterfaceUtil$$anon$1.get(InterfaceUtil.scala:10)
	at sbt.TrapExit$App.run(TrapExit.scala:257)
	at java.lang.Thread.run(Thread.java:748)

@dwijnand dwijnand added this to the 2.13.5 milestone Jan 26, 2021
@dwijnand
Copy link
Member

The assertion is:

              assert(sym != NoSymbol, "transformCaseApply: name = " + name.debugString + " tree = " + tree + " / " + tree.getClass) //debug

and that output above is:

>   transformCaseApply: name = MyObj tree = MyObj / class scala.reflect.internal.Trees$Ident

@sjrd
Copy link
Member

sjrd commented Jan 26, 2021

Could this have been caused by scala/scala#9279 ?

@Jasper-M
Copy link
Member

@sjrd Yes, it affects this check.

@Jasper-M
Copy link
Member

Something even more ominous:

scala> object Foo
object Foo

scala> type Bar = Foo.type
type Bar

scala> val a = new Bar
val a: Foo.type = Foo$@678e08c0

scala> val b = new Bar
val b: Foo.type = Foo$@1fa8d460

scala> a == b
val res2: Boolean = false

@SethTisue
Copy link
Member

SethTisue commented Jan 26, 2021

@kynthus nice catch!
@Jasper-M thanks for jumping on this

@kynthus
Copy link
Author

kynthus commented Jan 26, 2021

Everyone, Thanks.

I don't know if it's related, but it seems that it can be inherited.

scala> object Foo
object Foo

scala> type Bar = Foo.type
type Bar

scala> class Baz extends Bar
class Baz

scala> class Baz extends Foo.type // java.lang.AssertionError

I hope it will be fixed at the same time.

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.

5 participants