summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala9
-rw-r--r--test/files/neg/bug473.check4
-rw-r--r--test/files/neg/bug473.scala3
3 files changed, 16 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 7da10d7cc0..5e876cc8e7 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -1311,6 +1311,15 @@ trait Typers { self: Analyzer =>
}
val (superConstr, superArgs) = decompose(rhs)
assert(superConstr.symbol ne null)//debug
+
+ // an object cannot be allowed to pass a reference to itself to a superconstructor
+ // because of initialization issues; bug #473
+ for {
+ arg <- superArgs
+ val sym = arg.symbol
+ if sym != null && sym.isModule && (sym.info.baseClasses contains clazz)
+ } error(rhs.pos, "super constructor cannot be passed a self reference unless parameter is declared by-name")
+
if (superConstr.symbol.isPrimaryConstructor) {
val superClazz = superConstr.symbol.owner
if (!superClazz.hasFlag(JAVA)) {
diff --git a/test/files/neg/bug473.check b/test/files/neg/bug473.check
new file mode 100644
index 0000000000..c7d54fc4b3
--- /dev/null
+++ b/test/files/neg/bug473.check
@@ -0,0 +1,4 @@
+bug473.scala:3: error: super constructor cannot be passed a self reference unless parameter is declared by-name
+case object Voop extends Foo(Voop)
+ ^
+one error found
diff --git a/test/files/neg/bug473.scala b/test/files/neg/bug473.scala
new file mode 100644
index 0000000000..831f647f71
--- /dev/null
+++ b/test/files/neg/bug473.scala
@@ -0,0 +1,3 @@
+case class Foo(x: Foo)
+case object Bar extends Foo(null)
+case object Voop extends Foo(Voop) \ No newline at end of file