From 4e75ac797f86ee0eb800e95a6b5fb90d3c39d4ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Doeraene?= Date: Thu, 13 Mar 2025 17:05:16 +0100 Subject: [PATCH] Fix #22794: Emit the definition of `Arrays.newArray` even though it's a primitive. Until 3.6.x, we used the user-space definition of `Arrays.newArray` in Scala.js. We changed it to a primitve in 2852168e8ddac8aa318635a73c79f64282aa39d1, to match the behavior of the JVM backend. However, that had the side effect of not emitting its definition at all, like other primitives. For backward binary compat reasons, we do need that definition. We specifically make an exception for that method, which is now emitted, even though it is otherwise treated as a primitive. --- compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala | 2 +- sbt-test/scalajs/backward-compat/build.sbt | 5 +++++ sbt-test/scalajs/backward-compat/project/plugins.sbt | 2 ++ .../src/test/scala/NewArrayIssue22794Test.scala | 5 +++++ sbt-test/scalajs/backward-compat/test | 1 + 5 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 sbt-test/scalajs/backward-compat/build.sbt create mode 100644 sbt-test/scalajs/backward-compat/project/plugins.sbt create mode 100644 sbt-test/scalajs/backward-compat/src/test/scala/NewArrayIssue22794Test.scala create mode 100644 sbt-test/scalajs/backward-compat/test diff --git a/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala b/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala index deaad2d51dbc..be0a25e210b1 100644 --- a/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala +++ b/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala @@ -1557,7 +1557,7 @@ class JSCodeGen()(using genCtx: Context) { def jsParams = params.map(genParamDef(_)) - if (primitives.isPrimitive(sym)) { + if (primitives.isPrimitive(sym) && sym != defn.newArrayMethod) { None } else if (sym.is(Deferred) && currentClassSym.isNonNativeJSClass) { // scala-js/#4409: Do not emit abstract methods in non-native JS classes diff --git a/sbt-test/scalajs/backward-compat/build.sbt b/sbt-test/scalajs/backward-compat/build.sbt new file mode 100644 index 000000000000..3f82b8529b16 --- /dev/null +++ b/sbt-test/scalajs/backward-compat/build.sbt @@ -0,0 +1,5 @@ +enablePlugins(ScalaJSPlugin) + +scalaVersion := sys.props("plugin.scalaVersion") + +libraryDependencies += "org.scalameta" %%% "munit" % "1.1.0" diff --git a/sbt-test/scalajs/backward-compat/project/plugins.sbt b/sbt-test/scalajs/backward-compat/project/plugins.sbt new file mode 100644 index 000000000000..b30c6e8c5ec8 --- /dev/null +++ b/sbt-test/scalajs/backward-compat/project/plugins.sbt @@ -0,0 +1,2 @@ + +addSbtPlugin("org.scala-js" % "sbt-scalajs" % sys.props("plugin.scalaJSVersion")) diff --git a/sbt-test/scalajs/backward-compat/src/test/scala/NewArrayIssue22794Test.scala b/sbt-test/scalajs/backward-compat/src/test/scala/NewArrayIssue22794Test.scala new file mode 100644 index 000000000000..0385b537bfe4 --- /dev/null +++ b/sbt-test/scalajs/backward-compat/src/test/scala/NewArrayIssue22794Test.scala @@ -0,0 +1,5 @@ +class NewArrayIssue22794Test extends munit.FunSuite { + test("foo") { + assert(2 + 2 == 4) + } +} diff --git a/sbt-test/scalajs/backward-compat/test b/sbt-test/scalajs/backward-compat/test new file mode 100644 index 000000000000..dfffb838b4b3 --- /dev/null +++ b/sbt-test/scalajs/backward-compat/test @@ -0,0 +1 @@ +> test