-
Couldn't load subscription status.
- Fork 21
Description
There's a regression from 2.12.7 to 2.12.8, but also some older inconsistency.
Source file:
trait A[T] {
type U
def foo(t: T): List[String] = Nil
def bar(u: U): List[String] = Nil
}
object O extends A[String] { type U = String }2.12.7
When compiled with 2.12.7, we get signatures for the default methods in A.class:
// signature (TT;)Lscala/collection/immutable/List<Ljava/lang/String;>;
public default foo(Ljava/lang/Object;)Lscala/collection/immutable/List;
// access flags 0x1
// signature (Ljava/lang/Object;)Lscala/collection/immutable/List<Ljava/lang/String;>;
public default bar(Ljava/lang/Object;)Lscala/collection/immutable/List;
The signature of foo refers to A's type parameter T. in the signature of bar, the type member U is erased to Object.
Looking at the mixin methods in the module class O$, we see that O$.bar has a signature (the same as A.bar), but O$.foo doesn't have any. Not sure if that's by design, or if that's a bug. Simply using the same signature as A.foo would be wrong, as the O$ class doesn't have a type parameter T.
Looking at the static forwarders in O, O.bar has a signature, O.foo doesn't.
Abstract Class
If we change A to be an abstract class, the signatures for A.foo and A.bar are the same as before. O$ no longer has mixins. The static forwarders in O are both without signature. I assume that's a bug? O.bar could have the same signature as A.bar.
2.12.8
When compiling the original source (trait A) with 2.12.8, there's a difference: the static forwarder O.bar is now also without signature. This is the regression compared to 2.12.7.
Other than that, 2.12.8 produces the same methods/signatures as 2.12.7 (also if A is an abstract class).