Skip to content

Compiler Crashes With Assertion Failure When Early Initializer Contains A Val With Visibility private[this] #7713

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 Aug 1, 2013 · 4 comments

Comments

@scabug
Copy link

scabug commented Aug 1, 2013

When an early initializer contains a val with private[this] visibility, the compiler throws an UncaughtAssertionError.

Here is a minimal example program that reproduces the error:

// Fail.scala
package nimrandsLibrary.dnd4E

class Base {

}

class Super extends {
  
  private[this] val _field = 0 //must run before calling Base's constructor!

} with Base {
  
}

Here is the stack trace:

java.lang.AssertionError: assertion failed: 
     while compiling: /Users/kpyancey/Projects/NimrandsLibrary.React/src/nimrandsLibrary/dnd4E/Fail.scala
        during phase: constructors
     library version: version 2.10.2
    compiler version: version 2.10.2
  reconstructed args: -deprecation -Xpluginsdir /Applications/Eclipse/configuration/org.eclipse.osgi/bundles/209/1/.cp/lib -encoding MacRoman -bootclasspath /Applications/Eclipse/configuration/org.eclipse.osgi/bundles/235/1/.cp/lib/scala-library.jar -classpath /Users/kpyancey/Projects/NimrandsLibrary.React/bin:/Applications/Eclipse/configuration/org.eclipse.osgi/bundles/235/1/.cp/lib/scala-swing.jar:/Applications/Eclipse/configuration/org.eclipse.osgi/bundles/235/1/.cp/lib/scala-actors.jar:/Applications/Eclipse/configuration/org.eclipse.osgi/bundles/234/1/.cp/lib/scala-reflect.jar:/Users/kpyancey/Downloads/scalatest_2.10-1.9.1.jar -explaintypes -Ywarn-dead-code -javabootclasspath /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/ui.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsse.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jce.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/charsets.jar:/System/Library/Java/Extensions/AppleScriptEngine.jar:/System/Library/Java/Extensions/dns_sd.jar:/System/Library/Java/Extensions/j3daudio.jar:/System/Library/Java/Extensions/j3dcore.jar:/System/Library/Java/Extensions/j3dutils.jar:/System/Library/Java/Extensions/jai_codec.jar:/System/Library/Java/Extensions/jai_core.jar:/System/Library/Java/Extensions/mlibwrapper_jai.jar:/System/Library/Java/Extensions/MRJToolkit.jar:/System/Library/Java/Extensions/QTJava.zip:/System/Library/Java/Extensions/vecmath.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/apple_provider.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/dnsns.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/localedata.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/sunjce_provider.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/sunpkcs11.jar -unchecked

  last tree to typer: Apply(constructor DistinctMultiVar)
              symbol: constructor DistinctMultiVar in class DistinctMultiVar (flags: <method> <triedcooking>)
   symbol definition: def <init>(): nimrandsLibrary.react.DistinctMultiVar
                 tpe: nimrandsLibrary.react.DistinctMultiVar
       symbol owners: constructor DistinctMultiVar -> class DistinctMultiVar -> package react
      context owners: class Super -> package dnd4E

== Enclosing template or block ==

Template( // val <local Super>: <notype> in class Super, tree.tpe=nimrandsLibrary.dnd4E.Super
  "nimrandsLibrary.dnd4E.Base" // parents
  ValDef(
    private
    "_"
    <tpt>
    <empty>
  )
  // 2 statements
  ValDef( // private[this] val _field: Int in class Super
    private <local> <implclass/presuper>
    "_field"
    <tpt> // tree.tpe=Int
    <empty>
  )
  DefDef( // def <init>(): nimrandsLibrary.dnd4E.Super in class Super
    <method>
    "<init>"
    []
    List(Nil)
    <tpt> // tree.tpe=nimrandsLibrary.dnd4E.Super
    Block( // tree.tpe=Unit
      // 2 statements
      ValDef( // private[this] val _field: Int
        private <local> <implclass/presuper>
        "_field"
        <tpt> // tree.tpe=Int
        0
      )
      Apply( // def <init>(): nimrandsLibrary.dnd4E.Base in class Base, tree.tpe=nimrandsLibrary.dnd4E.Base
        Super.super."<init>" // def <init>(): nimrandsLibrary.dnd4E.Base in class Base, tree.tpe=()nimrandsLibrary.dnd4E.Base
        Nil
      )
      ()
    )
  )
)

== Expanded type of tree ==

