Skip to content

Commit 4687bab

Browse files
committed
Fix #4659: disallow reference to object itself in super calls
1 parent 5cb4a1a commit 4687bab

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,19 @@ trait Checking {
783783
else if (called.is(Trait) && !caller.mixins.contains(called))
784784
ctx.error(i"""$called is already implemented by super${caller.superClass},
785785
|its constructor cannot be called again""", call.sourcePos)
786+
787+
if (caller.is(Module)) {
788+
val objRef = caller.sourceModule.termRef
789+
val traverser = new TreeTraverser {
790+
def traverse(tree: Tree)(implicit ctx: Context) = tree match {
791+
case tree: RefTree if tree.isTerm && tree.tpe <:< objRef =>
792+
ctx.error("super constructor cannot be passed a self reference", tree.sourcePos)
793+
case _ =>
794+
traverseChildren(tree)
795+
}
796+
}
797+
traverser.traverse(call)
798+
}
786799
}
787800

788801
/** Check that `tpt` does not define a higher-kinded type */

tests/neg/i4659.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class A(val a: A)(val b:a.T) {
2+
type T
3+
}
4+
5+
object a0 extends A(a0)(0) { // error
6+
type T = Int
7+
}
8+
9+
object Test extends App {
10+
new A(a0)(1)
11+
}

0 commit comments

Comments
 (0)