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

ClassCastException or compiler crash in LazyEither #557

Closed
xuwei-k opened this issue Oct 7, 2013 · 3 comments
Closed

ClassCastException or compiler crash in LazyEither #557

xuwei-k opened this issue Oct 7, 2013 · 3 comments
Milestone

Comments

@xuwei-k
Copy link
Member

xuwei-k commented Oct 7, 2013

Scala 2.10.x and 2.11.0-M5

scala> scalaz.LazyEither.lazyRight[Int](1).bimap(identity, identity).fold(x => x, x => x)
java.lang.ClassCastException: $anonfun$1 cannot be cast to java.lang.Integer
        at scala.runtime.BoxesRunTime.unboxToInt(BoxesRunTime.java:106)
        at scala.Function0$class.apply$mcI$sp(Function0.scala:40)
        at scala.runtime.AbstractFunction0.apply$mcI$sp(AbstractFunction0.scala:12)
        at $anonfun$5.apply(<console>:8)
        at $anonfun$5.apply(<console>:8)
        at scalaz.LazyEither$class.fold(LazyEither.scala:12)
        at scalaz.LazyRight.fold(LazyEither.scala:94)
        at .<init>(<console>:8)
        at .<clinit>(<console>)
        at .<init>(<console>:7)
        at .<clinit>(<console>)
        at $print(<console>)
        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:606)
        at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)
        at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:983)
        at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:573)
        at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:604)
        at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:568)
        at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:745)
        at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:790)
        at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:702)
        at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:566)
        at scala.tools.nsc.interpreter.ILoop.innerLoop$1(ILoop.scala:573)
        at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:576)
        at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:867)
        at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:822)
        at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:822)
        at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
        at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:822)
        at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:889)
        at xsbt.ConsoleInterface.run(ConsoleInterface.scala:69)
        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:606)
        at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:102)
        at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:77)
        at sbt.Console.sbt$Console$$console0$1(Console.scala:23)
        at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:24)
        at sbt.TrapExit$.sbt$TrapExit$$executeMain$1(TrapExit.scala:33)
        at sbt.TrapExit$$anon$1.run(TrapExit.scala:42)

Scala 2.9.x