TypeRef(
  TypeSymbol(class DistinctMultiVar extends MultiSignalWrapper)
)


	at scala.tools.nsc.transform.Constructors$ConstructorTransformer.transformClassTemplate(Constructors.scala:154)
	at scala.tools.nsc.transform.Constructors$ConstructorTransformer$$anonfun$transform$1.apply(Constructors.scala:572)
	at scala.tools.nsc.transform.Constructors$ConstructorTransformer$$anonfun$transform$1.apply(Constructors.scala:572)
	at scala.reflect.internal.Trees$class.deriveClassDef(Trees.scala:1613)
	at scala.reflect.internal.SymbolTable.deriveClassDef(SymbolTable.scala:13)
	at scala.tools.nsc.transform.Constructors$ConstructorTransformer.transform(Constructors.scala:572)
	at scala.tools.nsc.transform.Constructors$ConstructorTransformer.transform(Constructors.scala:30)
	at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2927)
	at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2925)
	at scala.collection.immutable.List.loop$1(List.scala:170)
	at scala.collection.immutable.List.mapConserve(List.scala:186)
	at scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:2925)
	at scala.reflect.internal.Trees$$anonfun$itransform$7.apply(Trees.scala:1298)
	at scala.reflect.internal.Trees$$anonfun$itransform$7.apply(Trees.scala:1298)
	at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2936)
	at scala.reflect.internal.Trees$class.itransform(Trees.scala:1297)
	at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
	at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
	at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2897)
	at scala.tools.nsc.transform.Constructors$ConstructorTransformer.transform(Constructors.scala:574)
	at scala.tools.nsc.transform.Constructors$ConstructorTransformer.transform(Constructors.scala:30)
	at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:227)
	at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:30)
	at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:464)
	at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:431)
	at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:431)
	at scala.collection.Iterator$class.foreach(Iterator.scala:727)
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
	at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:431)
	at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1583)
	at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1557)
	at scala.tools.nsc.Global$Run.compileSources(Global.scala:1553)
	at scala.tools.nsc.Global$Run.compile(Global.scala:1662)
	at xsbt.CachedCompiler0.run(CompilerInterface.scala:121)
	at xsbt.CachedCompiler0.run(CompilerInterface.scala:97)
	at xsbt.CompilerInterface.run(CompilerInterface.scala:27)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:102)
	at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:48)
	at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:41)
	at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply$mcV$sp(AggressiveCompile.scala:98)
	at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply(AggressiveCompile.scala:98)
	at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply(AggressiveCompile.scala:98)
	at sbt.compiler.AggressiveCompile.sbt$compiler$AggressiveCompile$$timed(AggressiveCompile.scala:159)
	at sbt.compiler.AggressiveCompile$$anonfun$3.compileScala$1(AggressiveCompile.scala:97)
	at sbt.compiler.AggressiveCompile$$anonfun$3.apply(AggressiveCompile.scala:142)
	at sbt.compiler.AggressiveCompile$$anonfun$3.apply(AggressiveCompile.scala:86)
	at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:30)
	at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:28)
	at sbt.inc.Incremental$.cycle(Incremental.scala:73)
	at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:33)
	at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:32)
	at sbt.inc.Incremental$.manageClassfiles(Incremental.scala:41)
	at sbt.inc.Incremental$.compile(Incremental.scala:32)
	at sbt.inc.IncrementalCompile$.apply(Compile.scala:25)
	at sbt.compiler.AggressiveCompile.compile2(AggressiveCompile.scala:150)
	at sbt.compiler.AggressiveCompile.compile1(AggressiveCompile.scala:70)
	at sbt.compiler.AggressiveCompile.apply(AggressiveCompile.scala:45)
	at sbt.compiler.IC$.compile(IncrementalCompiler.scala:22)
	at scala.tools.eclipse.buildmanager.sbtintegration.EclipseSbtBuildManager.runCompiler(EclipseSbtBuildManager.scala:133)
	at scala.tools.eclipse.buildmanager.sbtintegration.EclipseSbtBuildManager.update(EclipseSbtBuildManager.scala:123)
	at scala.tools.eclipse.buildmanager.sbtintegration.EclipseSbtBuildManager.build(EclipseSbtBuildManager.scala:178)
	at scala.tools.eclipse.ScalaProject.build(ScalaProject.scala:664)
	at scala.tools.eclipse.ScalaBuilder.build(ScalaBuilder.scala:119)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:728)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:239)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:292)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:295)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:351)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:374)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:143)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:241)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
@scabug
Copy link
Author

scabug commented Aug 1, 2013

Imported From: https://issues.scala-lang.org/browse/SI-7713?orig=1
Reporter: Kevin Yancey (nimrand)
Affected Versions: 2.10.2
Duplicates #6309

@scabug
Copy link
Author

scabug commented Aug 1, 2013

Kevin Yancey (nimrand) said:
This slightly less minimized example illustrates a situation where its necessary to use early initialization and private[this] together. The field is passed to the base constructor, but it must have private[this] visibility or else it break covariance.

package nimrandsLibrary.dnd4E

class Signal[T] {
  //snip
}

class Base[+T](signal : Signal[T]) {
  //does stuff with signal
}

class Super[+T] extends {
  
  private[this] val _field = new Signal[T]()

  //performs operations on _field

} with Base[T](_field) {
  
  //does other stuff with _field
  
}

@scabug
Copy link
Author

scabug commented Aug 1, 2013

@paulp said:
Duplicate of #6309, already fixed in 2.11.

@scabug scabug closed this as completed Aug 1, 2013
@scabug
Copy link
Author

scabug commented Aug 5, 2013

@retronym said:
Possible workaround: use of protected[this] rather than private[this].

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