From 6c4064a77086ee82de861ec30dfd87fe120c6b0d Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 13 Nov 2009 17:31:12 +0000 Subject: Fixes #1477 by requiring that abstract types wi... Fixes #1477 by requiring that abstract types with non-volatile upper bounds cannot be overridden by volatile types. --- test/files/neg/t1477.check | 5 +++++ test/files/neg/t1477.scala | 25 +++++++++++++++++++++++++ test/files/neg/t2179.check | 9 +++++++++ test/files/neg/t2179.scala | 3 +++ test/files/neg/t771.check | 4 ++++ test/files/neg/t771.scala | 5 +++++ 6 files changed, 51 insertions(+) create mode 100644 test/files/neg/t1477.check create mode 100644 test/files/neg/t1477.scala create mode 100644 test/files/neg/t2179.check create mode 100755 test/files/neg/t2179.scala create mode 100644 test/files/neg/t771.check create mode 100755 test/files/neg/t771.scala (limited to 'test') diff --git a/test/files/neg/t1477.check b/test/files/neg/t1477.check new file mode 100644 index 0000000000..e497637857 --- /dev/null +++ b/test/files/neg/t1477.check @@ -0,0 +1,5 @@ +t1477.scala:13: error: overriding type V in trait C with bounds >: Nothing <: Middle.this.D; + type V is a volatile type; cannot override a type with non-volatile upper bound + type V <: (D with U) + ^ +one error found diff --git a/test/files/neg/t1477.scala b/test/files/neg/t1477.scala new file mode 100644 index 0000000000..0cc0cd5f7a --- /dev/null +++ b/test/files/neg/t1477.scala @@ -0,0 +1,25 @@ +object Test extends Application { + trait A + trait B extends A + + trait C { + type U + trait D { type T >: B <: A } + type V <: D + val y: V#T = new B { } + } + + trait Middle extends C { + type V <: (D with U) + } + + class D extends Middle { + trait E + trait F { type T = E } + type U = F + def frob(arg : E) : E = arg + frob(y) + } + + new D +} diff --git a/test/files/neg/t2179.check b/test/files/neg/t2179.check new file mode 100644 index 0000000000..e454e117b5 --- /dev/null +++ b/test/files/neg/t2179.check @@ -0,0 +1,9 @@ +t2179.scala:2: error: inferred type arguments [scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]{def sameElements[B >: Any](that: Iterable[B]): Boolean}]; def reverse: scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; protected def thisCollection: Seq[Double]{def companion: scala.collection.generic.GenericCompanion[Seq[Any]]}; def dropRight(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def takeRight(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def slice(start: Int,end: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def take(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def drop(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}}] do not conform to method reduceLeft's type parameter bounds [B >: List[Double]] + (Nil:List[List[Double]]).reduceLeft((_: Any, _: Any) => Nil.indices.map(_ => 0d)) + ^ +t2179.scala:2: error: type mismatch; + found : (Any, Any) => scala.collection.immutable.IndexedSeq[Double] + required: (scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]{def sameElements[B >: Any](that: Iterable[B]): Boolean}]; def reverse: scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; protected def thisCollection: Seq[Double]{def companion: scala.collection.generic.GenericCompanion[Seq[Any]]}; def dropRight(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def takeRight(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def slice(start: Int,end: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def take(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def drop(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}}, List[Double]) => scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]{def sameElements[B >: Any](that: Iterable[B]): Boolean}]; def reverse: scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; protected def thisCollection: Seq[Double]{def companion: scala.collection.generic.GenericCompanion[Seq[Any]]}; def dropRight(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def takeRight(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def slice(start: Int,end: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def take(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}; def drop(n: Int): scala.collection.immutable.Seq[Double]{def companion: scala.collection.generic.GenericCompanion[scala.collection.immutable.Seq[Any]]}} + (Nil:List[List[Double]]).reduceLeft((_: Any, _: Any) => Nil.indices.map(_ => 0d)) + ^ +two errors found diff --git a/test/files/neg/t2179.scala b/test/files/neg/t2179.scala new file mode 100755 index 0000000000..89e22b6e2a --- /dev/null +++ b/test/files/neg/t2179.scala @@ -0,0 +1,3 @@ +object Test { + (Nil:List[List[Double]]).reduceLeft((_: Any, _: Any) => Nil.indices.map(_ => 0d)) +} diff --git a/test/files/neg/t771.check b/test/files/neg/t771.check new file mode 100644 index 0000000000..c0d1e002f8 --- /dev/null +++ b/test/files/neg/t771.check @@ -0,0 +1,4 @@ +t771.scala:4: error: trait Iterator is abstract; cannot be instantiated + def c[A](it:java.util.Iterator[A]) = new scala.Iterator[A] + ^ +one error found diff --git a/test/files/neg/t771.scala b/test/files/neg/t771.scala new file mode 100755 index 0000000000..26bf441648 --- /dev/null +++ b/test/files/neg/t771.scala @@ -0,0 +1,5 @@ +class Foo { + def a = c(b) + def b[List[AnyRef]] = new java.util.Iterator[List[Object]] { } + def c[A](it:java.util.Iterator[A]) = new scala.Iterator[A] +} -- cgit v1.2.3