Skip to content

Compiler crash with inline #2980

Closed
Closed
@jpmartin2

Description

@jpmartin2

With the following:

trait Foo {
  def apply[~>[_,_]](x: Int ~> Int): Int ~> Int
}

object Foo {
  inline def foo: Foo = new Foo {
    def apply[~>[_,_]](x: Int ~> Int): Int ~> Int = x
  }

  def main(args: Array[String]): Unit = {
    val x = foo((x: Int) => x)
  }
}

I get the dotty compiler to crash with:

error when pickling tree [_$3, _$4] ->  >: Nothing <: Any
error when pickling tree def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
error when pickling tree () extends Object() with Foo { 
  def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
}
error when pickling tree final class $anon() extends Object() with Foo { 
  def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
}
error when pickling tree {
  final class $anon() extends Object() with Foo { 
    def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
  }
  new Object with Foo{...}(): Foo
}
error when pickling tree /* inlined from Foo*/ 
  {
    {
      final class $anon() extends Object() with Foo { 
        def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
      }
      new Object with Foo{...}(): Foo
    }
  }
error when pickling tree /* inlined from Foo*/ 
  {
    {
      final class $anon() extends Object() with Foo { 
        def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
      }
      (new Object with Foo{...}(): Foo)
    }
  }
.apply
error when pickling tree /* inlined from Foo*/ 
  {
    {
      final class $anon() extends Object() with Foo { 
        def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
      }
      (new Object with Foo{...}(): Foo)
    }
  }
.apply[Function1]
error when pickling tree /* inlined from Foo*/ 
  {
    {
      final class $anon() extends Object() with Foo { 
        def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
      }
      (new Object with Foo{...}(): Foo)
    }
  }
.apply[Function1](
  {
    def $anonfun(x: Int): Int = x
    closure($anonfun)
  }
)
error when pickling tree val x: Int => Int = 
  /* inlined from Foo*/ 
    {
      {
        final class $anon() extends Object() with Foo { 
          def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
        }
        (new Object with Foo{...}(): Foo)
      }
    }
  .apply[Function1](
    {
      def $anonfun(x: Int): Int = x
      closure($anonfun)
    }
  )
error when pickling tree {
  val x: Int => Int = 
    /* inlined from Foo*/ 
      {
        {
          final class $anon() extends Object() with Foo { 
            def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = 
              x
          }
          (new Object with Foo{...}(): Foo)
        }
      }
    .apply[Function1](
      {
        def $anonfun(x: Int): Int = x
        closure($anonfun)
      }
    )
  ()
}
error when pickling tree def main(args: Array[String]): Unit = 
  {
    val x: Int => Int = 
      /* inlined from Foo*/ 
        {
          {
            final class $anon() extends Object() with Foo { 
              def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int]
                 = 
              x
            }
            (new Object with Foo{...}(): Foo)
          }
        }
      .apply[Function1](
        {
          def $anonfun(x: Int): Int = x
          closure($anonfun)
        }
      )
    ()
  }
error when pickling tree () extends Object() { this: Foo.type => 
  @{
    final class $anon() extends Object() with Foo { 
      def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
    }
    (new Object with Foo{...}(): Foo)
  } inline def foo: Foo = 
    {
      final class $anon() extends Object() with Foo { 
        def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
      }
      new Object with Foo{...}(): Foo
    }
  def main(args: Array[String]): Unit = 
    {
      val x: Int => Int = 
        /* inlined from Foo*/ 
          {
            {
              final class $anon() extends Object() with Foo { 
                def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): 
                  ~>[Int, Int]
                 = x
              }
              (new Object with Foo{...}(): Foo)
            }
          }
        .apply[Function1](
          {
            def $anonfun(x: Int): Int = x
            closure($anonfun)
          }
        )
      ()
    }
}
error when pickling tree @scala.annotation.internal.SourceFile("test.scala") final module class Foo()
   extends
 Object() { this: Foo.type => 
  @{
    final class $anon() extends Object() with Foo { 
      def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
    }
    (new Object with Foo{...}(): Foo)
  } inline def foo: Foo = 
    {
      final class $anon() extends Object() with Foo { 
        def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
      }
      new Object with Foo{...}(): Foo
    }
  def main(args: Array[String]): Unit = 
    {
      val x: Int => Int = 
        /* inlined from Foo*/ 
          {
            {
              final class $anon() extends Object() with Foo { 
                def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): 
                  ~>[Int, Int]
                 = x
              }
              (new Object with Foo{...}(): Foo)
            }
          }
        .apply[Function1](
          {
            def $anonfun(x: Int): Int = x
            closure($anonfun)
          }
        )
      ()
    }
}
error when pickling tree package <empty> {
  @scala.annotation.internal.SourceFile("test.scala") <trait> interface trait 
    Foo
  () extends Object { 
    def apply[~> <: [_$1, _$2] => Any](x: ~>[Int, Int]): ~>[Int, Int]
  }
  final lazy module val Foo: Foo = new Foo()
  @scala.annotation.internal.SourceFile("test.scala") final module class Foo()
     extends
   Object() { this: Foo.type => 
    @{
      final class $anon() extends Object() with Foo { 
        def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
      }
      (new Object with Foo{...}(): Foo)
    } inline def foo: Foo = 
      {
        final class $anon() extends Object() with Foo { 
          def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): ~>[Int, Int] = x
        }
        new Object with Foo{...}(): Foo
      }
    def main(args: Array[String]): Unit = 
      {
        val x: Int => Int = 
          /* inlined from Foo*/ 
            {
              {
                final class $anon() extends Object() with Foo { 
                  def apply[~> <: [_$3, _$4] => Any](x: ~>[Int, Int]): 
                    ~>[Int, Int]
                   = x
                }
                (new Object with Foo{...}(): Foo)
              }
            }
          .apply[Function1](
            {
              def $anonfun(x: Int): Int = x
              closure($anonfun)
            }
          )
        ()
      }
  }
}

