Skip to content

-Wsafe-init doesn't detect initialization order problems #22152

Open
@kubukoz

Description

@kubukoz

Compiler version

3.6.1, 3.6.4-RC1-bin-20241204-a67dbb0-NIGHTLY

Minimized code

case class Record(region: String, env: String)

object foo {

  val record = Record(region, env)

  val region = "oops"
  val env = "hello"

}

object Demo extends App { println(foo.record) }

compiled with -Wsafe-init

Output

Record(null,null)

Expectation

something similar to 2.13's behavior under -Xcheckinit:

scala-cli run . --scala 2.13 -Xcheckinit                                                                                                                                                   
Compiling project (Scala 2.13.15, JVM (21))
[warn] ./demo.scala:5:23
[warn] Reference to uninitialized value region
[warn]   val record = Record(region, env)
[warn]                       ^^^^^^
[warn] ./demo.scala:5:31
[warn] Reference to uninitialized value env
[warn]   val record = Record(region, env)
[warn]                               ^^^
Compiled project (Scala 2.13.15, JVM (21))
Exception in thread "main" java.lang.ExceptionInInitializerError
        at Demo$.delayedEndpoint$Demo$1(demo.scala:12)
        at Demo$delayedInit$body.apply(demo.scala:12)
        at scala.Function0.apply$mcV$sp(Function0.scala:42)
        at scala.Function0.apply$mcV$sp$(Function0.scala:42)
        at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
        at scala.App.$anonfun$main$1(App.scala:98)
        at scala.App.$anonfun$main$1$adapted(App.scala:98)
        at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:619)
        at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:617)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:935)
        at scala.App.main(App.scala:98)
        at scala.App.main$(App.scala:96)
        at Demo$.main(demo.scala:12)
        at Demo.main(demo.scala)
Caused by: scala.UninitializedFieldError: Uninitialized field: demo.scala: 7
        at foo$.region(demo.scala:7)
        at foo$.<clinit>(demo.scala:5)
        ... 14 more

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions