Skip to content

Enabling coverage breaks synchronized blocks #16940

Closed
@mohe2015

Description

@mohe2015

Compiler version

3.2.2

Minimized code

https://github.com/mohe2015/coverage-synchronized-bug

scala -coverage-out coverage src/main/scala/Main.scala

import concurrent.ExecutionContext.Implicits.global
import scala.concurrent.*
import scala.concurrent.duration.*

var test = 0

def brokenSynchronizedBlock(option: Boolean): Future[Unit] = Future {
  if (option) {
    Thread.sleep(500)
  }
  synchronized {
    val tmp = test
    Thread.sleep(1000)
    test = tmp + 1
  }
}

@main def main: Unit = {
  Await.result(Future.sequence(Seq(brokenSynchronizedBlock(false), brokenSynchronizedBlock(true))).map(result => {
    println(test)
    assert(test == 2)
  }), 3.seconds)
}

Output

1
java.util.concurrent.ExecutionException: Boxed Exception
        at scala.concurrent.impl.Promise$.scala$concurrent$impl$Promise$$resolve(Promise.scala:99)
        at scala.concurrent.impl.Promise$Transformation.handleFailure(Promise.scala:444)
        at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:506)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: java.lang.AssertionError: assertion failed
        at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:11)
        at Main$package$.$anonfun$1(Main.scala:21)
        at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
        at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
        at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:467)
        ... 6 more

Expectation

2

Metadata

Metadata

Assignees

Labels

area:coverageCode coverage, see https://dotty.epfl.ch/docs/internals/coverage.htmlitype:bug

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions