Skip to content

Commit b26b725

Browse files
committed
Handle MergeErrors in RefChecks
Used to throw an uncaught merge error in checkAllOverrides when compiling i1240c.scala.
1 parent 3a97b3f commit b26b725

File tree

3 files changed

+31
-15
lines changed

3 files changed

+31
-15
lines changed

src/dotty/tools/dotc/typer/RefChecks.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -837,14 +837,18 @@ class RefChecks extends MiniPhase { thisTransformer =>
837837
if (tree.symbol is Macro) EmptyTree else tree
838838
}
839839

840-
override def transformTemplate(tree: Template)(implicit ctx: Context, info: TransformerInfo) = {
840+
override def transformTemplate(tree: Template)(implicit ctx: Context, info: TransformerInfo) = try {
841841
val cls = ctx.owner
842842
checkOverloadedRestrictions(cls)
843843
checkParents(cls)
844844
checkCompanionNameClashes(cls)
845845
checkAllOverrides(cls)
846846
checkDerivedValueClass(cls, tree.body)
847847
tree
848+
} catch {
849+
case ex: MergeError =>
850+
ctx.error(ex.getMessage, tree.pos)
851+
tree
848852
}
849853

850854
override def transformTypeTree(tree: TypeTree)(implicit ctx: Context, info: TransformerInfo) = {

tests/neg/i1240b.scala

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
1-
// yet another variant, testing super accessors
2-
3-
trait T {
4-
def foo[B](x: C[B]): C[B]
1+
// yet another variant, testing type parameters
2+
trait T[X] {
3+
def foo(x: X): X
54
}
6-
abstract class A extends T {
7-
type C[X]
8-
def foo[B](x: C[B]): C[B] = {println("A.C"); x}
9-
def foo[B](x: List[B]): List[B] = {println("A.List"); x}
5+
abstract class A[X] extends T[X] {
6+
def foo(x: X): X = {println("A.X"); x}
7+
def foo(x: String): String = {println("A.String"); x}
108
}
11-
trait U extends T {
12-
def foo[B](x: C[B]): C[B] = super.foo[B](x)
13-
}
14-
object Test extends A with U {
15-
type C[X] = List[X]
16-
def main(args: Array[String]) = foo(List(""))
9+
trait U[X] extends T[X] {
10+
abstract override def foo(x: X): X = super.foo(x)
1711
}
12+
object Test extends A[String] with U[String] // error: accidental override

tests/neg/i1240c.scala

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// yet another variant, testing super accessors
2+
// (but exhibited a crash in RefChecks).
3+
4+
trait T {
5+
def foo[B](x: C[B]): C[B]
6+
}
7+
abstract class A extends T {
8+
type C[X]
9+
def foo[B](x: C[B]): C[B] = {println("A.C"); x}
10+
def foo[B](x: List[B]): List[B] = {println("A.List"); x}
11+
}
12+
trait U extends T {
13+
abstract override def foo[B](x: C[B]): C[B] = super.foo[B](x)
14+
}
15+
object Test extends A with U {
16+
type C[X] = List[X]
17+
}

0 commit comments

Comments
 (0)