scala> scalaz.LazyEither.lazyRight[Int](1).bimap(identity, identity).fold(x => x, x => x)
exception when traversing ((x: => Int) => scala.this.Predef.identity[=> Int](x))
exception when traversing {
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}
exception when traversing scalaz.LazyEither.lazyRight[Int].apply[Int](1).bimap[() => Int, () => Int]({
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}, {
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
})
exception when traversing scalaz.LazyEither.lazyRight[Int].apply[Int](1).bimap[() => Int, () => Int]({
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}, {
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}).fold
exception when traversing scalaz.LazyEither.lazyRight[Int].apply[Int](1).bimap[() => Int, () => Int]({
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}, {
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}).fold[Int]
exception when traversing scalaz.LazyEither.lazyRight[Int].apply[Int](1).bimap[() => Int, () => Int]({
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}, {
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}).fold[Int](((x: => => Int) => x), ((x: => => Int) => x))
exception when traversing private[this] val res1: Int = scalaz.LazyEither.lazyRight[Int].apply[Int](1).bimap[() => Int, () => Int]({
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}, {
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}).fold[Int](((x: => => Int) => x), ((x: => => Int) => x))
exception when traversing java.lang.Object with ScalaObject {
  def this(): object $line2.$read.$iw.$iw = {
    $iw.super.this();
    ()
  };
  private[this] val res1: Int = scalaz.LazyEither.lazyRight[Int].apply[Int](1).bimap[() => Int, () => Int]({
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}, {
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}).fold[Int](((x: => => Int) => x), ((x: => => Int) => x));
  <stable> <accessor> def res1: Int = $iw.this.res1
}
exception when traversing final object $iw extends java.lang.Object with ScalaObject {
  def this(): object $line2.$read.$iw.$iw = {
    $iw.super.this();
    ()
  };
  private[this] val res1: Int = scalaz.LazyEither.lazyRight[Int].apply[Int](1).bimap[() => Int, () => Int]({
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}, {
  ((x: => Int) => scala.this.Predef.identity[=> Int](x))
}).fold[Int](((x: => => Int) => x), ((x: => => Int) => x));
  <stable> <accessor> def res1: Int = $iw.this.res1
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:889)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformStats(Trees.scala:889)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:797)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.mainTransform(UnCurry.scala:602)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transform(UnCurry.scala:148)
        at scala.tools.nsc.ast.Trees$Transformer.transformTemplate(Trees.scala:875)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:767)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:766)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:765)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.mainTransform(UnCurry.scala:605)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transform(UnCurry.scala:148)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:891)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:889)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformStats(Trees.scala:889)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:797)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.mainTransform(UnCurry.scala:602)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transform(UnCurry.scala:148)
        at scala.tools.nsc.ast.Trees$Transformer.transformTemplate(Trees.scala:875)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:767)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:766)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:765)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.mainTransform(UnCurry.scala:605)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transform(UnCurry.scala:148)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:891)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:889)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformStats(Trees.scala:889)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:797)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:49)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.mainTransform(UnCurry.scala:602)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transform(UnCurry.scala:148)
        at scala.tools.nsc.ast.Trees$Transformer.transformTemplate(Trees.scala:875)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:767)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:766)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:765)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:53)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.mainTransform(UnCurry.scala:605)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transform(UnCurry.scala:148)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:891)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.mainTransform(UnCurry.scala:605)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transform(UnCurry.scala:148)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transform(UnCurry.scala:148)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transform(UnCurry.scala:148)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:891)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:889)
        at scala.collection.immutable.List.loop$1(List.scala:148)
        at scala.collection.immutable.List.mapConserve(List.scala:164)
        at scala.tools.nsc.ast.Trees$Transformer.transformStats(Trees.scala:889)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$1.apply(Trees.scala:761)
        at scala.tools.nsc.ast.Trees$Transformer$$anonfun$transform$1.apply(Trees.scala:761)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:760)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:49)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$2.apply(TypingTransformers.scala:51)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$2.apply(TypingTransformers.scala:51)
        at scala.tools.nsc.ast.Trees$Transformer.atOwner(Trees.scala:899)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:38)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:31)
        at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:51)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.mainTransform(UnCurry.scala:605)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transform(UnCurry.scala:148)
        at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:892)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transformUnit(UnCurry.scala:142)
        at scala.tools.nsc.transform.UnCurry$UnCurryTransformer.transformUnit(UnCurry.scala:126)
        at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:30)
        at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:329)
        at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:297)
        at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:297)
        at scala.collection.Iterator$class.foreach(Iterator.scala:772)
        at scala.collection.mutable.ListBuffer$$anon$1.foreach(ListBuffer.scala:318)
        at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:297)
        at scala.tools.nsc.Global$Run.compileSources(Global.scala:953)
        at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compileAndSaveRun(IMain.scala:756)
        at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compile(IMain.scala:731)
        at scala.tools.nsc.interpreter.IMain$Request.compile(IMain.scala:873)
        at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:576)
        at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:543)
        at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:694)
        at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:745)
        at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:651)
        at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:542)
        at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:550)
        at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:822)
        at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:851)
        at xsbt.ConsoleInterface.run(ConsoleInterface.scala:69)
        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:606)
        at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:102)
        at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:77)
        at sbt.Console.sbt$Console$$console0$1(Console.scala:23)
        at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:24)
        at sbt.TrapExit$.sbt$TrapExit$$executeMain$1(TrapExit.scala:33)
        at sbt.TrapExit$$anon$1.run(TrapExit.scala:42)

That entry seems to have slain the compiler.  Shall I replay
your session? I can re-run each line except the last one.
[y/n]

another example (not using scalaz) https://gist.github.com/xuwei-k/6862748

@xuwei-k
Copy link
Member Author

xuwei-k commented Oct 7, 2013

I think this is Scalac bug /cc @retronym

@retronym
Copy link
Member

retronym commented Oct 7, 2013

Yep. We shouldn't be ending up with => Int as type arguments in the last line below.

scala> val b = scalaz.LazyEither.lazyRight[Int](1).bimap(x => x, x => x)
b: scalaz.LazyEither[Int,Int] = LazyRight(<function0>)

scala> val b = scalaz.LazyEither.lazyRight[Int](1).bimap(x => x, identity(_))
b: scalaz.LazyEither[Int,Int] = LazyRight(<function0>)

scala> val b = scalaz.LazyEither.lazyRight[Int](1).bimap(x => x, identity _)
b: scalaz.LazyEither[Int,=> Int] = LazyRight(<function0>)

@xuwei-k
Copy link
Member Author

xuwei-k commented Oct 7, 2013

@xuwei-k xuwei-k closed this as completed Oct 23, 2013
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants