Skip to content

Commit 3f1b86f

Browse files
committed
Enter symbols under their target names after erasure
Enter symbols under their target names in their parent scope after erasure. Fixes #13252
1 parent 58d1b10 commit 3f1b86f

File tree

5 files changed

+37
-7
lines changed

5 files changed

+37
-7
lines changed

compiler/src/dotty/tools/dotc/core/Scopes.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,6 @@ object Scopes {
257257
e
258258
}
259259

260-
/** create and enter a scope entry */
261-
protected def newScopeEntry(sym: Symbol)(using Context): ScopeEntry =
262-
newScopeEntry(sym.name, sym)
263-
264260
private def enterInHash(e: ScopeEntry)(using Context): Unit = {
265261
val idx = e.name.hashCode & (hashTable.length - 1)
266262
e.tail = hashTable(idx)
@@ -273,7 +269,11 @@ object Scopes {
273269
if (sym.isType && ctx.phaseId <= typerPhase.id)
274270
assert(lookup(sym.name) == NoSymbol,
275271
s"duplicate ${sym.debugString}; previous was ${lookup(sym.name).debugString}") // !!! DEBUG
276-
newScopeEntry(sym)
272+
enter(sym.name, sym)
273+
}
274+
275+
final def enter[T <: Symbol](name: Name, sym: T)(using Context): T = {
276+
newScopeEntry(name, sym)
277277
sym
278278
}
279279

@@ -375,7 +375,7 @@ object Scopes {
375375
}
376376
if ((e eq null) && (synthesize != null)) {
377377
val sym = synthesize(name)
378-
if (sym.exists) newScopeEntry(sym) else e
378+
if (sym.exists) newScopeEntry(sym.name, sym) else e
379379
}
380380
else e
381381
}

compiler/src/dotty/tools/dotc/core/TypeErasure.scala

+8-1
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,14 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
654654
tr1 :: trs1.filterNot(_.isAnyRef)
655655
case nil => nil
656656
}
657-
val erasedDecls = decls.filteredScope(sym => !sym.isType || sym.isClass)
657+
var erasedDecls = decls.filteredScope(sym => !sym.isType || sym.isClass).openForMutations
658+
for dcl <- erasedDecls.iterator do
659+
if dcl.lastKnownDenotation.unforcedAnnotation(defn.TargetNameAnnot).isDefined
660+
&& dcl.targetName != dcl.name
661+
then
662+
if erasedDecls eq decls then erasedDecls = erasedDecls.cloneScope
663+
erasedDecls.unlink(dcl)
664+
erasedDecls.enter(dcl.targetName, dcl)
658665
val selfType1 = if cls.is(Module) then cls.sourceModule.termRef else NoType
659666
tp.derivedClassInfo(NoPrefix, erasedParents, erasedDecls, selfType1)
660667
// can't replace selftype by NoType because this would lose the sourceModule link

tests/run/i13252.scala

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
object Test:
2+
3+
class Star
4+
5+
trait Foo:
6+
@annotation.targetName("star")
7+
val * : Star = new Star
8+
9+
object Bar extends Foo
10+
11+
def main(sa: Array[String]): Unit =
12+
Bar.*

tests/run/i13252/Foo_1.scala

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Star
2+
3+
trait Foo:
4+
@annotation.targetName("star")
5+
val * : Star = new Star

tests/run/i13252/Test_2.scala

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
object Test:
2+
3+
object Bar extends Foo
4+
5+
def main(sa: Array[String]): Unit =
6+
Bar.*

0 commit comments

Comments
 (0)