Skip to content

producing tree with incorrect owner in quotations API #13809

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

Closed
rssh opened this issue Oct 25, 2021 · 6 comments · Fixed by #13824
Closed

producing tree with incorrect owner in quotations API #13809

rssh opened this issue Oct 25, 2021 · 6 comments · Fixed by #13824

Comments

@rssh
Copy link
Contributor

rssh commented Oct 25, 2021

Compiler version

3.1.0
Minimization is still big, but self-contained.

Note, that code above create new scopes only via quotation API.

Minimized code

File1 (macroses)

package x

import scala.annotation._
import scala.quoted._

trait CB[+T]

object CBM:
  def pure[T](t:T):CB[T] = ???
  def map[A,B](fa:CB[A])(f: A=>B):CB[B] = ???
  def flatMap[A,B](fa:CB[A])(f: A=>CB[B]):CB[B] = ???
  def spawn[A](op: =>CB[A]): CB[A] = ???
  

@compileTimeOnly("await should be inside async block")
def await[T](f: CB[T]): T = ???


trait CpsExpr[T:Type](prev: Seq[Expr[?]]):

   def fLast(using Quotes): Expr[CB[T]]
   def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] 
   def append[A:Type](chunk: CpsExpr[A])(using Quotes): CpsExpr[A]
   def syncOrigin(using Quotes): Option[Expr[T]]
   def map[A:Type](f: Expr[T => A])(using Quotes): CpsExpr[A] =
           MappedCpsExpr[T,A](Seq(),this,f)
   def flatMap[A:Type](f: Expr[T => CB[A]])(using Quotes): CpsExpr[A] =
           FlatMappedCpsExpr[T,A](Seq(),this,f)
 
   def transformed(using Quotes): Expr[CB[T]] =
      import quotes.reflect._
      Block(prev.toList.map(_.asTerm), fLast.asTerm).asExprOf[CB[T]]
        
 
case class GenericSyncCpsExpr[T:Type](prev: Seq[Expr[?]],last: Expr[T]) extends CpsExpr[T](prev):
 
       override def fLast(using Quotes): Expr[CB[T]] =
         '{  CBM.pure(${last}:T) }
 
       override def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] =
         copy(prev = exprs ++: prev)
       
       override def syncOrigin(using Quotes): Option[Expr[T]] = 
         import quotes.reflect._
         Some(Block(prev.toList.map(_.asTerm), last.asTerm).asExprOf[T])  
 
       override def append[A:Type](e: CpsExpr[A])(using Quotes) =
         e.prependExprs(Seq(last)).prependExprs(prev)
 
       override def map[A:Type](f: Expr[T => A])(using Quotes): CpsExpr[A] =
         copy(last = '{ $f($last) })
 
       override def flatMap[A:Type](f: Expr[T => CB[A]])(using Quotes): CpsExpr[A] =
         GenericAsyncCpsExpr[A](prev, '{ CBM.flatMap(CBM.pure($last))($f) } )
 
 
abstract class AsyncCpsExpr[T:Type](
                               prev: Seq[Expr[?]]
                             ) extends CpsExpr[T](prev):
 
   override def append[A:Type](e: CpsExpr[A])(using Quotes): CpsExpr[A] =
            flatMap( '{ (x:T) => ${e.transformed} })
 
   override def syncOrigin(using Quotes): Option[Expr[T]] = None
 
 
 
case class GenericAsyncCpsExpr[T:Type](
                             prev: Seq[Expr[?]],
                             fLastExpr: Expr[CB[T]]
                             ) extends AsyncCpsExpr[T](prev):
 
   override def fLast(using Quotes): Expr[CB[T]] = fLastExpr

   override def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] =
         copy(prev = exprs ++: prev)
 
   override def map[A:Type](f: Expr[T => A])(using Quotes): CpsExpr[A] =
            MappedCpsExpr(Seq(),this,f)
 
   override def flatMap[A:Type](f: Expr[T => CB[A]])(using Quotes): CpsExpr[A] =
            FlatMappedCpsExpr(Seq(),this,f)
 

 
case class MappedCpsExpr[S:Type, T:Type](
                               prev: Seq[Expr[?]],
                               point: CpsExpr[S],
                               mapping: Expr[S=>T]
                               ) extends AsyncCpsExpr[T](prev):
 
   override def fLast(using Quotes): Expr[CB[T]] =
            '{ CBM.map(${point.transformed})($mapping) }
 
   override def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] =
           copy(prev = exprs ++: prev)
                     

 
case class FlatMappedCpsExpr[S:Type, T:Type](
                               prev: Seq[Expr[?]],
                               point: CpsExpr[S],
                               mapping: Expr[S => CB[T]]
                              ) extends AsyncCpsExpr[T](prev):
 
     override def fLast(using Quotes): Expr[CB[T]] =
                   '{ CBM.flatMap(${point.transformed})($mapping) }
 
     override def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] =
           copy(prev = exprs ++: prev)
 
 
class ValRhsFlatMappedCpsExpr[T:Type, V:Type](using thisQuotes: Quotes)
                                      (
                                       prev: Seq[Expr[?]],
                                       oldValDef: quotes.reflect.ValDef,
                                       cpsRhs: CpsExpr[V],
                                       next: CpsExpr[T]
                                      )
                                     extends AsyncCpsExpr[T](prev) {
 
      override def fLast(using Quotes):Expr[CB[T]] =
           import quotes.reflect._
           next.syncOrigin match
             case Some(nextOrigin) =>
               // owner of this block is incorrect
              '{
                 CBM.map(${cpsRhs.transformed})((vx:V) =>
                           ${buildAppendBlockExpr('vx, nextOrigin)})
               }
             case  None =>
              '{
                CBM.flatMap(${cpsRhs.transformed})((v:V)=>
                           ${buildAppendBlockExpr('v, next.transformed)})
              }
            
 
      override def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] =
           ValRhsFlatMappedCpsExpr(using thisQuotes)(exprs ++: prev,oldValDef,cpsRhs,next)
 
      override def append[A:quoted.Type](e: CpsExpr[A])(using Quotes) =
           ValRhsFlatMappedCpsExpr(using thisQuotes)(prev,oldValDef,cpsRhs,next.append(e))
 
 
      private def buildAppendBlock(using Quotes)(rhs:quotes.reflect.Term,
                                                     exprTerm:quotes.reflect.Term): quotes.reflect.Term =
           import quotes.reflect._
           import scala.quoted.Expr
 
           val castedOldValDef = oldValDef.asInstanceOf[quotes.reflect.ValDef]
           val valDef = ValDef(castedOldValDef.symbol, Some(rhs.changeOwner(castedOldValDef.symbol)))
           exprTerm match 
               case Block(stats,last) =>
                     Block(valDef::stats, last)
               case other =>
                     Block(valDef::Nil,other)
 
      private def buildAppendBlockExpr[A:Type](using Quotes)(rhs: Expr[V], expr:Expr[A]):Expr[A] =
           import quotes.reflect._
           buildAppendBlock(rhs.asTerm,expr.asTerm).asExprOf[A]
 
}
 
 
object CpsExpr:
 
    def sync[T:Type](f: Expr[T]): CpsExpr[T] =
      GenericSyncCpsExpr[T](Seq(), f)
 
    def async[T:Type](f: Expr[CB[T]]): CpsExpr[T] =
      GenericAsyncCpsExpr[T](Seq(), f)
 
 
object Async:

   transparent inline def transform[T](inline expr: T) =  ${
      Async.transformImpl[T]('expr)
   }
      
   def transformImpl[T:Type](f: Expr[T])(using Quotes): Expr[CB[T]] =
      import quotes.reflect._
      println(s"before transformed: ${f.show}")
      val cpsExpr = rootTransform[T](f)
      val r = '{ CBM.spawn(${cpsExpr.transformed}) }               
      println(s"transformed value: ${r.show}")
      r
    
   def rootTransform[T:Type](f: Expr[T])(using Quotes): CpsExpr[T] = {
      import quotes.reflect._
      f match 
         case '{ while ($cond) { $repeat }  } =>
            val cpsRepeat = rootTransform(repeat.asExprOf[Unit])
            CpsExpr.async('{
                   def _whilefun():CB[Unit] =
                      if ($cond) {
                         ${cpsRepeat.flatMap('{(x:Unit) => _whilefun()}).transformed}
                      } else {
                         CBM.pure(())
                      }
                   _whilefun()
            }.asExprOf[CB[T]])
         case _ =>
            val fTree = f.asTerm
            fTree match {
               case fun@Apply(fun1@TypeApply(obj2,targs2), args1) =>
                      if (obj2.symbol.name == "await") {
                         val awaitArg = args1.head
                         CpsExpr.async(awaitArg.asExprOf[CB[T]])
                      } else {
                         ???
                      }
               case Assign(left,right) =>
                       left match
                         case id@Ident(x) =>
                            right.tpe.widen.asType match
                               case '[r] =>
                                  val cpsRight = rootTransform(right.asExprOf[r])
                                  CpsExpr.async(
                                     cpsRight.map[T]( 
                                       '{ (x:r) => ${Assign(left,'x.asTerm).asExprOf[T] } 
                                        }).transformed )
                         case _ => ???
               case Block(prevs,last) =>
                      val rPrevs = prevs.map{ p =>
                         p match
                            case v@ValDef(vName,vtt,optRhs) =>
                              optRhs.get.tpe.widen.asType match
                                case '[l] =>
                                  val cpsRight = rootTransform(optRhs.get.asExprOf[l])
                                  ValRhsFlatMappedCpsExpr(using quotes)(Seq(), v, cpsRight, CpsExpr.sync('{}))
                            case t: Term =>
                             // TODO: rootTransform
                             t.asExpr match
                                  case '{ $p: tp } =>
                                         rootTransform(p)
                                  case other =>
                                         printf(other.show)
                                         throw RuntimeException(s"can't handle term in block: $other")
                            case other =>
                              printf(other.show)
                              throw RuntimeException(s"unknown tree type in block: $other")
                       }
                       val rLast = rootTransform(last.asExprOf[T])
                       val blockResult = rPrevs.foldRight(rLast)((e,s) => e.append(s))
                       val retval = CpsExpr.async(blockResult.transformed)
                       retval
                       //BlockTransform(cpsCtx).run(prevs,last)
               case id@Ident(name) =>
                       CpsExpr.sync(id.asExprOf[T]) 
               case tid@Typed(Ident(name), tp) =>
                      CpsExpr.sync(tid.asExprOf[T])
               case matchTerm@Match(scrutinee, caseDefs) =>
                      val nCases = caseDefs.map{ old => 
                         CaseDef.copy(old)(old.pattern, old.guard, rootTransform(old.rhs.asExprOf[T]).transformed.asTerm) 
                      }
                      CpsExpr.async(Match(scrutinee, nCases).asExprOf[CB[T]])
               case inlinedTerm@ Inlined(call,List(),body) =>
                         rootTransform(body.asExprOf[T])
               case constTerm@Literal(_)=>  
                       CpsExpr.sync(constTerm.asExprOf[T]) 
               case _ =>
                       throw RuntimeException(s"language construction is not supported: ${fTree}")
            }
   }

File2:

package x

object VP1:

   ///*
   def allocateServiceOperator(optInUsername: Option[String]): CB[Unit] = Async.transform {
      val username = optInUsername match
         case None =>
            while(false) {
               val nextResult = await(op1())
               val countResult = await(op1())
            }
         case Some(inUsername) =>
            val x = await(op1())
            inUsername
   }
   //*/

   def op1(): CB[String] = ???

Output (click arrow to expand)

``` [info] welcome to sbt 1.5.5 (Homebrew Java 17) [info] loading global plugins from /Users/rssh/.sbt/1.0/plugins [info] loading settings for project dotty-cps-async-build from plugins.sbt ... [info] loading project definition from /Users/rssh/work/oss/dotty-cps/dotty-cps-async/project [info] loading settings for project root from build.sbt,publish.sbt ... [info] set current project to root (in build file:/Users/rssh/work/oss/dotty-cps/dotty-cps-async/) [success] Total time: 0 s, completed 25 Oct 2021, 09:08:39 [info] compiling 1 Scala source to /Users/rssh/work/oss/dotty-cps/dotty-cps-async/jvm/target/scala-3.1.0/classes ... [success] Total time: 7 s, completed 25 Oct 2021, 09:08:46 [info] compiling 1 Scala source to /Users/rssh/work/oss/dotty-cps/dotty-cps-async/jvm/target/scala-3.1.0/test-classes ... before transformed: { val username: scala.Matchable = optInUsername match { case scala.None => while (false) { val nextResult: java.lang.String = x.Async$package.await[java.lang.String](x.VP1.op1()) val countResult: java.lang.String = x.Async$package.await[java.lang.String](x.VP1.op1()) () } case scala.Some(inUsername) => val x: java.lang.String = x.Async$package.await[java.lang.String](x.VP1.op1())
  (inUsername: java.lang.String)

}
()
}
transformed value: x.CBM.spawn[scala.Unit](x.CBM.map[scala.Unit | java.lang.String, scala.Unit](optInUsername match {
case scala.None =>
{
def _whilefun(): x.CB[scala.Unit] = if (false) x.CBM.flatMap[scala.Unit, scala.Unit](x.CBM.flatMapjava.lang.String, scala.Unit(((v: java.lang.String) => {
val nextResult: java.lang.String = v
x.CBM.mapjava.lang.String, scala.Unit(((vx: java.lang.String) => {
val countResult: java.lang.String = vx
()
}))
})))(((x: scala.Unit) => _whilefun())) else x.CBM.purescala.Unit
_whilefun()
}
case scala.Some(inUsername) =>
x.CBM.mapjava.lang.String, scala.Unit | java.lang.String(((vx₂: java.lang.String) => {
val x₂: java.lang.String = vx₂

  (inUsername: java.lang.String)
}))

})(((vx₃: scala.Unit | java.lang.String) => {
val username: scala.Matchable = vx₃
()
})))
[warn] -- [E129] Potential Issue Warning: /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala:6:90
[warn] 6 | def allocateServiceOperator(optInUsername: Option[String]): CB[Unit] = Async.transform {
[warn] | ^
[warn] |A pure expression does nothing in statement position; you may be omitting necessary parentheses
[warn] | This location contains code that was inlined from VP1.scala:6
[warn] 7 | val username = optInUsername match
[warn] 8 | case None =>
[warn] 9 | while(false) {
[warn] 10 | val nextResult = await(op1())
[warn] 11 | val countResult = await(op1())
[warn] 12 | }
[warn] 13 | case Some(inUsername) =>
[warn] 14 | val x = await(op1())
[warn] 15 | inUsername
[warn] 16 | }
java.util.NoSuchElementException: key not found: method $anonfun while traversing <inUsername#9650:String/T#819>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <<inUsername#9650:String/T#819> :String/T#819:String/T#819>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <
{
val x#11356: String/T#819
<<inUsername#9650:String/T#819> :String/T#819:String/T#819>
}
:String/T#819>
java.util.NoSuchElementException: key not found: method $anonfun while traversing def $anonfun#11353(vx#862275614: String/T#819): Object/T
java.util.NoSuchElementException: key not found: method $anonfun while traversing <
{
def $anonfun#11353(vx#862275614: String/T#819): Object/T
<closure(<$anonfun#11353:(vx#862275614: String/T#819): Object/T>):
Function1/T#217
>
}
:Function1/T#217>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597: Function1/T#217):
x#25.CB/T#3993
)

(<<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993)>():x#25.CB/T#3993>,
<
{
def $anonfun#11353(vx#862275614: String/T#819): Object/T
<closure(<$anonfun#11353:(vx#862275614: String/T#819): Object/T>):
Function1/T#217
>
}
:Function1/T#217>
):x#25.CB/T#3993>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <
{
<
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597: Function1/T#217):
x#25.CB/T#3993
)
>
(<<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993)>():x#25.CB/T#3993>,
<
{
def $anonfun#11353(vx#862275614: String/T#819): Object/T
<closure(<$anonfun#11353:(vx#862275614: String/T#819): Object/T>):
Function1/T#217
>
}
:Function1/T#217>
):x#25.CB/T#3993>
}
:x#25.CB/T#3993>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <return[[Unique matchResult 1]]
<
{
<
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597: Function1/T#217):
x#25.CB/T#3993
)
>
(<<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993)>():x#25.CB/T#3993>,
<
{
def $anonfun#11353(vx#862275614: String/T#819): Object/T
<closure(<$anonfun#11353:(vx#862275614: String/T#819): Object/T>):
Function1/T#217
>
}
:Function1/T#217>
):x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <
{
case val inUsername#9650: String/T#819
<return[[Unique matchResult 1]]
<
{
<
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597: Function1/T#217):
x#25.CB/T#3993
)
>
(<<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993)>():x#25.CB/T#3993>,
<
{
def $anonfun#11353(vx#862275614: String/T#819): Object/T
<closure(<$anonfun#11353:(vx#862275614: String/T#819): Object/T>
)
:Function1/T#217>
}
:Function1/T#217>
):x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
}
:Nothing/T#1314>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <if
<
<<[Unique x 1]#11848:Option/T#82>.isInstanceOf#3815:
([X0/T#1581425209 <: Object/T]#1581425209 => Boolean/T#94)
>
[Some/T#328]:Boolean/T#94>
then
<
{
case val inUsername#9650: String/T#819
<return[[Unique matchResult 1]]
<
{
<
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597: Function1/T#217
):
x#25.CB/T#3993)
>
(<<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993)>():x#25.CB/T#3993>,
<
{
def $anonfun#11353(vx#862275614: String/T#819): Object/T
<closure(
<$anonfun#11353:(vx#862275614: String/T#819): Object/T>
):Function1/T#217>
}
:Function1/T#217>
):x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
}
:Nothing/T#1314>
else <():Unit/T#157>:Unit/T#157>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <
{
case val [Unique x 1]#11848: Option/T#82
<if
<<<None#257:None/T#258>.==#1867:((x$0#478617181: Object/T): Boolean/T#94)>
(
<[Unique x 1]#11848:Option/T#82>):Boolean/T#94>
then
<return[[Unique matchResult 1]]
<
{
def _whilefun#11377(): x#25.CB/T#3993
<<_whilefun#11377:((): x#25.CB/T#3993)>():x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
else <():Unit/T#157>:Unit/T#157>
<if
<
<<[Unique x 1]#11848:Option/T#82>.isInstanceOf#3815:
([X0/T#1581425209 <: Object/T]#1581425209 => Boolean/T#94)
>
[Some/T#328]:Boolean/T#94>
then
<
{
case val inUsername#9650: String/T#819
<return[[Unique matchResult 1]]
<
{
<
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597:
Function1/T#217
): x#25.CB/T#3993)
>
(
<<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993)>():
x#25.CB/T#3993
>
,
<
{
def $anonfun#11353(vx#862275614: String/T#819): Object/T
<closure(
<$anonfun#11353:(vx#862275614: String/T#819): Object/T>
):Function1/T#217>
}
:Function1/T#217>
):x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
}
:Nothing/T#1314>
else <():Unit/T#157>:Unit/T#157>
<throw
<
<<new MatchError/T#331:MatchError/T#331>:
((obj#138727514: Object/T): MatchError/T#331)
>
(<[Unique x 1]#11848:Option/T#82>):MatchError/T#331>
:Nothing/T#1314>
}
:Nothing/T#1314>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <[Unique matchResult 1][x#25.CB/T#3993]:
<
{
case val [Unique x 1]#11848: Option/T#82
<if
<
<<None#257:None/T#258>.==#1867:
((x$0#478617181: Object/T): Boolean/T#94)
>
(<[Unique x 1]#11848:Option/T#82>):Boolean/T#94>
then
<return[[Unique matchResult 1]]
<
{
def _whilefun#11377(): x#25.CB/T#3993
<<_whilefun#11377:((): x#25.CB/T#3993)>():x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
else <():Unit/T#157>:Unit/T#157>
<if
<
<<[Unique x 1]#11848:Option/T#82>.isInstanceOf#3815:
([X0/T#1581425209 <: Object/T]#1581425209 => Boolean/T#94)
>
[Some/T#328]:Boolean/T#94>
then
<
{
case val inUsername#9650: String/T#819
<return[[Unique matchResult 1]]
<
{
<
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597:
Function1/T#217
): x#25.CB/T#3993)
>
(
<<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993)>():
x#25.CB/T#3993
>
,
<
{
def $anonfun#11353(vx#862275614: String/T#819): Object/T
<closure(
<$anonfun#11353:(vx#862275614: String/T#819): Object/T
>
):Function1/T#217>
}
:Function1/T#217>
):x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
}
:Nothing/T#1314>
else <():Unit/T#157>:Unit/T#157>
<throw
<
<<new MatchError/T#331:MatchError/T#331>:
((obj#138727514: Object/T): MatchError/T#331)
>
(<[Unique x 1]#11848:Option/T#82>):MatchError/T#331>
:Nothing/T#1314>
}
:Nothing/T#1314>
:x#25.CB/T#3993>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597: Function1/T#217):
x#25.CB/T#3993
)

(
<[Unique matchResult 1][x#25.CB/T#3993]:
<
{
case val [Unique x 1]#11848: Option/T#82
<if
<
<<None#257:None/T#258>.==#1867:
((x$0#478617181: Object/T): Boolean/T#94)
>
(<[Unique x 1]#11848:Option/T#82>):Boolean/T#94>
then
<return[[Unique matchResult 1]]
<
{
def _whilefun#11377(): x#25.CB/T#3993
<<_whilefun#11377:((): x#25.CB/T#3993)>():x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
else <():Unit/T#157>:Unit/T#157>
<if
<
<<[Unique x 1]#11848:Option/T#82>.isInstanceOf#3815:
([X0/T#1581425209 <: Object/T]#1581425209 => Boolean/T#94)
>
[Some/T#328]:Boolean/T#94>
then
<
{
case val inUsername#9650: String/T#819
<return[[Unique matchResult 1]]
<
{
<
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597:
Function1/T#217
): x#25.CB/T#3993)
>
(
<<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993)>():
x#25.CB/T#3993
>
,
<
{
def $anonfun#11353
(vx#862275614: String/T#819): Object/T
<closure(
<$anonfun#11353:
(vx#862275614: String/T#819): Object/T
>
):Function1/T#217>
}
:Function1/T#217>
):x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
}
:Nothing/T#1314>
else <():Unit/T#157>:Unit/T#157>
<throw
<
<<new MatchError/T#331:MatchError/T#331>:
((obj#138727514: Object/T): MatchError/T#331)
>
(<[Unique x 1]#11848:Option/T#82>):MatchError/T#331>
:Nothing/T#1314>
}
:Nothing/T#1314>
:x#25.CB/T#3993>
,
<
{
def $anonfun#11364(vx#46920594: Object/T): Unit/T#157
<closure(<$anonfun#11364:(vx#46920594: Object/T): Unit/T#157>:
scala#23.runtime#430.function#7204.JProcedure1/T#18612
):scala#23.runtime#430.function#7204.JProcedure1/T#18612>
}
:scala#23.runtime#430.function#7204.JProcedure1/T#18612>
):x#25.CB/T#3993>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <
{
<
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597: Function1/T#217):
x#25.CB/T#3993
)
>
(
<[Unique matchResult 1][x#25.CB/T#3993]:
<
{
case val [Unique x 1]#11848: Option/T#82
<if
<
<<None#257:None/T#258>.==#1867:
((x$0#478617181: Object/T): Boolean/T#94)
>
(<[Unique x 1]#11848:Option/T#82>):Boolean/T#94>
then
<return[[Unique matchResult 1]]
<
{
def _whilefun#11377(): x#25.CB/T#3993
<<_whilefun#11377:((): x#25.CB/T#3993)>():x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
else <():Unit/T#157>:Unit/T#157>
<if
<
<<[Unique x 1]#11848:Option/T#82>.isInstanceOf#3815:
([X0/T#1581425209 <: Object/T]#1581425209 => Boolean/T#94)
>
[Some/T#328]:Boolean/T#94>
then
<
{
case val inUsername#9650: String/T#819
<return[[Unique matchResult 1]]
<
{
<
<<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
((fa#1425139597: x#25.CB/T#3993, f#1425139597:
Function1/T#217
): x#25.CB/T#3993)
>
(
<<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993)>():
x#25.CB/T#3993
>
,
<
{
def $anonfun#11353
(vx#862275614: String/T#819): Object/T
<closure(
<$anonfun#11353:
(vx#862275614: String/T#819): Object/T
>
):Function1/T#217>
}
:Function1/T#217>
):x#25.CB/T#3993>
}
:x#25.CB/T#3993>
:Nothing/T#1314>
}
:Nothing/T#1314>
else <():Unit/T#157>:Unit/T#157>
<throw
<
<<new MatchError/T#331:MatchError/T#331>:
((obj#138727514: Object/T): MatchError/T#331)
>
(<[Unique x 1]#11848:Option/T#82>):MatchError/T#331>
:Nothing/T#1314>
}
:Nothing/T#1314>
:x#25.CB/T#3993>
,
<
{
def $anonfun#11364(vx#46920594: Object/T): Unit/T#157
<closure(<$anonfun#11364:(vx#46920594: Object/T): Unit/T#157>:
scala#23.runtime#430.function#7204.JProcedure1/T#18612
):scala#23.runtime#430.function#7204.JProcedure1/T#18612>
}
:scala#23.runtime#430.function#7204.JProcedure1/T#18612>
):x#25.CB/T#3993>
}
:x#25.CB/T#3993>
java.util.NoSuchElementException: key not found: method $anonfun while traversing def $anonfun#12369(): x#25.CB/T#3993
java.util.NoSuchElementException: key not found: method $anonfun while traversing <
{
def $anonfun#12369(): x#25.CB/T#3993
<closure(<$anonfun#12369:(): x#25.CB/T#3993>:Function0/T#127):
Function0/T#127
>
}
:Function0/T#127>
java.util.NoSuchElementException: key not found: method $anonfun while traversing <
<<x#25.CBM#3997:x#25.CBM/T#3998>.spawn#11259:
((op#155756685: Function0/T#127): x#25.CB/T#3993)

(
<
{
def $anonfun#12369(): x#25.CB/T#3993
<closure(<$anonfun#12369:(): x#25.CB/T#3993>:Function0/T#127):
Function0/T#127
>
}
:Function0/T#127>
):x#25.CB/T#3993>
java.util.NoSuchElementException: key not found: method $anonfun while traversing def allocateServiceOperator#6133
(optInUsername#2088808554: Option/T#82): x#25.CB/T#3993
java.util.NoSuchElementException: key not found: method $anonfun while traversing extends Object/T {
def #6132(): x#25.VP1/T#4021
private def writeReplace#11424(): Object/T
def allocateServiceOperator#6133
(optInUsername#2088808554: Option/T#82): x#25.CB/T#3993
def op1#6134(): x#25.CB/T#3993
}
java.util.NoSuchElementException: key not found: method $anonfun while traversing @<
<
<new scala#23.annotation#428.internal#4101.SourceFile/T#7298:
scala#23.annotation#428.internal#4101.SourceFile/T#7298
>
:
((path#1184953675: String/T#819):
scala#23.annotation#428.internal#4101.SourceFile/T#7298
)

(
<"shared/src/test/scala/cps/vp/VP1.scala":
("shared/src/test/scala/cps/vp/VP1.scala" : String/T#819)

):scala#23.annotation#428.internal#4101.SourceFile/T#7298> final module class
VP1/T#4021
extends Object/T {
def #6132(): x#25.VP1/T#4021
private def writeReplace#11424(): Object/T
def allocateServiceOperator#6133
(optInUsername#2088808554: Option/T#82): x#25.CB/T#3993
def op1#6134(): x#25.CB/T#3993
}
java.util.NoSuchElementException: key not found: method $anonfun while traversing <package <x#25:x/T#26> {
final lazy module object VP1#4020: x#25.VP1/T#4021
@<
<
<new scala#23.annotation#428.internal#4101.SourceFile/T#7298:
scala#23.annotation#428.internal#4101.SourceFile/T#7298
>
:
((path#1184953675: String/T#819):
scala#23.annotation#428.internal#4101.SourceFile/T#7298
)
>
(
<"shared/src/test/scala/cps/vp/VP1.scala":
("shared/src/test/scala/cps/vp/VP1.scala" : String/T#819)
>
):scala#23.annotation#428.internal#4101.SourceFile/T#7298> final module class
VP1/T#4021
extends Object/T {
def #6132(): x#25.VP1/T#4021
private def writeReplace#11424(): Object/T
def allocateServiceOperator#6133
(optInUsername#2088808554: Option/T#82): x#25.CB/T#3993
def op1#6134(): x#25.CB/T#3993
}
}:x#25.type>
[info] exception occurred while compiling /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala
java.util.NoSuchElementException: key not found: method $anonfun while compiling /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala
[error] ## Exception when compiling 1 sources to /Users/rssh/work/oss/dotty-cps/dotty-cps-async/jvm/target/scala-3.1.0/test-classes
[error] java.util.NoSuchElementException: key not found: method $anonfun
[error] scala.collection.MapOps.default(Map.scala:274)
[error] scala.collection.MapOps.default$(Map.scala:273)
[error] scala.collection.AbstractMap.default(Map.scala:405)
[error] scala.collection.MapOps.apply(Map.scala:176)
[error] scala.collection.MapOps.apply$(Map.scala:175)
[error] scala.collection.AbstractMap.apply(Map.scala:405)
[error] dotty.tools.dotc.transform.Dependencies.narrowLogicOwner(Dependencies.scala:81)
[error] dotty.tools.dotc.transform.Dependencies.markFree(Dependencies.scala:147)
[error] dotty.tools.dotc.transform.Dependencies.markFree(Dependencies.scala:145)
[error] dotty.tools.dotc.transform.Dependencies.process(Dependencies.scala:187)
[error] dotty.tools.dotc.transform.LambdaLift$$anon$1.process(LambdaLift.scala:41)
[error] dotty.tools.dotc.transform.LambdaLift$$anon$1.process(LambdaLift.scala:40)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:217)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1549)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1555)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1610)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1522)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1524)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1555)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1522)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1524)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1541)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1555)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1567)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1555)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1557)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1522)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1524)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1555)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1565)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1522)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1524)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1541)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1555)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1610)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1522)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1524)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1555)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1522)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1524)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1541)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1610)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1522)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1524)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1617)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1614)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1647)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1522)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1524)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1623)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1648)
[error] dotty.tools.dotc.transform.Dependencies$CollectDependencies.traverse(Dependencies.scala:218)
[error] dotty.tools.dotc.transform.Dependencies.(Dependencies.scala:260)
[error] dotty.tools.dotc.transform.LambdaLift$$anon$1.(LambdaLift.scala:36)
[error] dotty.tools.dotc.transform.LambdaLift$Lifter.(LambdaLift.scala:49)
[error] dotty.tools.dotc.transform.LambdaLift.prepareForUnit(LambdaLift.scala:288)
[error] dotty.tools.dotc.transform.MegaPhase.prepUnit(MegaPhase.scala:1040)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnit(MegaPhase.scala:447)
[error] dotty.tools.dotc.transform.MegaPhase.run(MegaPhase.scala:460)
[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.

</details>

when adding -Ycheck:all. 
<details>
[info] checking /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala after phase typer
exception while typing <
  {
    def $anonfun#11353(vx#1106157922: String/T): Unit/T#157 |/T String/T
    <closure(<$anonfun#11353:(vx#1106157922: String/T): Unit/T#157 |/T String/T>
      )
    :String/T => Unit/T#157 |/T String/T>
  }
:String/T => Unit/T#157 |/T String/T> of class class dotty.tools.dotc.ast.Trees$Block # -1
exception while typing <
  <
    <
      <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
        ([A/T#765707521, B/T#765707521]#765707521
          (fa#429861691: x#25.CB/T#3993[A/T#765707521])
            (f#539037251: A/T#765707521 => B/T#765707521): 
              x#25.CB/T#3993[B/T#765707521]
        )
      >
    [String/T, Unit/T#157 |/T String/T]:
      ((fa#1297687496: x#25.CB/T#3993[String/T])
        (f#1696755510: String/T => Unit/T#157 |/T String/T): 
          x#25.CB/T#3993[Unit/T#157 |/T String/T]
      )
    >
  (
    <
      <<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993[String/T#6171])>():
        x#25.CB/T#3993[String/T#6171]
      >
    :x#25.CB/T#3993[String/T#6171]>
  ):
    ((f#1696755510: String/T => Unit/T#157 |/T String/T): 
      x#25.CB/T#3993[Unit/T#157 |/T String/T]
    )
  >
(
  <
    {
      def $anonfun#11353(vx#1106157922: String/T): Unit/T#157 |/T String/T
      <closure(
        <$anonfun#11353:(vx#1106157922: String/T): Unit/T#157 |/T String/T>
      ):String/T => Unit/T#157 |/T String/T>
    }
  :String/T => Unit/T#157 |/T String/T>
):x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Apply # -1
exception while typing <
  <
    <
      <
        <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
          ([A/T#765707521, B/T#765707521]#765707521
            (fa#429861691: x#25.CB/T#3993[A/T#765707521])
              (f#539037251: A/T#765707521 => B/T#765707521): 
                x#25.CB/T#3993[B/T#765707521]
          )
        >
      [String/T, Unit/T#157 |/T String/T]:
        ((fa#1297687496: x#25.CB/T#3993[String/T])
          (f#1696755510: String/T => Unit/T#157 |/T String/T): 
            x#25.CB/T#3993[Unit/T#157 |/T String/T]
        )
      >
    (
      <
        <<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993[String/T#6171])>():
          x#25.CB/T#3993[String/T#6171]
        >
      :x#25.CB/T#3993[String/T#6171]>
    ):
      ((f#1696755510: String/T => Unit/T#157 |/T String/T): 
        x#25.CB/T#3993[Unit/T#157 |/T String/T]
      )
    >
  (
    <
      {
        def $anonfun#11353(vx#1106157922: String/T): Unit/T#157 |/T String/T
        <closure(
          <$anonfun#11353:(vx#1106157922: String/T): Unit/T#157 |/T String/T>
        ):String/T => Unit/T#157 |/T String/T>
      }
    :String/T => Unit/T#157 |/T String/T>
  ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
:x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1
exception while typing <
  {
    <
      <
        <
          <
            <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
              ([A/T#765707521, B/T#765707521]#765707521
                (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                  (f#539037251: A/T#765707521 => B/T#765707521): 
                    x#25.CB/T#3993[B/T#765707521]
              )
            >
          [String/T, Unit/T#157 |/T String/T]:
            ((fa#1297687496: x#25.CB/T#3993[String/T])
              (f#1696755510: String/T => Unit/T#157 |/T String/T): 
                x#25.CB/T#3993[Unit/T#157 |/T String/T]
            )
          >
        (
          <
            <<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993[String/T#6171])>():
              x#25.CB/T#3993[String/T#6171]
            >
          :x#25.CB/T#3993[String/T#6171]>
        ):
          ((f#1696755510: String/T => Unit/T#157 |/T String/T): 
            x#25.CB/T#3993[Unit/T#157 |/T String/T]
          )
        >
      (
        <
          {
            def $anonfun#11353(vx#1106157922: String/T): Unit/T#157 |/T String/T
            <closure(
              <$anonfun#11353:(vx#1106157922: String/T): Unit/T#157 |/T String/T
                >
            ):String/T => Unit/T#157 |/T String/T>
          }
        :String/T => Unit/T#157 |/T String/T>
      ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
    :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
  }
:x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Block # -1
exception while typing <<optInUsername#6166:Option/T#82[String/T#6171]> match 
  {
    <case <None#257:None/T#258> => 
      <
        <
          {
            def _whilefun#11377(): x#25.CB/T#3993[Unit/T#157]
            <<_whilefun#11377:((): x#25.CB/T#3993[Unit/T#157])>():
              x#25.CB/T#3993[Unit/T#157]
            >
          }
        :x#25.CB/T#3993[Unit/T#157]>
      :x#25.CB/T#3993[Unit/T#157]>
    :x#25.CB/T#3993[Unit/T#157]>
    <case 
      <
        <
          <
            <<Some#329:Some/T#330>.unapply#8310:
              ([A/T#6131992]#6131992
                (x$0#873007710: Some/T#328[A/T#6131992]): 
                  Option/T#82[A/T#6131992]
              )
            >
          [String/T]:
            ((x$0#459916360: Some/T#328[String/T]): Option/T#82[String/T])
          >
        (inUsername @ <_:String/T>):Some/T#328[String/T]>
       :Some/T#328[String/T]:Some/T#328[String/T]>
     => 
      <
        <
          <
            <
              <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                ([A/T#765707521, B/T#765707521]#765707521
                  (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                    (f#539037251: A/T#765707521 => B/T#765707521): 
                      x#25.CB/T#3993[B/T#765707521]
                )
              >
            [String/T, Unit/T#157 |/T String/T]:
              ((fa#1297687496: x#25.CB/T#3993[String/T])
                (f#1696755510: String/T => Unit/T#157 |/T String/T): 
                  x#25.CB/T#3993[Unit/T#157 |/T String/T]
              )
            >
          (
            <
              <<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993[String/T#6171])>():
                x#25.CB/T#3993[String/T#6171]
              >
            :x#25.CB/T#3993[String/T#6171]>
          ):
            ((f#1696755510: String/T => Unit/T#157 |/T String/T): 
              x#25.CB/T#3993[Unit/T#157 |/T String/T]
            )
          >
        (
          <
            {
              def $anonfun#11353
                (vx#1106157922: String/T): Unit/T#157 |/T String/T
              <closure(
                <$anonfun#11353:
                  (vx#1106157922: String/T): Unit/T#157 |/T String/T
                >
              ):String/T => Unit/T#157 |/T String/T>
            }
          :String/T => Unit/T#157 |/T String/T>
        ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
      :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
    :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
  }
:x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Match # -1
exception while typing <
  <<optInUsername#6166:Option/T#82[String/T#6171]> match 
    {
      <case <None#257:None/T#258> => 
        <
          <
            {
              def _whilefun#11377(): x#25.CB/T#3993[Unit/T#157]
              <<_whilefun#11377:((): x#25.CB/T#3993[Unit/T#157])>():
                x#25.CB/T#3993[Unit/T#157]
              >
            }
          :x#25.CB/T#3993[Unit/T#157]>
        :x#25.CB/T#3993[Unit/T#157]>
      :x#25.CB/T#3993[Unit/T#157]>
      <case 
        <
          <
            <
              <<Some#329:Some/T#330>.unapply#8310:
                ([A/T#6131992]#6131992
                  (x$0#873007710: Some/T#328[A/T#6131992]): 
                    Option/T#82[A/T#6131992]
                )
              >
            [String/T]:
              ((x$0#459916360: Some/T#328[String/T]): Option/T#82[String/T])
            >
          (inUsername @ <_:String/T>):Some/T#328[String/T]>
         :Some/T#328[String/T]:Some/T#328[String/T]>
       => 
        <
          <
            <
              <
                <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                  ([A/T#765707521, B/T#765707521]#765707521
                    (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                      (f#539037251: A/T#765707521 => B/T#765707521): 
                        x#25.CB/T#3993[B/T#765707521]
                  )
                >
              [String/T, Unit/T#157 |/T String/T]:
                ((fa#1297687496: x#25.CB/T#3993[String/T])
                  (f#1696755510: String/T => Unit/T#157 |/T String/T): 
                    x#25.CB/T#3993[Unit/T#157 |/T String/T]
                )
              >
            (
              <
                <<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993[String/T#6171])>():
                  x#25.CB/T#3993[String/T#6171]
                >
              :x#25.CB/T#3993[String/T#6171]>
            ):
              ((f#1696755510: String/T => Unit/T#157 |/T String/T): 
                x#25.CB/T#3993[Unit/T#157 |/T String/T]
              )
            >
          (
            <
              {
                def $anonfun#11353
                  (vx#1106157922: String/T): Unit/T#157 |/T String/T
                <closure(
                  <$anonfun#11353:
                    (vx#1106157922: String/T): Unit/T#157 |/T String/T
                  >
                ):String/T => Unit/T#157 |/T String/T>
              }
            :String/T => Unit/T#157 |/T String/T>
          ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
        :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
      :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
    }
  :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
:x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1
exception while typing <
  <
    <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
      ([A/T#765707521, B/T#765707521]#765707521
        (fa#429861691: x#25.CB/T#3993[A/T#765707521])
          (f#539037251: A/T#765707521 => B/T#765707521): 
            x#25.CB/T#3993[B/T#765707521]
      )
    >
  [Unit/T#157 |/T String/T, Unit/T#157]:
    ((fa#1688308182: x#25.CB/T#3993[Unit/T#157 |/T String/T])
      (f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
        x#25.CB/T#3993[Unit/T#157]
    )
  >
(
  <
    <<optInUsername#6166:Option/T#82[String/T#6171]> match 
      {
        <case <None#257:None/T#258> => 
          <
            <
              {
                def _whilefun#11377(): x#25.CB/T#3993[Unit/T#157]
                <<_whilefun#11377:((): x#25.CB/T#3993[Unit/T#157])>():
                  x#25.CB/T#3993[Unit/T#157]
                >
              }
            :x#25.CB/T#3993[Unit/T#157]>
          :x#25.CB/T#3993[Unit/T#157]>
        :x#25.CB/T#3993[Unit/T#157]>
        <case 
          <
            <
              <
                <<Some#329:Some/T#330>.unapply#8310:
                  ([A/T#6131992]#6131992
                    (x$0#873007710: Some/T#328[A/T#6131992]): 
                      Option/T#82[A/T#6131992]
                  )
                >
              [String/T]:
                ((x$0#459916360: Some/T#328[String/T]): Option/T#82[String/T])
              >
            (inUsername @ <_:String/T>):Some/T#328[String/T]>
           :Some/T#328[String/T]:Some/T#328[String/T]>
         => 
          <
            <
              <
                <
                  <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                    ([A/T#765707521, B/T#765707521]#765707521
                      (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                        (f#539037251: A/T#765707521 => B/T#765707521): 
                          x#25.CB/T#3993[B/T#765707521]
                    )
                  >
                [String/T, Unit/T#157 |/T String/T]:
                  ((fa#1297687496: x#25.CB/T#3993[String/T])
                    (f#1696755510: String/T => Unit/T#157 |/T String/T): 
                      x#25.CB/T#3993[Unit/T#157 |/T String/T]
                  )
                >
              (
                <
                  <<x#25.VP1#4020.op1#6134:((): x#25.CB/T#3993[String/T#6171])>(
                    )
                  :x#25.CB/T#3993[String/T#6171]>
                :x#25.CB/T#3993[String/T#6171]>
              ):
                ((f#1696755510: String/T => Unit/T#157 |/T String/T): 
                  x#25.CB/T#3993[Unit/T#157 |/T String/T]
                )
              >
            (
              <
                {
                  def $anonfun#11353
                    (vx#1106157922: String/T): Unit/T#157 |/T String/T
                  <closure(
                    <$anonfun#11353:
                      (vx#1106157922: String/T): Unit/T#157 |/T String/T
                    >
                  ):String/T => Unit/T#157 |/T String/T>
                }
              :String/T => Unit/T#157 |/T String/T>
            ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
          :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
        :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
      }
    :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
  :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
):
  (f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
    x#25.CB/T#3993[Unit/T#157]
> of class class dotty.tools.dotc.ast.Trees$Apply # -1
exception while typing <
  <
    <
      <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
        ([A/T#765707521, B/T#765707521]#765707521
          (fa#429861691: x#25.CB/T#3993[A/T#765707521])
            (f#539037251: A/T#765707521 => B/T#765707521): 
              x#25.CB/T#3993[B/T#765707521]
        )
      >
    [Unit/T#157 |/T String/T, Unit/T#157]:
      ((fa#1688308182: x#25.CB/T#3993[Unit/T#157 |/T String/T])
        (f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
          x#25.CB/T#3993[Unit/T#157]
      )
    >
  (
    <
      <<optInUsername#6166:Option/T#82[String/T#6171]> match 
        {
          <case <None#257:None/T#258> => 
            <
              <
                {
                  def _whilefun#11377(): x#25.CB/T#3993[Unit/T#157]
                  <<_whilefun#11377:((): x#25.CB/T#3993[Unit/T#157])>():
                    x#25.CB/T#3993[Unit/T#157]
                  >
                }
              :x#25.CB/T#3993[Unit/T#157]>
            :x#25.CB/T#3993[Unit/T#157]>
          :x#25.CB/T#3993[Unit/T#157]>
          <case 
            <
              <
                <
                  <<Some#329:Some/T#330>.unapply#8310:
                    ([A/T#6131992]#6131992
                      (x$0#873007710: Some/T#328[A/T#6131992]): 
                        Option/T#82[A/T#6131992]
                    )
                  >
                [String/T]:
                  ((x$0#459916360: Some/T#328[String/T]): Option/T#82[String/T])
                >
              (inUsername @ <_:String/T>):Some/T#328[String/T]>
             :Some/T#328[String/T]:Some/T#328[String/T]>
           => 
            <
              <
                <
                  <
                    <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                      ([A/T#765707521, B/T#765707521]#765707521
                        (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                          (f#539037251: A/T#765707521 => B/T#765707521): 
                            x#25.CB/T#3993[B/T#765707521]
                      )
                    >
                  [String/T, Unit/T#157 |/T String/T]:
                    ((fa#1297687496: x#25.CB/T#3993[String/T])
                      (f#1696755510: String/T => Unit/T#157 |/T String/T): 
                        x#25.CB/T#3993[Unit/T#157 |/T String/T]
                    )
                  >
                (
                  <
                    <
                      <x#25.VP1#4020.op1#6134:
                        ((): x#25.CB/T#3993[String/T#6171])
                      >
                    ():x#25.CB/T#3993[String/T#6171]>
                  :x#25.CB/T#3993[String/T#6171]>
                ):
                  ((f#1696755510: String/T => Unit/T#157 |/T String/T): 
                    x#25.CB/T#3993[Unit/T#157 |/T String/T]
                  )
                >
              (
                <
                  {
                    def $anonfun#11353
                      (vx#1106157922: String/T): Unit/T#157 |/T String/T
                    <closure(
                      <$anonfun#11353:
                        (vx#1106157922: String/T): Unit/T#157 |/T String/T
                      >
                    ):String/T => Unit/T#157 |/T String/T>
                  }
                :String/T => Unit/T#157 |/T String/T>
              ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
            :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
          :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
        }
      :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
    :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
  ):
    ((f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
      x#25.CB/T#3993[Unit/T#157]
    )
  >
(
  <
    {
      def $anonfun#11364(vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
      <closure(
        <$anonfun#11364:(vx#605816902: Unit/T#157 |/T String/T): Unit/T#157>
      ):Unit/T#157 |/T String/T => Unit/T#157>
    }
  :Unit/T#157 |/T String/T => Unit/T#157>
):x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Apply # -1
exception while typing <
  <
    <
      <
        <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
          ([A/T#765707521, B/T#765707521]#765707521
            (fa#429861691: x#25.CB/T#3993[A/T#765707521])
              (f#539037251: A/T#765707521 => B/T#765707521): 
                x#25.CB/T#3993[B/T#765707521]
          )
        >
      [Unit/T#157 |/T String/T, Unit/T#157]:
        ((fa#1688308182: x#25.CB/T#3993[Unit/T#157 |/T String/T])
          (f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
            x#25.CB/T#3993[Unit/T#157]
        )
      >
    (
      <
        <<optInUsername#6166:Option/T#82[String/T#6171]> match 
          {
            <case <None#257:None/T#258> => 
              <
                <
                  {
                    def _whilefun#11377(): x#25.CB/T#3993[Unit/T#157]
                    <<_whilefun#11377:((): x#25.CB/T#3993[Unit/T#157])>():
                      x#25.CB/T#3993[Unit/T#157]
                    >
                  }
                :x#25.CB/T#3993[Unit/T#157]>
              :x#25.CB/T#3993[Unit/T#157]>
            :x#25.CB/T#3993[Unit/T#157]>
            <case 
              <
                <
                  <
                    <<Some#329:Some/T#330>.unapply#8310:
                      ([A/T#6131992]#6131992
                        (x$0#873007710: Some/T#328[A/T#6131992]): 
                          Option/T#82[A/T#6131992]
                      )
                    >
                  [String/T]:
                    ((x$0#459916360: Some/T#328[String/T]): 
                      Option/T#82[String/T]
                    )
                  >
                (inUsername @ <_:String/T>):Some/T#328[String/T]>
               :Some/T#328[String/T]:Some/T#328[String/T]>
             => 
              <
                <
                  <
                    <
                      <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                        ([A/T#765707521, B/T#765707521]#765707521
                          (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                            (f#539037251: A/T#765707521 => B/T#765707521): 
                              x#25.CB/T#3993[B/T#765707521]
                        )
                      >
                    [String/T, Unit/T#157 |/T String/T]:
                      ((fa#1297687496: x#25.CB/T#3993[String/T])
                        (f#1696755510: String/T => Unit/T#157 |/T String/T): 
                          x#25.CB/T#3993[Unit/T#157 |/T String/T]
                      )
                    >
                  (
                    <
                      <
                        <x#25.VP1#4020.op1#6134:
                          ((): x#25.CB/T#3993[String/T#6171])
                        >
                      ():x#25.CB/T#3993[String/T#6171]>
                    :x#25.CB/T#3993[String/T#6171]>
                  ):
                    ((f#1696755510: String/T => Unit/T#157 |/T String/T): 
                      x#25.CB/T#3993[Unit/T#157 |/T String/T]
                    )
                  >
                (
                  <
                    {
                      def $anonfun#11353
                        (vx#1106157922: String/T): Unit/T#157 |/T String/T
                      <closure(
                        <$anonfun#11353:
                          (vx#1106157922: String/T): Unit/T#157 |/T String/T
                        >
                      ):String/T => Unit/T#157 |/T String/T>
                    }
                  :String/T => Unit/T#157 |/T String/T>
                ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
              :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
            :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
          }
        :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
      :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
    ):
      ((f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
        x#25.CB/T#3993[Unit/T#157]
      )
    >
  (
    <
      {
        def $anonfun#11364(vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
        <closure(
          <$anonfun#11364:(vx#605816902: Unit/T#157 |/T String/T): Unit/T#157>
        ):Unit/T#157 |/T String/T => Unit/T#157>
      }
    :Unit/T#157 |/T String/T => Unit/T#157>
  ):x#25.CB/T#3993[Unit/T#157]>
:x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1
exception while typing <
  {
    <
      <
        <
          <
            <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
              ([A/T#765707521, B/T#765707521]#765707521
                (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                  (f#539037251: A/T#765707521 => B/T#765707521): 
                    x#25.CB/T#3993[B/T#765707521]
              )
            >
          [Unit/T#157 |/T String/T, Unit/T#157]:
            ((fa#1688308182: x#25.CB/T#3993[Unit/T#157 |/T String/T])
              (f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
                x#25.CB/T#3993[Unit/T#157]
            )
          >
        (
          <
            <<optInUsername#6166:Option/T#82[String/T#6171]> match 
              {
                <case <None#257:None/T#258> => 
                  <
                    <
                      {
                        def _whilefun#11377(): x#25.CB/T#3993[Unit/T#157]
                        <<_whilefun#11377:((): x#25.CB/T#3993[Unit/T#157])>():
                          x#25.CB/T#3993[Unit/T#157]
                        >
                      }
                    :x#25.CB/T#3993[Unit/T#157]>
                  :x#25.CB/T#3993[Unit/T#157]>
                :x#25.CB/T#3993[Unit/T#157]>
                <case 
                  <
                    <
                      <
                        <<Some#329:Some/T#330>.unapply#8310:
                          ([A/T#6131992]#6131992
                            (x$0#873007710: Some/T#328[A/T#6131992]): 
                              Option/T#82[A/T#6131992]
                          )
                        >
                      [String/T]:
                        ((x$0#459916360: Some/T#328[String/T]): 
                          Option/T#82[String/T]
                        )
                      >
                    (inUsername @ <_:String/T>):Some/T#328[String/T]>
                   :Some/T#328[String/T]:Some/T#328[String/T]>
                 => 
                  <
                    <
                      <
                        <
                          <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                            ([A/T#765707521, B/T#765707521]#765707521
                              (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                                (f#539037251: A/T#765707521 => B/T#765707521): 
                                  x#25.CB/T#3993[B/T#765707521]
                            )
                          >
                        [String/T, Unit/T#157 |/T String/T]:
                          ((fa#1297687496: x#25.CB/T#3993[String/T])
                            (f#1696755510: String/T => Unit/T#157 |/T String/T
                              ): 
                            x#25.CB/T#3993[Unit/T#157 |/T String/T]
                          )
                        >
                      (
                        <
                          <
                            <x#25.VP1#4020.op1#6134:
                              ((): x#25.CB/T#3993[String/T#6171])
                            >
                          ():x#25.CB/T#3993[String/T#6171]>
                        :x#25.CB/T#3993[String/T#6171]>
                      ):
                        ((f#1696755510: String/T => Unit/T#157 |/T String/T): 
                          x#25.CB/T#3993[Unit/T#157 |/T String/T]
                        )
                      >
                    (
                      <
                        {
                          def $anonfun#11353
                            (vx#1106157922: String/T): Unit/T#157 |/T String/T
                          <closure(
                            <$anonfun#11353:
                              (vx#1106157922: String/T): Unit/T#157 |/T String/T
                            >
                          ):String/T => Unit/T#157 |/T String/T>
                        }
                      :String/T => Unit/T#157 |/T String/T>
                    ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                  :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
              }
            :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
          :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
        ):
          ((f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
            x#25.CB/T#3993[Unit/T#157]
          )
        >
      (
        <
          {
            def $anonfun#11364
              (vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
            <closure(
              <$anonfun#11364:
                (vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
              >
            ):Unit/T#157 |/T String/T => Unit/T#157>
          }
        :Unit/T#157 |/T String/T => Unit/T#157>
      ):x#25.CB/T#3993[Unit/T#157]>
    :x#25.CB/T#3993[Unit/T#157]>
  }
:x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Block # -1
exception while typing <
  <
    {
      <
        <
          <
            <
              <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                ([A/T#765707521, B/T#765707521]#765707521
                  (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                    (f#539037251: A/T#765707521 => B/T#765707521): 
                      x#25.CB/T#3993[B/T#765707521]
                )
              >
            [Unit/T#157 |/T String/T, Unit/T#157]:
              ((fa#1688308182: x#25.CB/T#3993[Unit/T#157 |/T String/T])
                (f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
                  x#25.CB/T#3993[Unit/T#157]
              )
            >
          (
            <
              <<optInUsername#6166:Option/T#82[String/T#6171]> match 
                {
                  <case <None#257:None/T#258> => 
                    <
                      <
                        {
                          def _whilefun#11377(): x#25.CB/T#3993[Unit/T#157]
                          <<_whilefun#11377:((): x#25.CB/T#3993[Unit/T#157])>():
                            x#25.CB/T#3993[Unit/T#157]
                          >
                        }
                      :x#25.CB/T#3993[Unit/T#157]>
                    :x#25.CB/T#3993[Unit/T#157]>
                  :x#25.CB/T#3993[Unit/T#157]>
                  <case 
                    <
                      <
                        <
                          <<Some#329:Some/T#330>.unapply#8310:
                            ([A/T#6131992]#6131992
                              (x$0#873007710: Some/T#328[A/T#6131992]): 
                                Option/T#82[A/T#6131992]
                            )
                          >
                        [String/T]:
                          ((x$0#459916360: Some/T#328[String/T]): 
                            Option/T#82[String/T]
                          )
                        >
                      (inUsername @ <_:String/T>):Some/T#328[String/T]>
                     :Some/T#328[String/T]:Some/T#328[String/T]>
                   => 
                    <
                      <
                        <
                          <
                            <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                              ([A/T#765707521, B/T#765707521]#765707521
                                (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                                  (f#539037251: A/T#765707521 => B/T#765707521
                                    ): 
                                  x#25.CB/T#3993[B/T#765707521]
                              )
                            >
                          [String/T, Unit/T#157 |/T String/T]:
                            ((fa#1297687496: x#25.CB/T#3993[String/T])
                              (f#1696755510: String/T => Unit/T#157 |/T String/T
                                ): 
                              x#25.CB/T#3993[Unit/T#157 |/T String/T]
                            )
                          >
                        (
                          <
                            <
                              <x#25.VP1#4020.op1#6134:
                                ((): x#25.CB/T#3993[String/T#6171])
                              >
                            ():x#25.CB/T#3993[String/T#6171]>
                          :x#25.CB/T#3993[String/T#6171]>
                        ):
                          ((f#1696755510: String/T => Unit/T#157 |/T String/T): 
                            x#25.CB/T#3993[Unit/T#157 |/T String/T]
                          )
                        >
                      (
                        <
                          {
                            def $anonfun#11353
                              (vx#1106157922: String/T): Unit/T#157 |/T String/T
                            <closure(
                              <$anonfun#11353:
                                (vx#1106157922: String/T): Unit/T#157 |/T 
                                  String/T
                              >
                            ):String/T => Unit/T#157 |/T String/T>
                          }
                        :String/T => Unit/T#157 |/T String/T>
                      ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                    :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                  :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                }
              :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
            :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
          ):
            ((f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
              x#25.CB/T#3993[Unit/T#157]
            )
          >
        (
          <
            {
              def $anonfun#11364
                (vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
              <closure(
                <$anonfun#11364:
                  (vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
                >
              ):Unit/T#157 |/T String/T => Unit/T#157>
            }
          :Unit/T#157 |/T String/T => Unit/T#157>
        ):x#25.CB/T#3993[Unit/T#157]>
      :x#25.CB/T#3993[Unit/T#157]>
    }
  :x#25.CB/T#3993[Unit/T#157]>
:x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1
exception while typing <
  <
    <<x#25.CBM#3997:x#25.CBM/T#3998>.spawn#11259:
      ([A/T#20758714]#20758714
        (op#1877547584: => x#25.CB/T#3993[A/T#20758714]): 
          x#25.CB/T#3993[A/T#20758714]
      )
    >
  [Unit/T#157]:
    ((op#124703058: => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157])
  >
(
  <
    <
      {
        <
          <
            <
              <
                <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                  ([A/T#765707521, B/T#765707521]#765707521
                    (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                      (f#539037251: A/T#765707521 => B/T#765707521): 
                        x#25.CB/T#3993[B/T#765707521]
                  )
                >
              [Unit/T#157 |/T String/T, Unit/T#157]:
                ((fa#1688308182: x#25.CB/T#3993[Unit/T#157 |/T String/T])
                  (f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
                    x#25.CB/T#3993[Unit/T#157]
                )
              >
            (
              <
                <<optInUsername#6166:Option/T#82[String/T#6171]> match 
                  {
                    <case <None#257:None/T#258> => 
                      <
                        <
                          {
                            def _whilefun#11377(): x#25.CB/T#3993[Unit/T#157]
                            <<_whilefun#11377:((): x#25.CB/T#3993[Unit/T#157])>(
                              )
                            :x#25.CB/T#3993[Unit/T#157]>
                          }
                        :x#25.CB/T#3993[Unit/T#157]>
                      :x#25.CB/T#3993[Unit/T#157]>
                    :x#25.CB/T#3993[Unit/T#157]>
                    <case 
                      <
                        <
                          <
                            <<Some#329:Some/T#330>.unapply#8310:
                              ([A/T#6131992]#6131992
                                (x$0#873007710: Some/T#328[A/T#6131992]): 
                                  Option/T#82[A/T#6131992]
                              )
                            >
                          [String/T]:
                            ((x$0#459916360: Some/T#328[String/T]): 
                              Option/T#82[String/T]
                            )
                          >
                        (inUsername @ <_:String/T>):Some/T#328[String/T]>
                       :Some/T#328[String/T]:Some/T#328[String/T]>
                     => 
                      <
                        <
                          <
                            <
                              <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                                ([A/T#765707521, B/T#765707521]#765707521
                                  (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                                    (f#539037251: A/T#765707521 => B/T#765707521
                                      ): 
                                    x#25.CB/T#3993[B/T#765707521]
                                )
                              >
                            [String/T, Unit/T#157 |/T String/T]:
                              ((fa#1297687496: x#25.CB/T#3993[String/T])
                                (f#1696755510: String/T => Unit/T#157 |/T 
                                  String/T
                                ): x#25.CB/T#3993[Unit/T#157 |/T String/T]
                              )
                            >
                          (
                            <
                              <
                                <x#25.VP1#4020.op1#6134:
                                  ((): x#25.CB/T#3993[String/T#6171])
                                >
                              ():x#25.CB/T#3993[String/T#6171]>
                            :x#25.CB/T#3993[String/T#6171]>
                          ):
                            ((f#1696755510: String/T => Unit/T#157 |/T String/T
                              ): 
                            x#25.CB/T#3993[Unit/T#157 |/T String/T])
                          >
                        (
                          <
                            {
                              def $anonfun#11353
                                (vx#1106157922: String/T): Unit/T#157 |/T 
                                  String/T
                              <closure(
                                <$anonfun#11353:
                                  (vx#1106157922: String/T): Unit/T#157 |/T 
                                    String/T
                                >
                              ):String/T => Unit/T#157 |/T String/T>
                            }
                          :String/T => Unit/T#157 |/T String/T>
                        ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                      :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                    :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                  }
                :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
              :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
            ):
              ((f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
                x#25.CB/T#3993[Unit/T#157]
              )
            >
          (
            <
              {
                def $anonfun#11364
                  (vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
                <closure(
                  <$anonfun#11364:
                    (vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
                  >
                ):Unit/T#157 |/T String/T => Unit/T#157>
              }
            :Unit/T#157 |/T String/T => Unit/T#157>
          ):x#25.CB/T#3993[Unit/T#157]>
        :x#25.CB/T#3993[Unit/T#157]>
      }
    :x#25.CB/T#3993[Unit/T#157]>
  :x#25.CB/T#3993[Unit/T#157]>
):x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Apply # -1
exception while typing <
  <
    <
      <<x#25.CBM#3997:x#25.CBM/T#3998>.spawn#11259:
        ([A/T#20758714]#20758714
          (op#1877547584: => x#25.CB/T#3993[A/T#20758714]): 
            x#25.CB/T#3993[A/T#20758714]
        )
      >
    [Unit/T#157]:
      ((op#124703058: => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157]
        )
    >
  (
    <
      <
        {
          <
            <
              <
                <
                  <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                    ([A/T#765707521, B/T#765707521]#765707521
                      (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                        (f#539037251: A/T#765707521 => B/T#765707521): 
                          x#25.CB/T#3993[B/T#765707521]
                    )
                  >
                [Unit/T#157 |/T String/T, Unit/T#157]:
                  ((fa#1688308182: x#25.CB/T#3993[Unit/T#157 |/T String/T])
                    (f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
                      x#25.CB/T#3993[Unit/T#157]
                  )
                >
              (
                <
                  <<optInUsername#6166:Option/T#82[String/T#6171]> match 
                    {
                      <case <None#257:None/T#258> => 
                        <
                          <
                            {
                              def _whilefun#11377(): x#25.CB/T#3993[Unit/T#157]
                              <
                                <_whilefun#11377:
                                  ((): x#25.CB/T#3993[Unit/T#157])
                                >
                              ():x#25.CB/T#3993[Unit/T#157]>
                            }
                          :x#25.CB/T#3993[Unit/T#157]>
                        :x#25.CB/T#3993[Unit/T#157]>
                      :x#25.CB/T#3993[Unit/T#157]>
                      <case 
                        <
                          <
                            <
                              <<Some#329:Some/T#330>.unapply#8310:
                                ([A/T#6131992]#6131992
                                  (x$0#873007710: Some/T#328[A/T#6131992]): 
                                    Option/T#82[A/T#6131992]
                                )
                              >
                            [String/T]:
                              ((x$0#459916360: Some/T#328[String/T]): 
                                Option/T#82[String/T]
                              )
                            >
                          (inUsername @ <_:String/T>):Some/T#328[String/T]>
                         :Some/T#328[String/T]:Some/T#328[String/T]>
                       => 
                        <
                          <
                            <
                              <
                                <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                                  ([A/T#765707521, B/T#765707521]#765707521
                                    (fa#429861691: x#25.CB/T#3993[A/T#765707521]
                                      )
                                    (f#539037251: A/T#765707521 => B/T#765707521
                                      ): 
                                    x#25.CB/T#3993[B/T#765707521]
                                  )
                                >
                              [String/T, Unit/T#157 |/T String/T]:
                                ((fa#1297687496: x#25.CB/T#3993[String/T])
                                  (f#1696755510: String/T => Unit/T#157 |/T 
                                    String/T
                                  ): x#25.CB/T#3993[Unit/T#157 |/T String/T]
                                )
                              >
                            (
                              <
                                <
                                  <x#25.VP1#4020.op1#6134:
                                    ((): x#25.CB/T#3993[String/T#6171])
                                  >
                                ():x#25.CB/T#3993[String/T#6171]>
                              :x#25.CB/T#3993[String/T#6171]>
                            ):
                              ((f#1696755510: String/T => Unit/T#157 |/T 
                                String/T
                              ): x#25.CB/T#3993[Unit/T#157 |/T String/T])
                            >
                          (
                            <
                              {
                                def $anonfun#11353
                                  (vx#1106157922: String/T): Unit/T#157 |/T 
                                    String/T
                                <closure(
                                  <$anonfun#11353:
                                    (vx#1106157922: String/T): Unit/T#157 |/T 
                                      String/T
                                  >
                                ):String/T => Unit/T#157 |/T String/T>
                              }
                            :String/T => Unit/T#157 |/T String/T>
                          ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                        :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                      :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                    }
                  :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
              ):
                ((f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
                  x#25.CB/T#3993[Unit/T#157]
                )
              >
            (
              <
                {
                  def $anonfun#11364
                    (vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
                  <closure(
                    <$anonfun#11364:
                      (vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
                    >
                  ):Unit/T#157 |/T String/T => Unit/T#157>
                }
              :Unit/T#157 |/T String/T => Unit/T#157>
            ):x#25.CB/T#3993[Unit/T#157]>
          :x#25.CB/T#3993[Unit/T#157]>
        }
      :x#25.CB/T#3993[Unit/T#157]>
    :x#25.CB/T#3993[Unit/T#157]>
  ):x#25.CB/T#3993[Unit/T#157]>
:x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1
exception while typing <
  <
    <
      <
        <<x#25.CBM#3997:x#25.CBM/T#3998>.spawn#11259:
          ([A/T#20758714]#20758714
            (op#1877547584: => x#25.CB/T#3993[A/T#20758714]): 
              x#25.CB/T#3993[A/T#20758714]
          )
        >
      [Unit/T#157]:
        ((op#124703058: => x#25.CB/T#3993[Unit/T#157]): 
          x#25.CB/T#3993[Unit/T#157]
        )
      >
    (
      <
        <
          {
            <
              <
                <
                  <
                    <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                      ([A/T#765707521, B/T#765707521]#765707521
                        (fa#429861691: x#25.CB/T#3993[A/T#765707521])
                          (f#539037251: A/T#765707521 => B/T#765707521): 
                            x#25.CB/T#3993[B/T#765707521]
                      )
                    >
                  [Unit/T#157 |/T String/T, Unit/T#157]:
                    ((fa#1688308182: x#25.CB/T#3993[Unit/T#157 |/T String/T])
                      (f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
                        x#25.CB/T#3993[Unit/T#157]
                    )
                  >
                (
                  <
                    <<optInUsername#6166:Option/T#82[String/T#6171]> match 
                      {
                        <case <None#257:None/T#258> => 
                          <
                            <
                              {
                                def _whilefun#11377
                                  (): x#25.CB/T#3993[Unit/T#157]
                                <
                                  <_whilefun#11377:
                                    ((): x#25.CB/T#3993[Unit/T#157])
                                  >
                                ():x#25.CB/T#3993[Unit/T#157]>
                              }
                            :x#25.CB/T#3993[Unit/T#157]>
                          :x#25.CB/T#3993[Unit/T#157]>
                        :x#25.CB/T#3993[Unit/T#157]>
                        <case 
                          <
                            <
                              <
                                <<Some#329:Some/T#330>.unapply#8310:
                                  ([A/T#6131992]#6131992
                                    (x$0#873007710: Some/T#328[A/T#6131992]): 
                                      Option/T#82[A/T#6131992]
                                  )
                                >
                              [String/T]:
                                ((x$0#459916360: Some/T#328[String/T]): 
                                  Option/T#82[String/T]
                                )
                              >
                            (inUsername @ <_:String/T>):Some/T#328[String/T]>
                           :Some/T#328[String/T]:Some/T#328[String/T]>
                         => 
                          <
                            <
                              <
                                <
                                  <<x#25.CBM#3997:x#25.CBM/T#3998>.map#11257:
                                    ([A/T#765707521, B/T#765707521]#765707521
                                      (fa#429861691: 
                                        x#25.CB/T#3993[A/T#765707521]
                                      )
                                        (f#539037251: A/T#765707521 => 
                                          B/T#765707521
                                        ): x#25.CB/T#3993[B/T#765707521]
                                    )
                                  >
                                [String/T, Unit/T#157 |/T String/T]:
                                  ((fa#1297687496: x#25.CB/T#3993[String/T])
                                    (f#1696755510: String/T => Unit/T#157 |/T 
                                      String/T
                                    ): x#25.CB/T#3993[Unit/T#157 |/T String/T]
                                  )
                                >
                              (
                                <
                                  <
                                    <x#25.VP1#4020.op1#6134:
                                      ((): x#25.CB/T#3993[String/T#6171])
                                    >
                                  ():x#25.CB/T#3993[String/T#6171]>
                                :x#25.CB/T#3993[String/T#6171]>
                              ):
                                ((f#1696755510: String/T => Unit/T#157 |/T 
                                  String/T
                                ): x#25.CB/T#3993[Unit/T#157 |/T String/T])
                              >
                            (
                              <
                                {
                                  def $anonfun#11353
                                    (vx#1106157922: String/T): Unit/T#157 |/T 
                                      String/T
                                  <closure(
                                    <$anonfun#11353:
                                      (vx#1106157922: String/T): Unit/T#157 |/T 
                                        String/T
                                    >
                                  ):String/T => Unit/T#157 |/T String/T>
                                }
                              :String/T => Unit/T#157 |/T String/T>
                            ):x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                          :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                        :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                      }
                    :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                  :x#25.CB/T#3993[Unit/T#157 |/T String/T]>
                ):
                  ((f#776961165: Unit/T#157 |/T String/T => Unit/T#157): 
                    x#25.CB/T#3993[Unit/T#157]
                  )
                >
              (
                <
                  {
                    def $anonfun#11364
                      (vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
                    <closure(
                      <$anonfun#11364:
                        (vx#605816902: Unit/T#157 |/T String/T): Unit/T#157
                      >
                    ):Unit/T#157 |/T String/T => Unit/T#157>
                  }
                :Unit/T#157 |/T String/T => Unit/T#157>
              ):x#25.CB/T#3993[Unit/T#157]>
            :x#25.CB/T#3993[Unit/T#157]>
          }
        :x#25.CB/T#3993[Unit/T#157]>
      :x#25.CB/T#3993[Unit/T#157]>
    ):x#25.CB/T#3993[Unit/T#157]>
  :x#25.CB/T#3993[Unit/T#157]>
:x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1
exception while typing def allocateServiceOperator#6133
  (optInUsername#1376812582: Option/T#82[String/T#6171]): 
    x#25.CB/T#3993[Unit/T#157] of class class dotty.tools.dotc.ast.Trees$DefDef # -1
exception while typing final module class VP1/T#4021() extends <
  <<new Object/T:Object/T>:((): Object/T)>
():Object/T> { this: x#25.VP1#4020.type =>
  def allocateServiceOperator#6133
    (optInUsername#1376812582: Option/T#82[String/T#6171]): 
      x#25.CB/T#3993[Unit/T#157]
  def op1#6134(): x#25.CB/T#3993[String/T#6171]
} of class class dotty.tools.dotc.ast.Trees$TypeDef # -1
exception while typing <package <x#25:x/T#26> {
  final lazy module object VP1#4020: x#25.VP1/T#4021
  final module class VP1/T#4021() extends <
    <<new Object/T:Object/T>:((): Object/T)>
  ():Object/T> { this: x#25.VP1#4020.type =>
    def allocateServiceOperator#6133
      (optInUsername#1376812582: Option/T#82[String/T#6171]): 
        x#25.CB/T#3993[Unit/T#157]
    def op1#6134(): x#25.CB/T#3993[String/T#6171]
  }
}:x#25.type> of class class dotty.tools.dotc.ast.Trees$PackageDef # -1
*** error while checking /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala after phase typer ***
[info] exception occurred while compiling /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala
java.lang.AssertionError: assertion failed: bad owner; method $anonfun#11353 has owner method $anonfun#11266, expected was method allocateServiceOperator#6133
owner chain = method $anonfun#11353, method $anonfun#11266, value macro#9646, method allocateServiceOperator#6133, object VP1/T, package x/T#26, package <root>/T#2, ctxOwners = method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, object VP1/T, object VP1/T, object VP1/T, package x/T#26, package <root>/T#2, package <root>/T#2, package <root>/T#2, package <root>/T#2, package <root>/T#2, package <root>/T#2, package <root>/T#2,  <none>#0,  <none>#0,  <none>#0,  <none>#0 while compiling /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala
[error] ## Exception when compiling 1 sources to /Users/rssh/work/oss/dotty-cps/dotty-cps-async/jvm/target/scala-3.1.0/test-classes
[error] java.lang.AssertionError: assertion failed: bad owner; method $anonfun#11353 has owner method $anonfun#11266, expected was method allocateServiceOperator#6133
[error] owner chain = method $anonfun#11353, method $anonfun#11266, value macro#9646, method allocateServiceOperator#6133, object VP1/T, package x/T#26, package <root>/T#2, ctxOwners = method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, object VP1/T, object VP1/T, object VP1/T, package x/T#26, package <root>/T#2, package <root>/T#2, package <root>/T#2, package <root>/T#2, package <root>/T#2, package <root>/T#2, package <root>/T#2,  <none>#0,  <none>#0,  <none>#0,  <none>#0
[error] scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8)
[error] dotty.tools.dotc.transform.TreeChecker$Checker.checkOwner(TreeChecker.scala:455)
[error] dotty.tools.dotc.transform.TreeChecker$Checker.typedStats$$anonfun$1(TreeChecker.scala:545)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.immutable.List.foreach(List.scala:333)
[error] dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:548)
[error] dotty.tools.dotc.typer.Typer.typedBlockStats(Typer.scala:1027)
[error] dotty.tools.dotc.typer.Typer.typedBlock(Typer.scala:1031)
[error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$2$$anonfun$1(TreeChecker.scala:531)
[error] dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:192)
[error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$1(TreeChecker.scala:531)
[error] dotty.tools.dotc.transform.TreeChecker$Checker.withBlock(TreeChecker.scala:220)
[error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock(TreeChecker.scala:531)
[error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2763)
[error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2818)
[error] dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:121)....
</details>
@rssh
Copy link
Contributor Author

rssh commented Oct 25, 2021

vp1-min-dotty-cps-async.tar.gz

ready to run project

@nicolasstucki
Copy link
Contributor

Was this executed with -Xcheck-macros?

@rssh
Copy link
Contributor Author

rssh commented Oct 25, 2021

- Y:check:macros -- the same (i.e. assertion about "] java.util.NoSuchElementException: key not found: method $anonfun )

  • Y:check:all - message about invalid owner
``` info] checking /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala after phase typer exception while typing < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Block # -1 exception while typing < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292]): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < <(): x#25.CB/T#3993[String/T#6171] > :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Apply # -1 exception while typing < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292]): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < <(): x#25.CB/T#3993[String/T#6171] > :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1 exception while typing < { < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < <(): x#25.CB/T#3993[String/T#6171] > :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Block # -1 exception while typing < match { => < < { def _whilefun#11410(): x#25.CB/T#3993[Unit/T#157] <<_whilefun#11410:((): x#25.CB/T#3993[Unit/T#157])>(): x#25.CB/T#3993[Unit/T#157] > } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> .unapply#8310: ([A/T#1405029826]#1405029826 (x$0#1344187839: Some/T#328[A/T#1405029826]): Option/T#82[A/T#1405029826] ) > [String/T]: ((x$0#2068927264: Some/T#328[String/T]): Option/T#82[String/T]) > (inUsername @ <_:String/T>):Some/T#328[String/T]> :Some/T#328[String/T]:Some/T#328[String/T]> => < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < <(): x#25.CB/T#3993[String/T#6171] > :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T]) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Match # -1 exception while typing < < match { => < < { def _whilefun#11410(): x#25.CB/T#3993[Unit/T#157] <<_whilefun#11410:((): x#25.CB/T#3993[Unit/T#157])>(): x#25.CB/T#3993[Unit/T#157] > } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> .unapply#8310: ([A/T#1405029826]#1405029826 (x$0#1344187839: Some/T#328[A/T#1405029826]): Option/T#82[A/T#1405029826] ) > [String/T]: ((x$0#2068927264: Some/T#328[String/T]): Option/T#82[String/T]) > (inUsername @ <_:String/T>):Some/T#328[String/T]> :Some/T#328[String/T]:Some/T#328[String/T]> => < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < <(): x#25.CB/T#3993[String/T#6171] > :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T]) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1 exception while typing < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292]): x#25.CB/T#3993[B/T#1097476292] ) > [Unit/T#157 |/T String/T, Unit/T#157]: ((fa#533034517: x#25.CB/T#3993[Unit/T#157 |/T String/T]) (f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157] ) > ( < < match { => < < { def _whilefun#11410(): x#25.CB/T#3993[Unit/T#157] <<_whilefun#11410:((): x#25.CB/T#3993[Unit/T#157])>(): x#25.CB/T#3993[Unit/T#157] > } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> .unapply#8310: ([A/T#1405029826]#1405029826 (x$0#1344187839: Some/T#328[A/T#1405029826]): Option/T#82[A/T#1405029826] ) > [String/T]: ((x$0#2068927264: Some/T#328[String/T]): Option/T#82[String/T]) > (inUsername @ <_:String/T>):Some/T#328[String/T]> :Some/T#328[String/T]:Some/T#328[String/T]> => < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < <( ) :x#25.CB/T#3993[String/T#6171]> :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T]) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> ): (f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157] > of class class dotty.tools.dotc.ast.Trees$Apply # -1 exception while typing < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292]): x#25.CB/T#3993[B/T#1097476292] ) > [Unit/T#157 |/T String/T, Unit/T#157]: ((fa#533034517: x#25.CB/T#3993[Unit/T#157 |/T String/T]) (f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157] ) > ( < < match { => < < { def _whilefun#11410(): x#25.CB/T#3993[Unit/T#157] <<_whilefun#11410:((): x#25.CB/T#3993[Unit/T#157])>(): x#25.CB/T#3993[Unit/T#157] > } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> .unapply#8310: ([A/T#1405029826]#1405029826 (x$0#1344187839: Some/T#328[A/T#1405029826]): Option/T#82[A/T#1405029826] ) > [String/T]: ((x$0#2068927264: Some/T#328[String/T]): Option/T#82[String/T] ) > (inUsername @ <_:String/T>):Some/T#328[String/T]> :Some/T#328[String/T]:Some/T#328[String/T]> => < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < < ():x#25.CB/T#3993[String/T#6171]> :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T]) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> ): ((f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157] ) > ( < { def $anonfun#11394 (vx#241716168: Unit/T#157 |/T String/T): x#25.CB/T#3993[Unit/T#157] ):Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> } :Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> ):x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Apply # -1 exception while typing < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292]): x#25.CB/T#3993[B/T#1097476292] ) > [Unit/T#157 |/T String/T, Unit/T#157]: ((fa#533034517: x#25.CB/T#3993[Unit/T#157 |/T String/T]) (f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157] ) > ( < < match { => < < { def _whilefun#11410(): x#25.CB/T#3993[Unit/T#157] <<_whilefun#11410:((): x#25.CB/T#3993[Unit/T#157])>(): x#25.CB/T#3993[Unit/T#157] > } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> .unapply#8310: ([A/T#1405029826]#1405029826 (x$0#1344187839: Some/T#328[A/T#1405029826]): Option/T#82[A/T#1405029826] ) > [String/T]: ((x$0#2068927264: Some/T#328[String/T]): Option/T#82[String/T] ) > (inUsername @ <_:String/T>):Some/T#328[String/T]> :Some/T#328[String/T]:Some/T#328[String/T]> => < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < < ():x#25.CB/T#3993[String/T#6171]> :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T]) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> ): ((f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157] ) > ( < { def $anonfun#11394 (vx#241716168: Unit/T#157 |/T String/T): x#25.CB/T#3993[Unit/T#157] ):Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> } :Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> ):x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1 exception while typing < { < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [Unit/T#157 |/T String/T, Unit/T#157]: ((fa#533034517: x#25.CB/T#3993[Unit/T#157 |/T String/T]) (f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157] ): x#25.CB/T#3993[Unit/T#157] ) > ( < < match { => < < { def _whilefun#11410(): x#25.CB/T#3993[Unit/T#157] <<_whilefun#11410:((): x#25.CB/T#3993[Unit/T#157])>(): x#25.CB/T#3993[Unit/T#157] > } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> .unapply#8310: ([A/T#1405029826]#1405029826 (x$0#1344187839: Some/T#328[A/T#1405029826]): Option/T#82[A/T#1405029826] ) > [String/T]: ((x$0#2068927264: Some/T#328[String/T]): Option/T#82[String/T] ) > (inUsername @ <_:String/T>):Some/T#328[String/T]> :Some/T#328[String/T]:Some/T#328[String/T]> => < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < < ():x#25.CB/T#3993[String/T#6171]> :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T]) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> ): ((f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157] ): x#25.CB/T#3993[Unit/T#157]) > ( < { def $anonfun#11394 (vx#241716168: Unit/T#157 |/T String/T): x#25.CB/T#3993[Unit/T#157] ):Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> } :Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> ):x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> } :x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Block # -1 exception while typing < < { < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [Unit/T#157 |/T String/T, Unit/T#157]: ((fa#533034517: x#25.CB/T#3993[Unit/T#157 |/T String/T]) (f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157] ): x#25.CB/T#3993[Unit/T#157] ) > ( < < match { => < < { def _whilefun#11410(): x#25.CB/T#3993[Unit/T#157] <<_whilefun#11410:((): x#25.CB/T#3993[Unit/T#157])>(): x#25.CB/T#3993[Unit/T#157] > } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> .unapply#8310: ([A/T#1405029826]#1405029826 (x$0#1344187839: Some/T#328[A/T#1405029826]): Option/T#82[A/T#1405029826] ) > [String/T]: ((x$0#2068927264: Some/T#328[String/T]): Option/T#82[String/T] ) > (inUsername @ <_:String/T>):Some/T#328[String/T]> :Some/T#328[String/T]:Some/T#328[String/T]> => < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < < ():x#25.CB/T#3993[String/T#6171]> :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T]) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] > } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> ): ((f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157] ): x#25.CB/T#3993[Unit/T#157]) > ( < { def $anonfun#11394 (vx#241716168: Unit/T#157 |/T String/T): x#25.CB/T#3993[Unit/T#157] ):Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> } :Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> ):x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1 exception while typing < < <.spawn#11258: ([A/T#1702370716]#1702370716 (op#127437572: => x#25.CB/T#3993[A/T#1702370716]): x#25.CB/T#3993[A/T#1702370716] ) > [Unit/T#157]: ((op#869867580: => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157]) > ( < < { < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [Unit/T#157 |/T String/T, Unit/T#157]: ((fa#533034517: x#25.CB/T#3993[Unit/T#157 |/T String/T]) (f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157] ): x#25.CB/T#3993[Unit/T#157] ) > ( < < match { => < < { def _whilefun#11410(): x#25.CB/T#3993[Unit/T#157] <<_whilefun#11410:((): x#25.CB/T#3993[Unit/T#157])>( ) :x#25.CB/T#3993[Unit/T#157]> } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> .unapply#8310: ([A/T#1405029826]#1405029826 (x$0#1344187839: Some/T#328[A/T#1405029826]): Option/T#82[A/T#1405029826] ) > [String/T]: ((x$0#2068927264: Some/T#328[String/T]): Option/T#82[String/T] ) > (inUsername @ <_:String/T>):Some/T#328[String/T]> :Some/T#328[String/T]:Some/T#328[String/T]> => < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292] ) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < < ():x#25.CB/T#3993[String/T#6171]> :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T]) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] > } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T]> ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> ): ((f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157] ): x#25.CB/T#3993[Unit/T#157]) > ( < { def $anonfun#11394 (vx#241716168: Unit/T#157 |/T String/T): x#25.CB/T#3993[Unit/T#157] ):Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> } :Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> ):x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> ):x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Apply # -1 exception while typing < < < <.spawn#11258: ([A/T#1702370716]#1702370716 (op#127437572: => x#25.CB/T#3993[A/T#1702370716]): x#25.CB/T#3993[A/T#1702370716] ) > [Unit/T#157]: ((op#869867580: => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157] ) > ( < < { < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [Unit/T#157 |/T String/T, Unit/T#157]: ((fa#533034517: x#25.CB/T#3993[Unit/T#157 |/T String/T]) (f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157] ): x#25.CB/T#3993[Unit/T#157] ) > ( < < match { => < < { def _whilefun#11410(): x#25.CB/T#3993[Unit/T#157] < <_whilefun#11410: ((): x#25.CB/T#3993[Unit/T#157]) > ():x#25.CB/T#3993[Unit/T#157]> } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> .unapply#8310: ([A/T#1405029826]#1405029826 (x$0#1344187839: Some/T#328[A/T#1405029826]): Option/T#82[A/T#1405029826] ) > [String/T]: ((x$0#2068927264: Some/T#328[String/T]): Option/T#82[String/T] ) > (inUsername @ <_:String/T>):Some/T#328[String/T]> :Some/T#328[String/T]:Some/T#328[String/T]> => < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292] ) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < < ():x#25.CB/T#3993[String/T#6171]> :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T]) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] > } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] > ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> ): ((f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157] ): x#25.CB/T#3993[Unit/T#157]) > ( < { def $anonfun#11394 (vx#241716168: Unit/T#157 |/T String/T): x#25.CB/T#3993[Unit/T#157] ):Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> } :Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> ):x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> ):x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1 exception while typing < < < < <.spawn#11258: ([A/T#1702370716]#1702370716 (op#127437572: => x#25.CB/T#3993[A/T#1702370716]): x#25.CB/T#3993[A/T#1702370716] ) > [Unit/T#157]: ((op#869867580: => x#25.CB/T#3993[Unit/T#157]): x#25.CB/T#3993[Unit/T#157] ) > ( < < { < < < < <.flatMap#11257: ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292]) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [Unit/T#157 |/T String/T, Unit/T#157]: ((fa#533034517: x#25.CB/T#3993[Unit/T#157 |/T String/T]) (f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157] ): x#25.CB/T#3993[Unit/T#157] ) > ( < < match { => < < { def _whilefun#11410 (): x#25.CB/T#3993[Unit/T#157] < <_whilefun#11410: ((): x#25.CB/T#3993[Unit/T#157]) > ():x#25.CB/T#3993[Unit/T#157]> } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> .unapply#8310: ([A/T#1405029826]#1405029826 (x$0#1344187839: Some/T#328[A/T#1405029826] ): Option/T#82[A/T#1405029826] ) > [String/T]: ((x$0#2068927264: Some/T#328[String/T]): Option/T#82[String/T] ) > (inUsername @ <_:String/T>):Some/T#328[String/T]> :Some/T#328[String/T]:Some/T#328[String/T]> => < < < < <.flatMap#11257 : ([A/T#1097476292, B/T#1097476292]#1097476292 (fa#1214803733: x#25.CB/T#3993[A/T#1097476292] ) (f#1015314875: A/T#1097476292 => x#25.CB/T#3993[B/T#1097476292] ): x#25.CB/T#3993[B/T#1097476292] ) > [String/T, Unit/T#157 |/T String/T]: ((fa#215918310: x#25.CB/T#3993[String/T]) (f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T] ) > ( < < ():x#25.CB/T#3993[String/T#6171]> :x#25.CB/T#3993[String/T#6171]> ): ((f#319311719: String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] ): x#25.CB/T#3993[Unit/T#157 |/T String/T]) > ( < { def $anonfun#11380 (vx#1686160858: String/T): x#25.CB/T#3993[Unit/T#157 |/T String/T] ):String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] > } :String/T => x#25.CB/T#3993[Unit/T#157 |/T String/T] > ):x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> } :x#25.CB/T#3993[Unit/T#157 |/T String/T]> :x#25.CB/T#3993[Unit/T#157 |/T String/T]> ): ((f#329676261: Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157] ): x#25.CB/T#3993[Unit/T#157]) > ( < { def $anonfun#11394 (vx#241716168: Unit/T#157 |/T String/T): x#25.CB/T#3993[Unit/T#157] ):Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> } :Unit/T#157 |/T String/T => x#25.CB/T#3993[Unit/T#157]> ):x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> } :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> ):x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> :x#25.CB/T#3993[Unit/T#157]> of class class dotty.tools.dotc.ast.Trees$Inlined # -1 exception while typing def allocateServiceOperator#6133 (optInUsername#334525183: Option/T#82[String/T#6171]): x#25.CB/T#3993[Unit/T#157] of class class dotty.tools.dotc.ast.Trees$DefDef # -1 exception while typing final module class VP1/T#4021() extends < <:((): Object/T)> ():Object/T> { this: x#25.VP1#4020.type => def allocateServiceOperator#6133 (optInUsername#334525183: Option/T#82[String/T#6171]): x#25.CB/T#3993[Unit/T#157] def op1#6134(): x#25.CB/T#3993[String/T#6171] } of class class dotty.tools.dotc.ast.Trees$TypeDef # -1 exception while typing { final lazy module object VP1#4020: x#25.VP1/T#4021 final module class VP1/T#4021() extends < <:((): Object/T)> ():Object/T> { this: x#25.VP1#4020.type => def allocateServiceOperator#6133 (optInUsername#334525183: Option/T#82[String/T#6171]): x#25.CB/T#3993[Unit/T#157] def op1#6134(): x#25.CB/T#3993[String/T#6171] } }:x#25.type> of class class dotty.tools.dotc.ast.Trees$PackageDef # -1 *** error while checking /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala after phase typer *** [info] exception occurred while compiling /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala java.lang.AssertionError: assertion failed: bad owner; method $anonfun#11380 has owner method $anonfun#11265, expected was method allocateServiceOperator#6133 owner chain = method $anonfun#11380, method $anonfun#11265, value macro#9646, method allocateServiceOperator#6133, object VP1/T, package x/T#26, package /T#2, ctxOwners = method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, object VP1/T, object VP1/T, object VP1/T, package x/T#26, package /T#2, package /T#2, package /T#2, package /T#2, package /T#2, package /T#2, package /T#2, #0, #0, #0, #0 while compiling /Users/rssh/work/oss/dotty-cps/dotty-cps-async/shared/src/test/scala/cps/vp/VP1.scala [error] ## Exception when compiling 1 sources to /Users/rssh/work/oss/dotty-cps/dotty-cps-async/jvm/target/scala-3.1.0/test-classes [error] java.lang.AssertionError: assertion failed: bad owner; method $anonfun#11380 has owner method $anonfun#11265, expected was method allocateServiceOperator#6133 [error] owner chain = method $anonfun#11380, method $anonfun#11265, value macro#9646, method allocateServiceOperator#6133, object VP1/T, package x/T#26, package /T#2, ctxOwners = method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, object VP1/T, object VP1/T, object VP1/T, package x/T#26, package /T#2, package /T#2, package /T#2, package /T#2, package /T#2, package /T#2, package /T#2, #0, #0, #0, #0 [error] scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8) [error] dotty.tools.dotc.transform.TreeChecker$Checker.checkOwner(TreeChecker.scala:455) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedStats$$anonfun$1(TreeChecker.scala:545) [error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15) [error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10) [error] scala.collection.immutable.List.foreach(List.scala:333) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:548) [error] dotty.tools.dotc.typer.Typer.typedBlockStats(Typer.scala:1027) [error] dotty.tools.dotc.typer.Typer.typedBlock(Typer.scala:1031) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$2$$anonfun$1(TreeChecker.scala:531) [error] dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:192) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$1(TreeChecker.scala:531) [error] dotty.tools.dotc.transform.TreeChecker$Checker.withBlock(TreeChecker.scala:220) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock(TreeChecker.scala:531) [error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2763) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2818) [error] dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:121) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:326) [error] dotty.tools.dotc ```

message after dump:

```Scala java.lang.AssertionError: assertion failed: bad owner; method $anonfun#11380 has owner method $anonfun#11265, expected was method allocateServiceOperator#6133 owner chain = method $anonfun#11380, method $anonfun#11265, value macro#9646, method allocateServiceOperator#6133, object VP1/T, package x/T#26, package /T#2, ctxOwners = method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, method allocateServiceOperator#6133, ... ```

@rssh
Copy link
Contributor Author

rssh commented Oct 25, 2021

Also, what is interesting, when minimizing it (after submitting first version). I have received, that chunk of code. A which have two identical quotes inside match, give an error, but B - where the same quote returning as constant - not.

A. (identical quotes inside match):

class ValRhsFlatMappedCpsExpr[T:Type, V:Type](using thisQuotes: Quotes)(
    ......

      override def fLast(using Quotes):Expr[CB[T]] =
           import quotes.reflect._
           next.syncOrigin match
             case Some(nextOrigin) =>
               // owner of this block is incorrect
              '{
                 CBM.flatMap(${cpsRhs.transformed})((vx:V) =>
                           ${buildAppendBlockExpr('vx, next.transformed)})
               }
             case  None =>
              '{
                CBM.flatMap(${cpsRhs.transformed})((v:V)=>
                           ${buildAppendBlockExpr('v, next.transformed)})
              }
           //'{
           //    CBM.flatMap(${cpsRhs.transformed})((v:V)=>
           //                ${buildAppendBlockExpr('v, next.transformed)})
           //}

B:

class ValRhsFlatMappedCpsExpr[T:Type, V:Type](using thisQuotes: Quotes)(
    ......

      override def fLast(using Quotes):Expr[CB[T]] =
           import quotes.reflect._
           //next.syncOrigin match
           //  case Some(nextOrigin) =>
           //    // owner of this block is incorrect
           //   '{
           //      CBM.flatMap(${cpsRhs.transformed})((vx:V) =>
           //                ${buildAppendBlockExpr('vx, next.transformed)})
           //    }
           //  case  None =>
           //   '{
           //     CBM.flatMap(${cpsRhs.transformed})((v:V)=>
           //               ${buildAppendBlockExpr('v, next.transformed)})
           //   }
           '{
               CBM.flatMap(${cpsRhs.transformed})((v:V)=>
                           ${buildAppendBlockExpr('v, next.transformed)})
           }

@nicolasstucki
Copy link
Contributor

The issue comes from a block that contains two definitions that has different owners. This is an invariant we assume to be able to efficiently change owners automatically in quotes. The owner of one of those statements should be changed using changeOwner.

The real issue is that -Xcheck-macros should have found this inconsistency and report a helpful error message when the block is created.

@nicolasstucki
Copy link
Contributor

Minimized example

package x

import scala.annotation._
import scala.quoted._

trait CB[+T]

object CBM:
  def pure[T](t:T):CB[T] = ???
  def map[A,B](fa:CB[A])(f: A=>B):CB[B] = ???
  def flatMap[A,B](fa:CB[A])(f: A=>CB[B]):CB[B] = ???


@compileTimeOnly("await should be inside async block")
def await[T](f: CB[T]): T = ???


trait CpsExpr[T:Type](prev: Seq[Expr[?]]):

   def fLast(using Quotes): Expr[CB[T]]
   def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T]
   def append[A:Type](chunk: CpsExpr[A])(using Quotes): CpsExpr[A]
   def syncOrigin(using Quotes): Option[Expr[T]]
   def map[A:Type](f: Expr[T => A])(using Quotes): CpsExpr[A] =
           MappedCpsExpr[T,A](Seq(),this,f)
   def flatMap[A:Type](f: Expr[T => CB[A]])(using Quotes): CpsExpr[A] =
           FlatMappedCpsExpr[T,A](Seq(),this,f)

   def transformed(using Quotes): Expr[CB[T]] =
      import quotes.reflect._
      Block(prev.toList.map(_.asTerm), fLast.asTerm).asExprOf[CB[T]]


case class GenericSyncCpsExpr[T:Type](prev: Seq[Expr[?]],last: Expr[T]) extends CpsExpr[T](prev):

       override def fLast(using Quotes): Expr[CB[T]] = '{???}

       override def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] =
         copy(prev = exprs ++: prev)


       override def syncOrigin(using Quotes): Option[Expr[T]] =
         import quotes.reflect._
         Some(last)

       override def append[A:Type](e: CpsExpr[A])(using Quotes) = e

       override def map[A:Type](f: Expr[T => A])(using Quotes): CpsExpr[A] =
         copy(last = '{ ??? })

       override def flatMap[A:Type](f: Expr[T => CB[A]])(using Quotes): CpsExpr[A] =
         GenericAsyncCpsExpr[A](prev, '{ ??? } )


abstract class AsyncCpsExpr[T:Type](
                               prev: Seq[Expr[?]]
                             ) extends CpsExpr[T](prev):

   override def append[A:Type](e: CpsExpr[A])(using Quotes): CpsExpr[A] =
            flatMap( '{ ??? })

   override def syncOrigin(using Quotes): Option[Expr[T]] = None



case class GenericAsyncCpsExpr[T:Type](
                             prev: Seq[Expr[?]],
                             fLastExpr: Expr[CB[T]]
                             ) extends AsyncCpsExpr[T](prev):

   override def fLast(using Quotes): Expr[CB[T]] = fLastExpr

   override def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] =
         copy(prev = exprs ++: prev)

   override def map[A:Type](f: Expr[T => A])(using Quotes): CpsExpr[A] =
            MappedCpsExpr(Seq(),this,f)

   override def flatMap[A:Type](f: Expr[T => CB[A]])(using Quotes): CpsExpr[A] =
            FlatMappedCpsExpr(Seq(),this,f)



case class MappedCpsExpr[S:Type, T:Type](
                               prev: Seq[Expr[?]],
                               point: CpsExpr[S],
                               mapping: Expr[S=>T]
                               ) extends AsyncCpsExpr[T](prev):

   override def fLast(using Quotes): Expr[CB[T]] =
            '{ ??? }

   override def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] =
           copy(prev = exprs ++: prev)



case class FlatMappedCpsExpr[S:Type, T:Type](
                               prev: Seq[Expr[?]],
                               point: CpsExpr[S],
                               mapping: Expr[S => CB[T]]
                              ) extends AsyncCpsExpr[T](prev):

     override def fLast(using Quotes): Expr[CB[T]] =
                   '{ CBM.flatMap(${point.transformed})($mapping) }

     override def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] =
           copy(prev = exprs ++: prev)


class ValRhsFlatMappedCpsExpr[T:Type, V:Type](using thisQuotes: Quotes)
                                      (
                                       prev: Seq[Expr[?]],
                                       oldValDef: quotes.reflect.ValDef,
                                       cpsRhs: CpsExpr[V],
                                       next: CpsExpr[T]
                                      )
                                     extends AsyncCpsExpr[T](prev) {

      override def fLast(using Quotes):Expr[CB[T]] =
           import quotes.reflect._
           next.syncOrigin match
             case Some(nextOrigin) =>
               // owner of this block is incorrect
              '{
                ${cpsRhs.transformed};
                ((vx:V) => $nextOrigin);
                ???
               }
             case  None =>
              '{
                ${cpsRhs.transformed};
                ((v:V)=> ${next.transformed});
                ???
              }


      override def prependExprs(exprs: Seq[Expr[?]]): CpsExpr[T] =
           ValRhsFlatMappedCpsExpr(using thisQuotes)(exprs ++: prev,oldValDef,cpsRhs,next)

      override def append[A:quoted.Type](e: CpsExpr[A])(using Quotes) =
           ValRhsFlatMappedCpsExpr(using thisQuotes)(prev,oldValDef,cpsRhs,next.append(e))

}


object CpsExpr:

    def sync[T:Type](f: Expr[T]): CpsExpr[T] =
      GenericSyncCpsExpr[T](Seq(), f)

    def async[T:Type](f: Expr[CB[T]]): CpsExpr[T] =
      GenericAsyncCpsExpr[T](Seq(), f)


object Async:

   inline def transform[T](inline expr: T) =  ${
      Async.transformImpl[T]('expr)
   }

   def transformImpl[T:Type](f: Expr[T])(using Quotes): Expr[CB[T]] =
      import quotes.reflect._
      println(s"before transformed: ${f.show}")
      val cpsExpr = rootTransform[T](f)
      val r = '{ ${cpsExpr.transformed}; ??? }
      println(s"transformed value: ${r.show}")
      r

   def rootTransform[T:Type](f: Expr[T])(using Quotes): CpsExpr[T] = {
      import quotes.reflect._
      val fTree = f.asTerm
      fTree match {
          case fun@Apply(fun1@TypeApply(obj2,targs2), args1) =>
            CpsExpr.async('{???})
          case Block(prevs,last) =>
            val rPrevs = prevs.map{ p =>
                p match
                  case v@ValDef(vName,vtt,optRhs) =>
                    optRhs.get.tpe.widen.asType match
                      case '[l] =>
                        val cpsRight = rootTransform(optRhs.get.asExprOf[l])
                        ValRhsFlatMappedCpsExpr(using quotes)(Seq(), v, cpsRight, CpsExpr.sync('{}))

              }
              val rLast = rootTransform(last.asExprOf[T])
              val blockResult = rPrevs.foldRight(rLast)((e,s) => e.append(s))
              CpsExpr.async(blockResult.transformed)

          case Inlined(_,_,body) =>
            rootTransform(body.asExprOf[T])
          case Literal(_)=>
            CpsExpr.sync('{???})
      }
   }
package x

object VP1:

   def allocateServiceOperator(optInUsername: Option[String]): CB[Unit] = Async.transform {
      val username = {
        val nextResult = await(op1())
        val countResult = await(op1())
      }
   }

   def op1(): CB[String] = ???

nicolasstucki added a commit to dotty-staging/dotty that referenced this issue Oct 26, 2021
Checks that all definitions in the block have the same owner

Closes scala#13809
nicolasstucki added a commit to dotty-staging/dotty that referenced this issue Oct 26, 2021
Checks that all definitions in the block have the same owner

Closes scala#13809
nicolasstucki added a commit to dotty-staging/dotty that referenced this issue Oct 26, 2021
Checks that all definitions in the block have the same owner

Closes scala#13809
rssh added a commit to dotty-cps-async/dotty-cps-async that referenced this issue Oct 27, 2021
nicolasstucki added a commit to dotty-staging/dotty that referenced this issue Oct 27, 2021
Checks that all definitions in the block have the same owner

Closes scala#13809
olsdavis pushed a commit to olsdavis/dotty that referenced this issue Apr 4, 2022
Checks that all definitions in the block have the same owner

Closes scala#13809
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants