Scala 3.0.0-RC2 – getting ready for 3.0.0

Hello! We are happy to announce Scala 3.0.0-RC2. With this release, we are getting ready for 3.0.0. The significance of it is to give the community the chance and time to test all the changes meant for 3.0.0 final. A lot of bug fixes found their way into this release to ensure stability for 3.0.0 – more than 250 PRs were merged after the 3.0.0-RC1 release and until today!

Read more about this release below.

Significance and further steps

The 3.0.0-RC releases are release candidates for the 3.0.0 final. This means we aim to pack all the features meant for 3.0.0 into these releases and ensure their stability. After a grace period during which the community tests the latest release candidate, if no major problems are discovered, that release candidate becomes 3.0.0 stable.

3.0.0-RC2 is the next iteration of this release model. Its primary objective is to get tested by the community and generate feedback. If no major issues are discovered, we are planning to release 3.0.0 stable in 4 weeks from now. If there are indeed major issues discovered with RC2, we will have to release RC3 in between – possibly earlier than 4 weeks from now to speed up the way to 3.0.0.

Only critical issue fixes will find their way into 3.0.0 from now on, and any such fix will mean RC3. In the meanwhile, all the non-critical commits will appear only in 3.0.1. The way it will work is that we have a separate branch for 3.0.0, and we are going to backport the critical issue fixes into that branch from the main, 3.0.1, branch.

Post-3.0.0, we are planning to proceed with the release cycle we have had before 3.0.0. That is, we bump the stable patch version every 6 weeks and make an RC for that version. Simultaneously we make the RC of the previous patch version into a stable version.

Concretely, this means in 6 weeks from now we'll have 3.0.1-RC1, and in 12 weeks, we'll promote 3.0.1-RC1 into 3.0.1 stable and release 3.0.2-RC1.

Changes for 3.0.0-RC2

As mentioned above, we are currently in an issue-fixing mode. So a lot of those 200+ PRs for this release were about issue fixing.

There are some notable changes worth mentioning.

Restrict experimental features to unstable releases only

PR #11920 restricts usage of experimental features only to nightlies and snapshots. This change ensures that changes deemed experimental will not propagate into the wider ecosystem provided that the wider ecosystem depends on stable releases. This is needed so that if an experimental feature is modified or removed from the language, the ecosystem will not be impacted.

New unsafeNulls language feature

PR #9884 adds a new language feature which enables unsafe null operations under explicit nulls. This is a tool to help projects migrating to full explicit nulls gradually. From now on, you can use an import import scala.language.unsafeNulls to create an unsafe scope. For discussion, see the PR linked above, and for more information on the feature, see the documentation.

Treat Scala.js pseudo-unions as real unions

In PR #11671, we now treat the scala.scalajs.js.|[A, B] as if it was a real Scala 3 union A | B, which further boosts the support for Scala.js in Scala 3.

Other API changes

-Ycheck-init was renamed to -Ysafe-init. This flag is used to check safe initialization, more about which you can read in the documentation. See also PR #11920.

PR #11745 changes the compiletime package API a bit. compiletime.S was moved to and the package object compiletime was removed in favor of top-level definitions.


The following are some notable metaprogramming changes included into this release:

  • Add quotes.Type.valueOfConstant #11715
  • Remove compiletime.Widen #11569
  • Add -Xcheck-macros scalac option #11655

Let us know what you think!

If you have questions or any sort of feedback, feel free to send us a message on our Gitter channel. If you encounter a bug, please open an issue on GitHub.


Thank you to all the contributors who made this release possible 🎉

According to git shortlog -sn --no-merges 3.0.0-RC1..3.0.0-RC2 these are:

   150  Martin Odersky
    83  Liu Fengyun
    44  Nicolas Stucki
    40  Guillaume Martres
    17  Tom Grigg
    14  Paweł Marks
    12  Andrzej Ratajczak
    11  Aleksander Boruch-Gruszecki
    11  Yichen Xu
    10  Phil
    10  Filip Zybała
    10  bjornregnell
    10  Michał Pałka
     9  Jamie Thompson
     9  Raphael Jolly
     8  Krzysztof Romanowski
     7  Lan, Jian
     6  Sébastien Doeraene
     6  Adrien Piquerez
     5  Olivier Blanvillain
     5  Alex Merritt
     4  Lukas Rytz
     4  Anatolii Kmetiuk
     3  Stéphane Micheloud
     3  Ruslan Shevchenko
     3  Jakob Odersky
     3  Eric K Richardson
     2  Som Snytt
     2  xhudik
     2  Ayush
     2  noti0na1
     1  Jonathan Brachthäuser
     1  Ivano Pagano
     1  Hanns Holger Rutz
     1  Mathias
     1  Guillaume Raffin
     1  Miles Sabin
     1  Fengyun Liu
     1  Ben Hutchison
     1  Roberto Bonvallet
     1  Alexandre Archambault
     1  Jakub Kozłowski

If you want to get your hands dirty and contribute to Dotty, now is a good time to get involved! Head to our Getting Started page for new contributors, and have a look at some of the good first issues. They make perfect entry points into hacking on the compiler.

We are looking forward to having you join the team of contributors.

Library authors: Join our community build

Dotty now has a set of widely-used community libraries that are built against every nightly Dotty snapshot. Currently, this includes shapeless, ScalaPB, algebra, scalatest, scopt and squants. Join our community build to make sure that our regression suite includes your library.

Anatolii Kmetiuk