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

Compiler internal error(s) on returned if expression #2018

Closed
scabug opened this issue May 26, 2009 · 2 comments
Closed

Compiler internal error(s) on returned if expression #2018

scabug opened this issue May 26, 2009 · 2 comments
Assignees

Comments

@scabug
Copy link

scabug commented May 26, 2009

Compiler internal errors reported when compiling the following code fragment:

class A {
  val b = new B

  def getChildren = List(new A).elements

  class B {
    private def check = true

    private def getAncestor(p: A): A = {
      val c = (p.getChildren.find(_.b.check)) match {case Some(d) => d case None => p}

      if (c == p) p else c.b.getAncestor(c)
    }
  }
}

Compiler was 2.7.4-final on vista.

Build / Run env was IntelliJ IDEA 8.1.2 with scala plugin 0.2.24468

The following compiler output was produced:

Information:Compilation completed with 57 errors and 0 warnings
Information:57 errors
Information:0 warnings
Error:Scalac internal error: class java.lang.reflect.InvocationTargetException [sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.jetbrains.plugins.scala.compiler.rt.ScalacRunner.main(ScalacRunner.java:74)][scala.tools.nsc.typechecker.Contexts$$Context.error(Contexts.scala:352)
scala.tools.nsc.typechecker.Infer$$Inferencer.error(Infer.scala:266)
scala.tools.nsc.typechecker.Infer$$Inferencer.typeError(Infer.scala:276)
scala.tools.nsc.typechecker.Infer$$Inferencer.typeErrorTree(Infer.scala:285)
scala.tools.nsc.typechecker.Typers$$Typer.adapt(Typers.scala:862)
scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3363)
scala.tools.nsc.typechecker.Typers$$Typer.typedArg(Typers.scala:1649)
scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$typedArgs$$2.apply(Typers.scala:1690)
scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$typedArgs$$2.apply(Typers.scala:1690)
scala.List$$.map2(List.scala:333)
scala.tools.nsc.typechecker.Typers$$Typer.typedArgs(Typers.scala:1690)
scala.tools.nsc.typechecker.Typers$$Typer.doTypedApply(Typers.scala:1774)
scala.tools.nsc.typechecker.Typers$$Typer.typedApply$$1(Typers.scala:2657)
scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3257)
scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3358)
scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3395)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.rewriteTailCall(TailCalls.scala:321)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:285)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:232)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:215)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:144)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:173)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:1478)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:1476)
scala.List$$.loop$$1(List.scala:300)
scala.List$$.mapConserve(List.scala:317)
scala.tools.nsc.ast.Trees$$Transformer.transformStats(Trees.scala:1476)
scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1384)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:210)
scala.tools.nsc.ast.Trees$$Transformer.transformTemplate(Trees.scala:1462)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:1356)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:1356)
scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:1484)
scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1355)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:202)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:1478)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:1476)
scala.List$$.loop$$1(List.scala:300)
scala.List$$.mapConserve(List.scala:317)
scala.tools.nsc.ast.Trees$$Transformer.transformStats(Trees.scala:1476)
scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1384)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:210)
scala.tools.nsc.ast.Trees$$Transformer.transformTemplate(Trees.scala:1462)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:1356)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:1356)
scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:1484)
scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1355)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:202)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:1478)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:1476)
scala.List$$.loop$$1(List.scala:300)
scala.List$$.mapConserve(List.scala:317)
scala.tools.nsc.ast.Trees$$Transformer.transformStats(Trees.scala:1476)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$1.apply(Trees.scala:1352)
scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$1.apply(Trees.scala:1352)
scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:1484)
scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1351)
scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:198)
scala.tools.nsc.ast.Trees$$Transformer.transformUnit(Trees.scala:1479)
scala.tools.nsc.transform.TailCalls$$Phase.apply(TailCalls.scala:37)
scala.tools.nsc.Global$$GlobalPhase.applyPhase(Global.scala:267)
scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$run$$1.apply(Global.scala:246)
scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$run$$1.apply(Global.scala:246)
scala.Iterator$$class.foreach(Iterator.scala:414)
scala.collection.mutable.ListBuffer$$$$anon$$1.foreach(ListBuffer.scala:266)
scala.tools.nsc.Global$$GlobalPhase.run(Global.scala:246)
scala.tools.nsc.Global$$Run.compileSources(Global.scala:574)
scala.tools.nsc.Global$$Run.compile(Global.scala:667)
scala.tools.nsc.Main$$.process(Main.scala:73)
scala.tools.nsc.Main$$.main(Main.scala:87)
scala.tools.nsc.Main.main(Main.scala)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.jetbrains.plugins.scala.compiler.rt.ScalacRunner.main(ScalacRunner.java:74)]
Error:sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Error:sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
Error:sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
Error:java.lang.reflect.Method.invoke(Method.java:597)
Error:org.jetbrains.plugins.scala.compiler.rt.ScalacRunner.main(ScalacRunner.java:74)
Error:Caused by scala.tools.nsc.symtab.Types$$TypeError: type mismatch;
Error:found   : c.b.type (with underlying type c.B)
Error:required: A.this.B
Error:scala.tools.nsc.typechecker.Contexts$$Context.error(Contexts.scala:352)
Error:scala.tools.nsc.typechecker.Infer$$Inferencer.error(Infer.scala:266)
Error:scala.tools.nsc.typechecker.Infer$$Inferencer.typeError(Infer.scala:276)
Error:scala.tools.nsc.typechecker.Infer$$Inferencer.typeErrorTree(Infer.scala:285)
Error:scala.tools.nsc.typechecker.Typers$$Typer.adapt(Typers.scala:862)
Error:scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3363)
Error:scala.tools.nsc.typechecker.Typers$$Typer.typedArg(Typers.scala:1649)
Error:scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$typedArgs$$2.apply(Typers.scala:1690)
Error:scala.List$$.map2(List.scala:333)
Error:scala.tools.nsc.typechecker.Typers$$Typer.typedArgs(Typers.scala:1690)
Error:scala.tools.nsc.typechecker.Typers$$Typer.doTypedApply(Typers.scala:1774)
Error:scala.tools.nsc.typechecker.Typers$$Typer.typedApply$$1(Typers.scala:2657)
Error:scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3257)
Error:scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3358)
Error:scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3395)
Error:scala.tools.nsc.transform.TailCalls$$TailCallElimination.rewriteTailCall(TailCalls.scala:321)
Error:scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:285)
Error:scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:232)
Error:scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:215)
Error:scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:144)
Error:scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:173)
Error:scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:1478)
Error:scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:1476)
Error:scala.List$$.loop$$1(List.scala:300)
Error:scala.List$$.mapConserve(List.scala:317)
Error:scala.tools.nsc.ast.Trees$$Transformer.transformStats(Trees.scala:1476)
Error:scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1384)
Error:scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:210)
Error:scala.tools.nsc.ast.Trees$$Transformer.transformTemplate(Trees.scala:1462)
Error:scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:1356)
Error:scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:1484)
Error:scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1355)
Error:scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:202)
Error:scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$1.apply(Trees.scala:1352)
Error:scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1351)
Error:scala.tools.nsc.transform.TailCalls$$TailCallElimination.transform(TailCalls.scala:198)
Error:scala.tools.nsc.ast.Trees$$Transformer.transformUnit(Trees.scala:1479)
Error:scala.tools.nsc.transform.TailCalls$$Phase.apply(TailCalls.scala:37)
Error:scala.tools.nsc.Global$$GlobalPhase.applyPhase(Global.scala:267)
Error:scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$run$$1.apply(Global.scala:246)
Error:scala.Iterator$$class.foreach(Iterator.scala:414)
Error:scala.collection.mutable.ListBuffer$$$$anon$$1.foreach(ListBuffer.scala:266)
Error:scala.tools.nsc.Global$$GlobalPhase.run(Global.scala:246)
Error:scala.tools.nsc.Global$$Run.compileSources(Global.scala:574)
Error:scala.tools.nsc.Global$$Run.compile(Global.scala:667)
Error:scala.tools.nsc.Main$$.process(Main.scala:73)
Error:scala.tools.nsc.Main$$.main(Main.scala:87)
Error:scala.tools.nsc.Main.main(Main.scala)

Observations:
Catching the value returned by the last line of the function getAncestor "if (c == p) p else c.b.getAncestor(c)" in a val and returning the val from the function allows the code fragment to compile successfully.

@scabug
Copy link
Author

scabug commented May 26, 2009

Imported From: https://issues.scala-lang.org/browse/SI-2018?orig=1
Reporter: Don Mackenzie (donmackenzie)

@scabug
Copy link
Author

scabug commented Apr 15, 2010

@paulp said:
(In r21599) Improved @tailrec error messages to specify the reason.
In the process fixed old bug involving tail call transformation.
Closes #3275, #2018. Review by dragos.

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