Skip to content

Crash on new line after extension def without result type or RHS #18265

Closed
@prolativ

Description

@prolativ

Compiler version

3.2.0, 3.3.0, 3.3.2-RC1-bin-20230720-98b452d-NIGHTLY
Used not to crash in 3.1.0

Minimized code

trait Foo

val foo = new Foo:
  extension (s: String)
    def twice

(Note the empty line at the end)

Output (click arrow to expand)

-- [E019] Syntax Error: /Users/mpalka/Projects/besom/Crash.scala:5:13 ----------
5 |    def twice
  |             ^
  |             Missing return type
  |
  | longer explanation available when compiling with `-explain`
error while checking  extends Foo {
  extension (s: String) def twice = null
}
error while checking new Foo {
  extension (s: String) def twice = null
}
error while checking val foo =
  new Foo {
    extension (s: String) def twice = null
  }
error while checking package <empty> {
  trait Foo {}
  val foo =
    new Foo {
      extension (s: String) def twice = null
    }
}
exception occurred while parser /Users/mpalka/Projects/besom/Crash.scala
exception occurred while compiling /Users/mpalka/Projects/besom/Crash.scala
java.lang.AssertionError: assertion failed: position error, parent span does not contain child span
parent      =  extends Foo {
  extension (s: String) def twice = null
} # -1,
parent span = <21..67>,
child       = extension (s: String) def twice = null # -1,
child span  = [32..68] while compiling /Users/mpalka/Projects/besom/Crash.scala
Exception in thread "main" java.lang.AssertionError: assertion failed: position error, parent span does not contain child span
parent      =  extends Foo {
  extension (s: String) def twice = null
} # -1,
parent span = <21..67>,
child       = extension (s: String) def twice = null # -1,
child span  = [32..68]
        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.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:437)
        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:247)
        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:263)
        at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:271)
        at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:280)
        at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
        at dotty.tools.dotc.Run.compileUnits(Run.scala:280)
        at dotty.tools.dotc.Run.compileSources(Run.scala:195)
        at dotty.tools.dotc.Run.compile(Run.scala:179)
        at dotty.tools.dotc.Driver.doCompile(Driver.scala:35)
        at dotty.tools.dotc.Driver.process(Driver.scala:195)
        at dotty.tools.dotc.Driver.process(Driver.scala:163)
        at dotty.tools.dotc.Driver.process(Driver.scala:175)
        at dotty.tools.dotc.Driver.main(Driver.scala:205)
        at dotty.tools.dotc.Main.main(Main.scala)

Expectations

The compilation should fail but without a crash. Note that there's no crash if the empty line gets removed from the end of the file.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions