Skip to content

Commit 40f7b3d

Browse files
committed
Handle retained inline bodies for methods with @TargetNAME annotations
1 parent 4c29e97 commit 40f7b3d

File tree

5 files changed

+20
-2
lines changed

5 files changed

+20
-2
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -936,9 +936,17 @@ object Erasure {
936936
case stat: DefDef @unchecked if stat.symbol.name.is(BodyRetainerName) =>
937937
val retainer = stat.symbol
938938
val origName = retainer.name.asTermName.exclude(BodyRetainerName)
939+
val targetName =
940+
if retainer.hasAnnotation(defn.TargetNameAnnot) then
941+
try retainer.erasedName
942+
finally
943+
// reset target name so that definition will have a BodyRetainerName
944+
// after erasure and be thereby eliminated in typedDefDef
945+
retainer.setTargetName(retainer.name)
946+
else origName
939947
val inlineMeth = atPhase(typerPhase) {
940948
retainer.owner.info.decl(origName)
941-
.matchingDenotation(retainer.owner.thisType, stat.symbol.info)
949+
.matchingDenotation(retainer.owner.thisType, stat.symbol.info, targetName)
942950
.symbol
943951
}
944952
(inlineMeth, stat)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class SuperAccessors(thisPhase: DenotTransformer) {
8787
val acc = newSymbol(
8888
clazz, superName, Artifact | Method | maybeDeferred,
8989
superInfo, coord = accRange).enteredAfter(thisPhase)
90-
if !Denotations.targetNamesMatch(sym.name, sym.erasedName) then
90+
if sym.hasAnnotation(defn.TargetNameAnnot) then
9191
acc.addAnnotation(
9292
Annotation(defn.TargetNameAnnot,
9393
Literal(Constant(superAccessorName(sym.erasedName).toString)).withSpan(sym.span)))

compiler/src/dotty/tools/dotc/typer/Inliner.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ object Inliner {
198198
name = BodyRetainerName(meth.name),
199199
flags = meth.flags &~ (Inline | Macro | Override) | Private,
200200
coord = mdef.rhs.span.startPos).asTerm
201+
for targetAnnot <- meth.getAnnotation(defn.TargetNameAnnot) do
202+
retainer.addAnnotation(targetAnnot)
201203
polyDefDef(retainer, targs => prefss =>
202204
inlineCall(
203205
ref(meth).appliedToTypes(targs).appliedToArgss(prefss)

tests/run/inline-override.check

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ inline 22
33
inline 22
44
inline 22
55
inline 22
6+
inline 22
7+
inline 22

tests/run/inline-override.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
1+
import annotation.targetName
2+
13
abstract class A:
24
def f(x: Int) = s"dynamic $x"
35
def h(x: Int): String
6+
@targetName("h2") def h1(x: Int): String
47
inline def i(x: Int): String
58

69
class B extends A:
710
inline override def f(x: Int) = g(x)
811
inline def g(x: Int) = s"inline $x"
912
inline def h(x: Int) = g(x)
13+
@targetName("h2") inline def h1(x: Int) = g(x)
1014
inline def i(x: Int) = g(x)
1115

1216
@main def Test =
1317
val b = B()
1418
println(b.f(22))
1519
println(b.h(22))
20+
println(b.h1(22))
1621
println(b.i(22))
1722
val a: A = b
1823
println(a.f(22))
1924
println(a.h(22))
25+
println(a.h1(22))
2026
// println(a.i(22))
2127

2228

0 commit comments

Comments
 (0)