exception occurred while compiling test.scala
Exception in thread "main" java.lang.AssertionError: assertion failed: type _$3
	at scala.Predef$.assert(Predef.scala:170)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef(TreePickler.scala:284)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleParam(TreePickler.scala:304)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleParams$$anonfun$2(TreePickler.scala:310)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleParams(TreePickler.scala:310)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$33(TreePickler.scala:533)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:533)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTpt(TreePickler.scala:278)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef$$anonfun$2(TreePickler.scala:292)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef(TreePickler.scala:296)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleParam(TreePickler.scala:304)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleParams$$anonfun$2(TreePickler.scala:310)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleParams(TreePickler.scala:310)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleAllParams$1(TreePickler.scala:448)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$22(TreePickler.scala:454)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef$$anonfun$2(TreePickler.scala:289)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef(TreePickler.scala:296)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:454)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleStats$$anonfun$2(TreePickler.scala:315)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleStats(TreePickler.scala:315)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$24(TreePickler.scala:485)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:486)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef$$anonfun$2(TreePickler.scala:291)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef(TreePickler.scala:296)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:456)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$8$$anonfun$1(TreePickler.scala:396)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$8(TreePickler.scala:396)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:396)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$17(TreePickler.scala:425)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:425)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:352)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$2(TreePickler.scala:362)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:364)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$1(TreePickler.scala:356)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:358)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTreeUnlessEmpty(TreePickler.scala:281)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef$$anonfun$2(TreePickler.scala:294)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef(TreePickler.scala:296)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:445)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$8$$anonfun$1(TreePickler.scala:396)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$8(TreePickler.scala:396)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:396)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTreeUnlessEmpty(TreePickler.scala:281)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef$$anonfun$2(TreePickler.scala:294)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef(TreePickler.scala:296)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:454)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleStats$$anonfun$2(TreePickler.scala:315)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleStats(TreePickler.scala:315)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$24(TreePickler.scala:485)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:486)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef$$anonfun$2(TreePickler.scala:291)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleDef(TreePickler.scala:296)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:456)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleStats$$anonfun$2(TreePickler.scala:315)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleStats(TreePickler.scala:315)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree$$anonfun$26(TreePickler.scala:501)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.core.tasty.TreePickler.withLength(TreePickler.scala:32)
	at dotty.tools.dotc.core.tasty.TreePickler.pickleTree(TreePickler.scala:501)
	at dotty.tools.dotc.core.tasty.TreePickler.pickle$$anonfun$1(TreePickler.scala:597)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.core.tasty.TreePickler.pickle(TreePickler.scala:597)
	at dotty.tools.dotc.transform.Pickler.run$$anonfun$7$$anonfun$1(Pickler.scala:52)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.transform.Pickler.run$$anonfun$7(Pickler.scala:72)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.transform.Pickler.run(Pickler.scala:72)
	at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$2(Phases.scala:283)
	at scala.collection.immutable.List.map(List.scala:284)
	at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:285)
	at dotty.tools.dotc.transform.Pickler.runOn(Pickler.scala:76)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1$$anonfun$1(Run.scala:82)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
	at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:90)
	at scala.compat.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.util.Stats$.monitorHeartBeat(Stats.scala:76)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:95)
	at dotty.tools.dotc.Run.compileSources(Run.scala:64)
	at dotty.tools.dotc.Run.compile(Run.scala:48)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:26)
	at dotty.tools.dotc.Driver.process(Driver.scala:124)
	at dotty.tools.dotc.Driver.process(Driver.scala:93)
	at dotty.tools.dotc.Driver.process(Driver.scala:105)
	at dotty.tools.dotc.Driver.main(Driver.scala:132)
	at dotty.tools.dotc.Main.main(Main.scala)

Interestingly, removing the use of higher kinded types (and monomorphising ~> into => manually), or turning the inline def into val compiles just fine.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions