- Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
Compiler version
3.7.2 and 3.8.0-RC1-bin-20250814-0cf7a18-NIGHTLY
Minimized code
To minimize we have to run the following code without zio on the classpath. We may do that by executing the following, assuming you have Coursier installed as cs on your system:
mkdir target cs launch scala-cli:1.9.0 -- example.scala -d target/ java -cp target:`cs fetch org.scala-lang:scala-library:2.13.6` zio.mainWhere example.scala:
//> using scala 3.7.2 //> using dep dev.zio::zio::2.1.21 package zio object main extends App { println(outer.helloWorld) } object outer { def helloWorld = "Hello world!" object outer1 { object inner { def crashCausingLambdaFn: Boolean => ZIO[Any, Nothing, Boolean] = (f: Boolean) => new ZIO.Sync(zio.Trace.empty, () => f) // if this line is commented out, the code works. def manualCastMakesItWorkSomehow: Boolean => ZIO[Any, Nothing, Boolean] = (f: Boolean) => new ZIO.Sync(zio.Trace.empty, () => f).asInstanceOf[ZIO[Any, Nothing, Boolean]] def applyMethodWorks: Boolean => ZIO[Any, Nothing, Boolean] = (a: Boolean) => { val x = ZIO.Sync.apply[Boolean]; x(zio.Trace.empty, () => a) } } } }EDIT: I minimized the example further and removed the inlines that weren't the real cause of this behavior following @som-snytt's comment below.
Output
Exception in thread "main" java.lang.NoClassDefFoundError: zio/ZIO at zio.main$.<clinit>(example.scala:9) at zio.main.main(example.scala) Caused by: java.lang.ClassNotFoundException: zio.ZIO at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:528) ... 2 more Expectation
Expected to print Hello World.
- If the line with
crashCausingLambdaFnis commented out, the code works. - If we apply a manual cast to
ZIO- the code works, the constructor call by itself does not cause the crash, only when combined with implicit widening. - If we forcefully call ZIO.Sync.apply instead of new, the code works.
Weirdly enough, the code also works if the return type signature is omitted in the inline definition (That was caused by a narrower type being inferred.succeedNewNoTypeSigin example)
Note: the reason to run code with some of the dependencies missing is to be able to ship libraries with batteries-included support for various frameworks - e.g. with typeclass instances and conversions for cats & ZIO, without the downstream user necessarily having to use them, by compiling with said libraries as % Optional dependencies.