summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Infer.scala25
-rw-r--r--test/files/neg/bug987.check20
-rwxr-xr-xtest/files/run/existentials.scala11
3 files changed, 36 insertions, 20 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
index 0cb6aef48e..bad414fd78 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
@@ -248,20 +248,17 @@ trait Infer {
}
}
- val patches = {
- val syms1 = typeRefs.collect(tp1)
- val syms2 = typeRefs.collect(tp2)
- for {
- sym1 <- syms1
- sym2 <- syms2
- if sym1 != sym2 && sym1.toString == sym2.toString
- } yield {
- val name = sym1.name
- explainName(sym1)
- explainName(sym2)
- if (sym1.owner == sym2.owner) sym2.name = newTypeName("(some other)"+sym2.name)
- (sym1, sym2, name)
- }
+ val patches = new ListBuffer[(Symbol, Symbol, Name)]
+ for {
+ t1 @ TypeRef(_, sym1, _) <- tp1
+ t2 @ TypeRef(_, sym2, _) <- tp2
+ if sym1 != sym2 && t1.toString == t2.toString
+ } {
+ val name = sym1.name
+ explainName(sym1)
+ explainName(sym2)
+ if (sym1.owner == sym2.owner) sym2.name = newTypeName("(some other)"+sym2.name)
+ patches += (sym1, sym2, name)
}
val result = op
diff --git a/test/files/neg/bug987.check b/test/files/neg/bug987.check
index 77e71c9b5e..d850f39fd9 100644
--- a/test/files/neg/bug987.check
+++ b/test/files/neg/bug987.check
@@ -1,9 +1,19 @@
-bug987.scala:15: error: the type intersection B[D] with B[C] is malformed
- --- because ---
-no common type instance of base types B[C] and B[D] exists
+bug987.scala:15: error: illegal inheritance;
+ class E inherits different type instances of trait B:
+B[C] and B[D]
class E extends D
^
-bug987.scala:20: error: illegal cyclic reference involving class E
+bug987.scala:20: error: illegal inheritance;
+ class F inherits different type instances of trait B:
+B[C] and B[D]
class F extends D
^
-two errors found
+bug987.scala:25: error: illegal inheritance;
+ class D inherits different type instances of trait B:
+B[C] and B[D]
+abstract class D extends C with B[D] {}
+ ^
+bug987.scala:25: error: type arguments [D] do not conform to trait B's type parameter bounds [T <: B[T]]
+abstract class D extends C with B[D] {}
+ ^
+four errors found
diff --git a/test/files/run/existentials.scala b/test/files/run/existentials.scala
index 3d51751996..76dd705380 100755
--- a/test/files/run/existentials.scala
+++ b/test/files/run/existentials.scala
@@ -12,8 +12,17 @@ trait Counter[T] {
def newCounter: T
def get(i: T): Int
def inc(i: T): T
- }
+}
+
+case class C[T](x: T)
+object LUB {
+ def x = C(1)
+ def y = C("abc")
+ var coinflip: boolean = _
+ def z = if (coinflip) x else y
+ def zz: C[_1] for_some { type _1 >: Int with java.lang.String } = z
+}
object Test extends Application {
def foo(x : Counter[T] { def name : String } for_some { type T }) = x match {