summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala6
-rw-r--r--test/files/neg/t2779.check4
-rwxr-xr-xtest/files/neg/t2779.scala25
3 files changed, 33 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index e541c58c1a..542b2d04c2 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -2111,10 +2111,12 @@ trait Typers { self: Analyzer =>
(e.sym.isType || inBlock || (e.sym.tpe matches e1.sym.tpe)))
// default getters are defined twice when multiple overloads have defaults. an
// error for this is issued in RefChecks.checkDefaultsInOverloaded
- if (!e.sym.isErroneous && !e1.sym.isErroneous && !e.sym.hasFlag(DEFAULTPARAM))
+ if (!e.sym.isErroneous && !e1.sym.isErroneous && !e.sym.hasFlag(DEFAULTPARAM)) {
error(e.sym.pos, e1.sym+" is defined twice"+
{if(!settings.debug.value) "" else " in "+unit.toString})
- e1 = scope.lookupNextEntry(e1);
+ scope.unlink(e1) // need to unlink to avoid later problems with lub; see #2779
+ }
+ e1 = scope.lookupNextEntry(e1)
}
}
diff --git a/test/files/neg/t2779.check b/test/files/neg/t2779.check
new file mode 100644
index 0000000000..4f94a780a1
--- /dev/null
+++ b/test/files/neg/t2779.check
@@ -0,0 +1,4 @@
+t2779.scala:16: error: method f is defined twice
+ override def f = List(M1)
+ ^
+one error found
diff --git a/test/files/neg/t2779.scala b/test/files/neg/t2779.scala
new file mode 100755
index 0000000000..d025055aa0
--- /dev/null
+++ b/test/files/neg/t2779.scala
@@ -0,0 +1,25 @@
+abstract class M
+{
+ def f: List[M] = Nil
+}
+
+object M1 extends M
+
+object M2 extends M
+{
+ override def f = List(M1)
+}
+
+object M3 extends M
+{
+ override def f = List(M1)
+ override def f = List(M1)
+}
+
+object M4 extends M
+{
+ override def f = List(
+ M3,
+ M2
+ )
+}