Skip to content

Crash by combining match types, intersection types and structural types #13889

@Katrix

Description

@Katrix

Compiler version

3.1.0

Minimized code

class DiscordRecord(fields: Map[String, Any]) extends Selectable {
  def selectDynamic(name: String): Any = fields(name)
}

type IdentifyScope = DiscordRecord {
  val username: String
}

type IncludeIf[Stated <: String, Requirement <: String, IfMatch] = Seq[Stated] match {
  case Seq[Requirement] => IfMatch
  case _ => Any
}

type RawUser[Scopes <: String] = DiscordRecord & IncludeIf[Scopes, "identify", IdentifyScope]

val obj: RawUser["identify"] = ???
obj.username

Removing the intersection type in RawUser fixes the problem. It's not needed in this case, but using an intersection type with something not redundant also crashes. The crash only happens when it would otherwise compile (I think). Changing obj.username to obj.foo does not compile sucessfully without a crash. Similarly, changing RawUser["identify"] to RawUser["foo"] also does not compile sucessfully without a crash.

Output (click arrow to expand)

Details
exception while typing this.obj.username of class class dotty.tools.dotc.ast.Trees$Select # -1
exception while typing @scala.annotation.internal.SourceFile("src/main/scala/testing/testing.scala")
  class
 testing() extends Object() {
  class DiscordRecord(fields: scala.collection.immutable.Map[String, Any])
     extends
   Object(), Selectable {
    private val fields: scala.collection.immutable.Map[String, Any]
    def selectDynamic(name: String): Any = DiscordRecord.this.fields.apply(name)
    private val $outer: testing.testing
    final def testing$testing$DiscordRecord$$$outer: testing.testing =
      DiscordRecord.this.$outer
  }
  type IdentifyScope = testing.this.DiscordRecord{username: String}
  type IncludeIf =

      ([Stated <: String, Requirement <: String, IfMatch] =>>
        scala.collection.immutable.Seq[Stated] match {
          case scala.collection.immutable.Seq[Requirement] => IfMatch
          case _ => Any
        }
      )
     @_
  type RawUser =

      [Scopes <: String] =>> testing.this.DiscordRecord &
        testing.this.IncludeIf[Scopes, ("identify" : String),
          testing.this.IdentifyScope
        ]

  def obj: testing.this.RawUser[("identify" : String)] = ???
  this.obj.username
} of class class dotty.tools.dotc.ast.Trees$TypeDef # -1
exception while typing package testing {
  @scala.annotation.internal.SourceFile("src/main/scala/testing/testing.scala")
    class
   testing() extends Object() {
    class DiscordRecord(fields: scala.collection.immutable.Map[String, Any])
       extends
     Object(), Selectable {
      private val fields: scala.collection.immutable.Map[String, Any]
      def selectDynamic(name: String): Any =
        DiscordRecord.this.fields.apply(name)
      private val $outer: testing.testing
      final def testing$testing$DiscordRecord$$$outer: testing.testing =
        DiscordRecord.this.$outer
    }
    type IdentifyScope = testing.this.DiscordRecord{username: String}
    type IncludeIf =

        ([Stated <: String, Requirement <: String, IfMatch] =>>
          scala.collection.immutable.Seq[Stated] match {
            case scala.collection.immutable.Seq[Requirement] => IfMatch
            case _ => Any
          }
        )
       @_
    type RawUser =

        [Scopes <: String] =>> testing.this.DiscordRecord &
          testing.this.IncludeIf[Scopes, ("identify" : String),
            testing.this.IdentifyScope
          ]

    def obj: testing.this.RawUser[("identify" : String)] = ???
    this.obj.username
  }
} of class class dotty.tools.dotc.ast.Trees$PackageDef # -1
[info] exception occurred while compiling D:\DevProjects\Incubating\AckCordNext\src\main\scala\testing\testing.scala
java.lang.AssertionError: assertion failed:  <none> while compiling D:\DevProjects\Incubating\AckCordNext\src\main\scala\testing\testing.scala
[error] ## Exception when compiling 15 sources to D:\DevProjects\Incubating\AckCordNext\target\scala-3.1.0\classes
[error] java.lang.AssertionError: assertion failed:  <none>
[error] scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8)
[error] dotty.tools.dotc.transform.Erasure$Typer.typedSelect(Erasure.scala:721)
[error] dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2725)
[error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2817)
[error] dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:121)
[error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:2883)
[error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:2887)
[error] dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2936)
[error] dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2959)
[error] dotty.tools.dotc.transform.Erasure$Typer.typedStats(Erasure.scala:1053)
[error] dotty.tools.dotc.typer.Typer.typedClassDef(Typer.scala:2409)
[error] dotty.tools.dotc.transform.Erasure$Typer.typedClassDef(Erasure.scala:1043)
[error] dotty.tools.dotc.typer.Typer.typedTypeOrClassDef$2(Typer.scala:2743)
[error] dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2747)
[error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2817)
[error] dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:121)
[error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:2883)
[error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:2887)
[error] dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2909)
[error] dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2959)
[error] dotty.tools.dotc.transform.Erasure$Typer.typedStats(Erasure.scala:1053)
[error] dotty.tools.dotc.typer.Typer.typedPackageDef(Typer.scala:2532)
[error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2788)
[error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2818)
[error] dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:121)
[error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:2883)
[error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:2887)
[error] dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3003)
[error] dotty.tools.dotc.transform.Erasure.run(Erasure.scala:132)
[error] dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:308)
[error] scala.collection.immutable.List.map(List.scala:246)
[error] dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:309)
[error] dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:261)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
[error] dotty.tools.dotc.Run.runPhases$5(Run.scala:272)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:280)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
[error] dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:68)
[error] dotty.tools.dotc.Run.compileUnits(Run.scala:289)
[error] dotty.tools.dotc.Run.compileSources(Run.scala:222)
[error] dotty.tools.dotc.Run.compile(Run.scala:206)
[error] dotty.tools.dotc.Driver.doCompile(Driver.scala:39)
[error] dotty.tools.xsbt.CompilerBridgeDriver.run(CompilerBridgeDriver.java:88)
[error] dotty.tools.xsbt.CompilerBridge.run(CompilerBridge.java:22)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:91)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:192)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:247)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:182)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:163)
[error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:163)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:210)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:528)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:528)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:175)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:173)
[error] sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:459)
[error] sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:116)
[error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56)
[error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52)
[error] sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:263)
[error] sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:414)
[error] sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:501)
[error] sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:401)
[error] sbt.internal.inc.Incremental$.apply(Incremental.scala:167)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:528)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:482)
[error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:420)
[error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
[error] sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:2357)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$2(Defaults.scala:2314)
[error] sbt.internal.io.Retry$.apply(Retry.scala:46)
[error] sbt.internal.io.Retry$.apply(Retry.scala:28)
[error] sbt.internal.io.Retry$.apply(Retry.scala:23)
[error] sbt.internal.server.BspCompileTask$.compute(BspCompileTask.scala:31)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:2310)
[error] scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error] sbt.std.Transform$$anon$4.work(Transform.scala:68)
[error] sbt.Execute.$anonfun$submit$2(Execute.scala:282)
[error] sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23)
[error] sbt.Execute.work(Execute.scala:291)
[error] sbt.Execute.$anonfun$submit$1(Execute.scala:282)
[error] sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
[error] sbt.CompletionService$$anon$2.call(CompletionService.scala:64)
[error] java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] java.lang.Thread.run(Thread.java:748)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions