From 733eeede22ae02b814fb2d14c26c04fe49f683e4 Mon Sep 17 00:00:00 2001 From: odersky Date: Fri, 26 May 2023 10:34:21 +0200 Subject: [PATCH 1/2] Don't generate a super accessor for an inline method call Inline methods cannot be overridden, so they don't need super accessors. Fixes #17584 [Cherry-picked 467edd8f8dd8d8b10979b0ab2af04e1e9f1be87d] --- .../src/dotty/tools/dotc/transform/SuperAccessors.scala | 4 +++- tests/run/i17584.scala | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 tests/run/i17584.scala diff --git a/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala b/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala index b78c75d58340..b384cebb8959 100644 --- a/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala +++ b/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala @@ -153,7 +153,9 @@ class SuperAccessors(thisPhase: DenotTransformer) { } } - val needAccessor = name.isTermName && ( + val needAccessor = + name.isTermName // Types don't need super accessors + && !sym.isInlineMethod && ( // Inline methods can't be overridden, don't need superaccessors clazz != currentClass || !validCurrentClass || mix.name.isEmpty && clazz.is(Trait)) if (needAccessor) atPhase(thisPhase.next)(superAccessorCall(sel, mix.name)) diff --git a/tests/run/i17584.scala b/tests/run/i17584.scala new file mode 100644 index 000000000000..bb531446c6e6 --- /dev/null +++ b/tests/run/i17584.scala @@ -0,0 +1,9 @@ +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) From e05078cb50fb1a90f51b6b01533e1ca4e1fb76d8 Mon Sep 17 00:00:00 2001 From: odersky Date: Sun, 4 Jun 2023 20:22:28 +0200 Subject: [PATCH 2/2] Address review comments [Cherry-picked c93765ee9d9ea85844178d615acbe3b27fc2f1f0] --- .../dotty/tools/dotc/transform/SuperAccessors.scala | 5 +++-- tests/pos/i17584a.scala | 7 +++++++ tests/run/i17584.scala | 1 + tests/run/i17584a.scala | 11 +++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 tests/pos/i17584a.scala create mode 100644 tests/run/i17584a.scala diff --git a/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala b/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala index b384cebb8959..b15c50158b75 100644 --- a/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala +++ b/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala @@ -155,8 +155,9 @@ class SuperAccessors(thisPhase: DenotTransformer) { val needAccessor = name.isTermName // Types don't need super accessors - && !sym.isInlineMethod && ( // Inline methods can't be overridden, don't need superaccessors - clazz != currentClass || !validCurrentClass || mix.name.isEmpty && clazz.is(Trait)) + && !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 index bb531446c6e6..8444ea250e43 100644 --- a/tests/run/i17584.scala +++ b/tests/run/i17584.scala @@ -7,3 +7,4 @@ 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