diff --git a/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala b/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala index b78c75d58340..b15c50158b75 100644 --- a/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala +++ b/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala @@ -153,8 +153,11 @@ class SuperAccessors(thisPhase: DenotTransformer) { } } - val needAccessor = name.isTermName && ( - clazz != currentClass || !validCurrentClass || mix.name.isEmpty && clazz.is(Trait)) + val needAccessor = + name.isTermName // Types don't need super accessors + && !sym.isEffectivelyErased // Erased and concrete inline methods are not called at runtime + && !sym.isInlineMethod // so they don't need superaccessors. + && (clazz != currentClass || !validCurrentClass || mix.name.isEmpty && clazz.is(Trait)) if (needAccessor) atPhase(thisPhase.next)(superAccessorCall(sel, mix.name)) else sel diff --git a/tests/pos/i17584a.scala b/tests/pos/i17584a.scala new file mode 100644 index 000000000000..6bed4d935831 --- /dev/null +++ b/tests/pos/i17584a.scala @@ -0,0 +1,7 @@ + +import language.experimental.erasedDefinitions +trait A: + erased def g = 1 +trait B extends A: + erased def f = super.g +class C extends B \ No newline at end of file diff --git a/tests/run/i17584.scala b/tests/run/i17584.scala new file mode 100644 index 000000000000..8444ea250e43 --- /dev/null +++ b/tests/run/i17584.scala @@ -0,0 +1,10 @@ +trait A: + inline def g = 1 +trait B extends A: + def f = super.g +class C extends B + +@main def Test = + val c = C() + assert(c.f == 1) + diff --git a/tests/run/i17584a.scala b/tests/run/i17584a.scala new file mode 100644 index 000000000000..9f0c901159c8 --- /dev/null +++ b/tests/run/i17584a.scala @@ -0,0 +1,11 @@ +trait T: + def g = 2 +trait A extends T: + inline override def g = 1 +trait B extends A: + def f = super.g +class C extends B + +@main def Test = + val c = C() + assert(c.f == 1) \ No newline at end of file