Skip to content

Commit 72b3852

Browse files
committed
Fix scala#5776: Allow explicitly adding a parent that is added by desugaring
1 parent 020bddd commit 72b3852

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -1596,6 +1596,11 @@ class Typer extends Namer
15961596
var result = if (tree.isType) typedType(tree)(superCtx) else typedExpr(tree)(superCtx)
15971597
val psym = result.tpe.dealias.typeSymbol
15981598
if (seenParents.contains(psym) && !cls.isRefinementClass) {
1599+
// Desugaring can adds parents to classes, but we don't want to emit an
1600+
// error if the same parent was explicitly added in user code.
1601+
if (!tree.span.isSourceDerived)
1602+
return EmptyTree
1603+
15991604
if (!ctx.isAfterTyper) ctx.error(i"$psym is extended twice", tree.sourcePos)
16001605
}
16011606
else seenParents += psym
@@ -1630,7 +1635,7 @@ class Typer extends Namer
16301635

16311636
completeAnnotations(cdef, cls)
16321637
val constr1 = typed(constr).asInstanceOf[DefDef]
1633-
val parentsWithClass = ensureFirstTreeIsClass(parents mapconserve typedParent, cdef.nameSpan)
1638+
val parentsWithClass = ensureFirstTreeIsClass(parents.mapconserve(typedParent).filterConserve(!_.isEmpty), cdef.nameSpan)
16341639
val parents1 = ensureConstrCall(cls, parentsWithClass)(superCtx)
16351640

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

tests/neg/duplicate-parents.scala

+2
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

+14
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)