Open adampauls opened 2 years ago
@odersky this comment suggests that this issue might not get fixed. Where can I read up on the workaround using intersection types? In our particular case, the alternative to the code we have is to have type parameter lists that are going to be hundreds of chars long (like T[A <: AbstractA, B <: AbstractB[A], C <: AbstractC[A, B], ...]
but where A
and B
are real class names) repeated in probably a dozen or so places. I'm not sure how to use intersection types to fix the problem. Moreover, note that the compiler crash occurred when trying to use this code from Scala 3, but compiled with 2.13 -- where intersection types are not available.
Perhaps I should focus on minimizing the compiler crash and treating that as the more urgent bug?
I am not very good at finding past comments on issues. I think @japgolly commented once on that. Or maybe others can help?
The link goes straight to a comment by you. It says:
For my own sanity I have decided to no longer fix F-bounds problems that cause cyclic references. We know they will cause more cyclic references than Scala 2. The recommended fix is to replace them with intersection types.
Yes, but I cannot find the original discussions. Some others should help out here.
Okay great, I will wait then. We are eager to upgrade our codebase to Scala 3!
Perhaps this comment is of interest, re: replacing F-bounds with intersection types.
@griggt That's the one! Thanks for digging it out. We should put it in a FAQ, it certainly comes up often enough.
Yep, also check this out to see it in action in a way that cross-compiles for Scala 2 and 3. Very cool trick.
Thanks, that's great! Just to make sure it doesn't get lost though: that is not a solution to using existing code compiled under 2.13 right? The compiler crash I mentioned still violates the promised binary compatibility, and even if you could can the code, the intersection type option is not available.
Oh, oops, commented too fast! Looks like this is a potential solution, thanks. I do hope you don't close this issue though, it is a shame to have to do this surprising transformation away from the intuitive way of doing it.
So am I reading the room right that neither the compiler error nor the compiler crash is going to get fixed any time soon? I want to repeat that the original bug came from a compiler crash trying to use code compiled in 2.13 from code compiled using 3. Even if Scala 3 has effectively declared that f-bounds will not be supported, maintaining binary compatibility with 2.13 I think is a must, and eliminating a known compiler crash also seems like a must. If I can minimize the crash, is there any chance this will get prioritized? Our team will just never upgrade to Scala 3 if we can't get this fixed I think. The change required to get rid of f-bounds in our existing code would be too large.
(Sorry if I seem impatient. There's a bit of a window right now to maybe upgrade to Scala 3, but my some on my team are skeptical. If this bug has been placed in a queue where it eventually will get fixed then I apologize for speaking up, I was just worried from @odersky 's comment that this fix might be low enough priority that it will never happen).
I added some notes on a workaround above that at least unblock our current usage.
The code below compiles on Scala 2.13.7. Although in this minimized example, the compiler doesn't crash, in the non-minimized use case in our real code, the compiler does crash with the stacktrace shown even lower. I'm not entirely sure if this code should compile in either version, but we have been using it since 2.12 with no trouble.
Note that the compiler crash occurs when code compiled with 3.1.0 depends on the non-minimized version of this code compiled with 2.13.7.
Update: you can workaround the problem where code compiled with Scala 2 is referenced from Scala 3 by overriding the methods in the Scala 2 code with the concrete type. That is, if you have a method
def foo: Foo
onAbstractBar
, if you override it withdef foo: ConcreteFoo
onConcreteBar
, thenfoo
can be called on an instance ofConcreteBar
from Scala 3 without an error.Compiler version
3.1.0
Minimized code
Output (click arrow to expand)