Skip to content

Commit

Permalink
Fix scala#5776: Allow explicitly adding a parent that is added by des…
Browse files Browse the repository at this point in the history
…ugaring
  • Loading branch information
smarter committed Feb 6, 2019
1 parent b44adf7 commit 49156c4
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 1 deletion.
7 changes: 6 additions & 1 deletion compiler/src/dotty/tools/dotc/typer/Typer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1606,6 +1606,11 @@ class Typer extends Namer
var result = if (isTreeType(tree)) typedType(tree)(superCtx) else typedExpr(tree)(superCtx)
val psym = result.tpe.dealias.typeSymbol
if (seenParents.contains(psym) && !cls.isRefinementClass) {
// Desugaring can adds parents to classes, but we don't want to emit an
// error if the same parent was explicitly added in user code.
if (!tree.span.isSourceDerived)
return EmptyTree

if (!ctx.isAfterTyper) ctx.error(i"$psym is extended twice", tree.sourcePos)
}
else seenParents += psym
Expand Down Expand Up @@ -1640,7 +1645,7 @@ class Typer extends Namer

completeAnnotations(cdef, cls)
val constr1 = typed(constr).asInstanceOf[DefDef]
val parentsWithClass = ensureFirstTreeIsClass(parents mapconserve typedParent, cdef.nameSpan)
val parentsWithClass = ensureFirstTreeIsClass(parents.mapconserve(typedParent).filterConserve(!_.isEmpty), cdef.nameSpan)
val parents1 = ensureConstrCall(cls, parentsWithClass)(superCtx)

var self1 = typed(self)(ctx.outer).asInstanceOf[ValDef] // outer context where class members are not visible
Expand Down
2 changes: 2 additions & 0 deletions tests/neg/duplicate-parents.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
case class Foo1(x: Int) extends Serializable with Serializable // error
case class Foo2(x: Int) extends scala.Serializable with Serializable // error
14 changes: 14 additions & 0 deletions tests/pos/duplicate-parents.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
case class Foo1(x: Int) extends Serializable
case class Foo2(x: Int) extends scala.Serializable
case class Foo3(x: Int) extends Product

case object Foo4 extends Serializable

object Scope {
class Serializable
case class Foo5(x: Int) extends Serializable

val f = Foo5(1)
f: Scope.Serializable
f: scala.Serializable
}

0 comments on commit 49156c4

Please sign in to comment.