rssh / dotty-cps-async

experimental CPS transformer for dotty
Apache License 2.0
178 stars 22 forks source link

New compilation failure when for-loop and match both used in async (after upgrading 0.9.5→0.9.7) #56

Closed ScoreUnder closed 2 years ago

ScoreUnder commented 2 years ago

I found a compile-time error in my project which I bisected to one of these commits in dotty-cps-async:

There are only 'skip'ped commits left to test.
The first bad commit could be any of: a74c5d997806a37d164cfd0a9d8da9f4f1dbe522 afa62ed96da96b0b7619165bee4d64abc052f2b4 2e7794c0d10aa54ff4ad3c8563e999020873ab1e dd3ddf950b20138a0f845a2ba571fc6ccdfe06ce 070ac891bb87d0f767065ed65dfaf94dbe0fc1f0 2f744f2b73003d3d819c5a93bfc622c5f6e9a05d b3d9feb2a2e9c2305e2f65d0a55a9f22753d5c46 We cannot bisect more!

I had to skip some which either would not build on my machine or which did not run in my project for other reasons (class version mismatch).

I have tried to minimise the code which triggers the bug, but here are a few pieces of code that all trigger it:

Import statements ```scala import cps.* import cps.monads.FutureAsyncMonad import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future ```

1.

    def thing(): Future[String] =
      async {
        for _ <- Nil do
          ???

        Option("") match
          case None =>
          case Some(_) =>
            await(??? : Future[Unit])

        "Test"
      }

2.

    def thing(): Future[String] =
      async {
        for _ <- Nil do
          ???

        Option("") match
          case None =>
            await(??? : Future[String])
          case Some(_) =>
            await(??? : Future[String])
      }

3.

    def thing(): Future[String] =
      async {
        for _ <- Nil do
          ???

        await({
          Option("") match
            case None =>
              ??? : Future[String]
            case Some(_) =>
              ??? : Future[String]
        })
      }

(Pick whichever is the simpler example for your internals)

Notably, removing the foreach-loop (which is not using await) somehow makes it work again, as does collapsing the match. In the 3rd example, if you extract the argument to await into a variable and await on the variable instead, that works too.

ScoreUnder commented 2 years ago

real-life code where I worked around it: https://github.com/ScoreUnder/canti-bot/commit/a92a67cb14d8b8ff1680accff3b400ceb3e66053

rssh commented 2 years ago

Hi, thanks - will look. It's with 0.9.8 and dotty-3.1.1 ?

rssh commented 2 years ago

caused by https://github.com/lampepfl/dotty/issues/14393

ScoreUnder commented 2 years ago

It's with 0.9.8 and dotty-3.1.1 ?

It's with 0.9.7 and dotty 3.1.1. The issue still does happen on the latest master too (d82a36a5fce247eeeb6658cd92112f649f0825c9).

Thanks for looking into this

rssh commented 2 years ago

should be fixed now.