Skip to content

Commit a0fe753

Browse files
authored
Backport "Don't generate a super accessor for an inline method call" to LTS (#18974)
Backports #17598 to the LTS branch. PR submitted by the release tooling. [skip ci]
2 parents 5d06f7d + e05078c commit a0fe753

File tree

4 files changed

+33
-2
lines changed

4 files changed

+33
-2
lines changed

compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,11 @@ class SuperAccessors(thisPhase: DenotTransformer) {
153153
}
154154
}
155155

156-
val needAccessor = name.isTermName && (
157-
clazz != currentClass || !validCurrentClass || mix.name.isEmpty && clazz.is(Trait))
156+
val needAccessor =
157+
name.isTermName // Types don't need super accessors
158+
&& !sym.isEffectivelyErased // Erased and concrete inline methods are not called at runtime
159+
&& !sym.isInlineMethod // so they don't need superaccessors.
160+
&& (clazz != currentClass || !validCurrentClass || mix.name.isEmpty && clazz.is(Trait))
158161

159162
if (needAccessor) atPhase(thisPhase.next)(superAccessorCall(sel, mix.name))
160163
else sel

tests/pos/i17584a.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
import language.experimental.erasedDefinitions
3+
trait A:
4+
erased def g = 1
5+
trait B extends A:
6+
erased def f = super.g
7+
class C extends B

tests/run/i17584.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
trait A:
2+
inline def g = 1
3+
trait B extends A:
4+
def f = super.g
5+
class C extends B
6+
7+
@main def Test =
8+
val c = C()
9+
assert(c.f == 1)
10+

tests/run/i17584a.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
trait T:
2+
def g = 2
3+
trait A extends T:
4+
inline override def g = 1
5+
trait B extends A:
6+
def f = super.g
7+
class C extends B
8+
9+
@main def Test =
10+
val c = C()
11+
assert(c.f == 1)

0 commit comments

Comments
 (0)