Skip to content

Dotty crash declaring a function that returns an int 0a #19755

Closed
@romaincomeau

Description

@romaincomeau

I was trying to see what kind of error message would come up if I tried compiling0a instead of 0 and stumbled upon a compiler crash.

Compiler version

scala 3.3.1

Minimized code

trait Monoid[A]:
  def combine(a1: A, a2: A): A
  def empty: A

object Monoid:
  lazy val intAddition: Monoid[Int] = new:
    def combine(x: Int, y: Int) = x + y
    val empty = 0a
end Monoid

Output (click arrow to expand)

romaincomeau@phoenix fpinscala2 % scala-cli compile --server=false src/main/scala/fpinscala/exercises/monoids/Minimized.scala
-- [E018] Syntax Error: /Users/romaincomeau/dev/git/fpinscala2/src/main/scala/fpinscala/exercises/monoids/Minimized.scala:8:18
8 |    val empty = 0a
  |                  ^
  |                  expression expected but unindent found
  |
  | longer explanation available when compiling with `-explain`
error while checking  {
  def combine(x: Int, y: Int) = x + y
  val empty = 0 a null
}
error while checking new  {
  def combine(x: Int, y: Int) = x + y
  val empty = 0 a null
}
error while checking lazy val intAddition: Monoid[Int] =
  new  {
    def combine(x: Int, y: Int) = x + y
    val empty = 0 a null
  }
error while checking  {
  lazy val intAddition: Monoid[Int] =
    new  {
      def combine(x: Int, y: Int) = x + y
      val empty = 0 a null
    }
}
error while checking module object Monoid {
  lazy val intAddition: Monoid[Int] =
    new  {
      def combine(x: Int, y: Int) = x + y
      val empty = 0 a null
    }
}
error while checking package <empty> {
  trait Monoid[A] {
    def combine(a1: A, a2: A): A
    def empty: A
  }
  module object Monoid {
    lazy val intAddition: Monoid[Int] =
      new  {
        def combine(x: Int, y: Int) = x + y
        val empty = 0 a null
      }
  }
}
exception occurred while parser /Users/romaincomeau/dev/git/fpinscala2/src/main/scala/fpinscala/exercises/monoids/Minimized.scala

  exception occurred while compiling List(/Users/romaincomeau/dev/git/fpinscala2/src/main/scala/fpinscala/exercises/monoids/Minimized.scala)

  An unhandled exception was thrown in the compiler.
  Please file a crash report here:
  https://github.com/lampepfl/dotty/issues/new/choose

     while compiling: <no file>
        during phase: <no phase>
                mode: Mode(ImplicitsEnabled)
     library version: version 2.13.10
    compiler version: version 3.3.1
            settings: -classpath /Users/romaincomeau/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.1/scala3-library_3-3.3.1.jar:/Users/romaincomeau/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.10/scala-library-2.13.10.jar -d /Users/romaincomeau/dev/git/fpinscala2/src/main/scala/fpinscala/exercises/monoids/.scala-build/monoids_103be31561-73523f4214/classes/main -java-output-version 17 -sourceroot /Users/romaincomeau/dev/git/fpinscala2/src/main/scala/fpinscala/exercises/monoids

                tree: EmptyTree
       tree position: :<unknown>
           tree type: <notype>
              symbol: val <none>
           call site: package <root> in module class <root>

  == Source file context for tree position ==


Exception in thread "main" java.lang.AssertionError: assertion failed: position error, parent span does not contain child span
parent      =  {
  def combine(x: Int, y: Int) = x + y
  val empty = 0 a null
} # -1,
parent span = <117..180>,
child       = val empty = 0 a null # -1,
child span  = [166..170..181]
	at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8)
	at dotty.tools.dotc.ast.Positioned.check$1(Positioned.scala:175)
	at dotty.tools.dotc.ast.Positioned.check$1$$anonfun$3(Positioned.scala:205)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:333)
	at dotty.tools.dotc.ast.Positioned.check$1(Positioned.scala:205)
	at dotty.tools.dotc.ast.Positioned.checkPos(Positioned.scala:226)
	at dotty.tools.dotc.ast.Positioned.check$1(Positioned.scala:200)
	at dotty.tools.dotc.ast.Positioned.checkPos(Positioned.scala:226)
	at dotty.tools.dotc.ast.Positioned.check$1(Positioned.scala:200)
	at dotty.tools.dotc.ast.Positioned.checkPos(Positioned.scala:226)
	at dotty.tools.dotc.ast.Positioned.check$1(Positioned.scala:200)
	at dotty.tools.dotc.ast.Positioned.check$1$$anonfun$3(Positioned.scala:205)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:333)
	at dotty.tools.dotc.ast.Positioned.check$1(Positioned.scala:205)
	at dotty.tools.dotc.ast.Positioned.checkPos(Positioned.scala:226)
	at dotty.tools.dotc.ast.Positioned.check$1(Positioned.scala:200)
	at dotty.tools.dotc.ast.Positioned.checkPos(Positioned.scala:226)
	at dotty.tools.dotc.ast.Positioned.check$1(Positioned.scala:200)
	at dotty.tools.dotc.ast.Positioned.check$1$$anonfun$3(Positioned.scala:205)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:333)
	at dotty.tools.dotc.ast.Positioned.check$1(Positioned.scala:205)
	at dotty.tools.dotc.ast.Positioned.checkPos(Positioned.scala:226)
	at dotty.tools.dotc.parsing.Parser.parse$$anonfun$1(ParserPhase.scala:38)
	at dotty.tools.dotc.parsing.Parser.parse$$anonfun$adapted$1(ParserPhase.scala:39)
	at scala.Function0.apply$mcV$sp(Function0.scala:42)
	at dotty.tools.dotc.core.Phases$Phase.monitor(Phases.scala:440)
	at dotty.tools.dotc.parsing.Parser.parse(ParserPhase.scala:39)
	at dotty.tools.dotc.parsing.Parser.runOn$$anonfun$1(ParserPhase.scala:48)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:333)
	at dotty.tools.dotc.parsing.Parser.runOn(ParserPhase.scala:48)
	at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:246)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1321)
	at dotty.tools.dotc.Run.runPhases$1(Run.scala:262)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:270)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:279)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:279)
	at dotty.tools.dotc.Run.compileSources(Run.scala:194)
	at dotty.tools.dotc.Run.compile(Run.scala:179)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:37)
	at dotty.tools.dotc.Driver.process(Driver.scala:197)
	at dotty.tools.dotc.Driver.process(Driver.scala:165)
	at dotty.tools.dotc.Driver.process(Driver.scala:177)
	at dotty.tools.dotc.Driver.main(Driver.scala:207)
	at dotty.tools.dotc.Main.main(Main.scala)
Compilation failed

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions