Skip to content

Commit

Permalink
Clarified the status of SI-13.
Browse files Browse the repository at this point in the history
Through the oracle of pos/t1279a.scala.
  • Loading branch information
paulp committed May 4, 2012
1 parent 780bed7 commit bbdd570
Showing 1 changed file with 30 additions and 31 deletions.
61 changes: 30 additions & 31 deletions test/files/pos/t1279a.scala
@@ -1,40 +1,39 @@
// see #13
// providing the type parameter in the recursive call to all4Impl
// avoids the problem


// covariant linked list
abstract class M
{ self =>

type T
final type selfType = M {type T <: self.T}
type actualSelfType >: self.type <: selfType

def next: selfType
abstract class M {
self =>

type T
final type selfType = M {type T <: self.T}
type actualSelfType >: self.type <: selfType

// I don't understand why this doesn't compile, but that's a separate matter
// error: method all2 cannot be accessed in M.this.selfType
// because its instance type => Stream[M{type T <: M.this.selfType#T}]
// contains a malformed type: M.this.selfType#T
// def all2: Stream[M {type T <: self.T}] = Stream.cons(self: actualSelfType, next.all2)
def next: selfType

// I don't understand why this doesn't compile, but that's a separate matter
// error: method all2 cannot be accessed in M.this.selfType
// because its instance type => Stream[M{type T <: M.this.selfType#T}]
// contains a malformed type: M.this.selfType#T
def all2: Stream[M {type T <: self.T}] = Stream.cons(self: actualSelfType, next.all2)

// compiles successfully
// def all3: Stream[M {type T <: self.T}] = all3Impl(self: actualSelfType)
// private def all3Impl(first: M {type T <: self.T}): Stream[M {type T <: self.T}] = Stream.cons(first, all3Impl(first.next))
// compiles successfully
def all3: Stream[M {type T <: self.T}] = all3Impl(self: actualSelfType)
private def all3Impl(first: M {type T <: self.T}): Stream[M {type T <: self.T}] = Stream.cons(first, all3Impl(first.next))



def all4: Stream[M {type T <: self.T}] = Unrelated.all4Impl[T](self: actualSelfType)
def all4: Stream[M {type T <: self.T}] = Unrelated.all4Impl[T](self: actualSelfType)
}

object Unrelated
{
// TODO!!! fix this bug for real, it compiles successfully, but weird types are inferred
// def all4Impl[U](first: M {type T <: U}): Stream[M {type T <: U}] = Stream.cons(first, all4Impl(first.next))

// compiles successfully
def all4Impl[U](first: M {type T <: U}): Stream[M {type T <: U}] = Stream.cons(first, all4Impl[U](first.next))
// TODO!!! fix this bug for real, it compiles successfully, but weird types are inferred
object Unrelated {
// compiles successfully
def all4Impl[U](first: M {type T <: U}): Stream[M {type T <: U}] = Stream.cons(first, all4Impl[U](first.next))

// should compile successfully without the [U], but:
// def all4ImplFail[U](first: M {type T <: U}): Stream[M {type T <: U}] = Stream.cons(first, all4ImplFail(first.next))
//
// test/files/pos/t1279a.scala:31: error: type mismatch;
// found : first.selfType
// (which expands to) M{type T <: first.T}
// required: M{type T <: Nothing}
// def all4ImplFail[U](first: M {type T <: U}): Stream[M {type T <: U}] = Stream.cons(first, all4ImplFail(first.next))
// ^
// one error found
}

0 comments on commit bbdd570

Please sign in to comment.