Skip to content

Commit 3f27da8

Browse files
committed
Look up members at erasure phase for generating static forwarders
Forward-ports scala/scala@b6d7e0c42c
1 parent fdbb94f commit 3f27da8

File tree

5 files changed

+99
-2
lines changed

5 files changed

+99
-2
lines changed

compiler/src/dotty/tools/backend/jvm/BCodeHelpers.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ trait BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
586586
val m = if (m0.is(Bridge)) m0.nextOverriddenSymbol else m0
587587
if (m == NoSymbol)
588588
report.log(s"$m0 is a bridge method that overrides nothing, something went wrong in a previous phase.")
589-
else if (m.isType || m.is(Deferred) || (m.owner eq defn.ObjectClass) || m.isConstructor || m.name.is(ExpandedName))
589+
else if (m.isType || (m.owner eq defn.ObjectClass) || m.isConstructor || m.name.is(ExpandedName))
590590
report.debuglog(s"No forwarder for '$m' from $jclassName to '$moduleClass'")
591591
else if (conflictingNames(m.name))
592592
report.log(s"No forwarder for $m due to conflict with ${linkedClass.info.member(m.name)}")
@@ -607,7 +607,8 @@ trait BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
607607
val names = tp.memberNames(takeAllFilter).toSeq.sorted
608608
val buffer = mutable.ListBuffer[Symbol]()
609609
names.foreach { name =>
610-
buffer ++= tp.memberBasedOnFlags(name, required, excluded)
610+
// lookup members at erasure: lampepfl/dotty#12753
611+
buffer ++= atPhase(erasurePhase)(tp.memberBasedOnFlags(name, required, excluded))
611612
.alternatives.sortBy(_.signature)(Signature.lexicographicOrdering).map(_.symbol)
612613
}
613614
buffer.toList

compiler/test/dotc/run-test-pickling.blacklist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@ typeclass-derivation3.scala
3434
varargs-abstract
3535
zero-arity-case-class.scala
3636
i12194.scala
37+
i12753

tests/run/i12753.check

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
1
2+
Dbr
3+
1
4+
1
5+
2
6+
1
7+
1
8+
1
9+
1
10+
2
11+
1
12+
1
13+
public static java.lang.String D.bar()
14+
public static D D.foo(int)
15+
public static D D.t()
16+
public static int O.a()
17+
public static int O.b()
18+
public static void O.b_$eq(int)
19+
public static int O.c()
20+
public static int O.d()
21+
public static int O.i()
22+
public static int O.j()
23+
public static void O.j_$eq(int)
24+
public static int O.k()
25+
public static int O.l()

tests/run/i12753/C.scala

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
trait C[This <: C[This]]
2+
3+
trait COps[This <: C[This]] {
4+
def t: This
5+
def foo(x: Int): This = t
6+
def bar: Object = "Cbr"
7+
}
8+
9+
class D extends C[D] {
10+
def x = 1
11+
}
12+
object D extends COps[D] {
13+
def t = new D
14+
override def foo(x: Int): D = super.foo(x)
15+
override def bar: String = "Dbr"
16+
}
17+
18+
trait T {
19+
val a = 1
20+
var b = 1
21+
lazy val c = 1
22+
def d = 1
23+
24+
val i: Int
25+
var j: Int
26+
lazy val k: Int = 1
27+
def l: Int
28+
}
29+
object O extends T {
30+
val i: Int = 1
31+
var j: Int = 1
32+
override lazy val k: Int = 1
33+
def l: Int = 1
34+
}

tests/run/i12753/Test.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
public class Test {
2+
public static void s(Object s) {
3+
System.out.println(s);
4+
}
5+
6+
public static void statics(Class<?> c) {
7+
java.lang.reflect.Method[] ms = c.getDeclaredMethods();
8+
java.util.Arrays.sort(ms, (a, b) -> a.getName().compareTo(b.getName()));
9+
for (java.lang.reflect.Method a : ms) {
10+
if (java.lang.reflect.Modifier.isStatic(a.getModifiers()))
11+
s(a);
12+
}
13+
}
14+
15+
public static void main(String[] args) {
16+
s(D.foo(1).x());
17+
s(D.bar());
18+
19+
s(O.a());
20+
s(O.b());
21+
O.b_$eq(2);
22+
s(O.b());
23+
s(O.c());
24+
s(O.d());
25+
26+
s(O.i());
27+
s(O.j());
28+
O.j_$eq(2);
29+
s(O.j());
30+
s(O.k());
31+
s(O.l());
32+
33+
statics(D.class);
34+
statics(O.class);
35+
}
36+
}

0 commit comments

Comments
 (0)