Skip to content

Commit 45a51d8

Browse files
committed
Fix #5776: Allow explicitly adding a parent that is added by desugaring
1 parent 03887b7 commit 45a51d8

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
@@ -1601,6 +1601,11 @@ class Typer extends Namer
16011601
var result = if (isTreeType(tree)) typedType(tree)(superCtx) else typedExpr(tree)(superCtx)
16021602
val psym = result.tpe.dealias.typeSymbol
16031603
if (seenParents.contains(psym) && !cls.isRefinementClass) {
1604+
// Desugaring can adds parents to classes, but we don't want to emit an
1605+
// error if the same parent was explicitly added in user code.
1606+
if (!tree.span.isSourceDerived)
1607+
return EmptyTree
1608+
16041609
if (!ctx.isAfterTyper) ctx.error(i"$psym is extended twice", tree.sourcePos)
16051610
}
16061611
else seenParents += psym
@@ -1635,7 +1640,7 @@ class Typer extends Namer
16351640

16361641
completeAnnotations(cdef, cls)
16371642
val constr1 = typed(constr).asInstanceOf[DefDef]
1638-
val parentsWithClass = ensureFirstTreeIsClass(parents mapconserve typedParent, cdef.nameSpan)
1643+
val parentsWithClass = ensureFirstTreeIsClass(parents.mapconserve(typedParent).filterConserve(!_.isEmpty), cdef.nameSpan)
16391644
val parents1 = ensureConstrCall(cls, parentsWithClass)(superCtx)
16401645

16411646
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)