Skip to content

Commit 49156c4

Browse files
committed
Fix #5776: Allow explicitly adding a parent that is added by desugaring
1 parent b44adf7 commit 49156c4

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1606,6 +1606,11 @@ class Typer extends Namer
16061606
var result = if (isTreeType(tree)) typedType(tree)(superCtx) else typedExpr(tree)(superCtx)
16071607
val psym = result.tpe.dealias.typeSymbol
16081608
if (seenParents.contains(psym) && !cls.isRefinementClass) {
1609+
// Desugaring can adds parents to classes, but we don't want to emit an
1610+
// error if the same parent was explicitly added in user code.
1611+
if (!tree.span.isSourceDerived)
1612+
return EmptyTree
1613+
16091614
if (!ctx.isAfterTyper) ctx.error(i"$psym is extended twice", tree.sourcePos)
16101615
}
16111616
else seenParents += psym
@@ -1640,7 +1645,7 @@ class Typer extends Namer
16401645

16411646
completeAnnotations(cdef, cls)
16421647
val constr1 = typed(constr).asInstanceOf[DefDef]
1643-
val parentsWithClass = ensureFirstTreeIsClass(parents mapconserve typedParent, cdef.nameSpan)
1648+
val parentsWithClass = ensureFirstTreeIsClass(parents.mapconserve(typedParent).filterConserve(!_.isEmpty), cdef.nameSpan)
16441649
val parents1 = ensureConstrCall(cls, parentsWithClass)(superCtx)
16451650

16461651
var self1 = typed(self)(ctx.outer).asInstanceOf[ValDef] // outer context where class members are not visible

tests/neg/duplicate-parents.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
case class Foo1(x: Int) extends Serializable with Serializable // error
2+
case class Foo2(x: Int) extends scala.Serializable with Serializable // error

tests/pos/duplicate-parents.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
case class Foo1(x: Int) extends Serializable
2+
case class Foo2(x: Int) extends scala.Serializable
3+
case class Foo3(x: Int) extends Product
4+
5+
case object Foo4 extends Serializable
6+
7+
object Scope {
8+
class Serializable
9+
case class Foo5(x: Int) extends Serializable
10+
11+
val f = Foo5(1)
12+
f: Scope.Serializable
13+
f: scala.Serializable
14+
}

0 commit comments

Comments
 (0)