Skip to content

Chained .collects break with F-bounded polymorfism #16385

Open
@JD557

Description

@JD557

Compiler version

3.2.1

Minimized code

trait MyTrait[E <: MyTrait[E]]

case class MyClass() extends MyTrait[MyClass]

List(MyClass()).collect {
	case e: MyTrait[_] => e
}.collect {
  case e: MyTrait[_] => e
}

Output

assertion failed: 
no owner from  <none>/ <none> in List.apply[test.MyClass](
  scala.runtime.ScalaRunTime.wrapRefArray[test.MyClass](
    [test.MyClass.apply() : test.MyClass]
  )
).collect[(test.MyClass & test.MyTrait[? <: test.MyTrait[test.MyTrait[?]#E]])](
  {
    final class $anon() extends scala.runtime.AbstractPartialFunction[
      test.MyClass
    , test.MyClass & test.MyTrait[? <: test.MyTrait[test.MyTrait[?]#E]]](),
      java.io.Serializable
     {
      override final def isDefinedAt(x: test.MyClass): Boolean =
        matchResult4[Boolean]: 
          {
            case val x5: (x : test.MyClass) @unchecked @unchecked =
              x:(x : test.MyClass) @unchecked:
                (x : test.MyClass) @unchecked @unchecked
            if x5.$isInstanceOf[test.MyTrait[_] @_$1] then
              {
                case val e: test.MyClass & test.MyTrait[_] =
                  x5.$asInstanceOf[test.MyTrait[_] @_$1].$asInstanceOf[
                    test.MyClass & test.MyTrait[_]
                  ]
                return[matchResult4] true
              }
             else ()
            return[matchResult4] false
          }
      override final def applyOrElse[A1 <: test.MyClass,
        B1 >: test.MyClass & test.MyTrait[? <: test.MyTrait[test.MyTrait[?]#E]]
      ](x: A1, default: A1 => B1): B1 =
        matchResult5[Object]: 
          {
            case val x7: (x : test.MyClass) @unchecked @unchecked =
              x:(x : test.MyClass) @unchecked:
                (x : test.MyClass) @unchecked @unchecked
            if x7.$isInstanceOf[test.MyTrait[_] @_$1] then
              {
                case val e: test.MyClass & test.MyTrait[_] =
                  x7.$asInstanceOf[test.MyTrait[_] @_$1].$asInstanceOf[
                    test.MyClass & test.MyTrait[_]
                  ]
                return[matchResult5]
                  {
                    e:
                      test.MyClass & 
                        test.MyTrait[? <: test.MyTrait[test.MyTrait[?]#E]]

                  }
              }
             else ()
            return[matchResult5] default.apply(x)
          }
    }
    new scala.runtime.AbstractPartialFunction with java.io.Serializable {...}()
  }
).<none>

Expectation

The code should work (it works fine on 2.13).

Also, the following variations compile just fine on 3.2.1:

trait MyTrait[E <: MyTrait[E]]

case class MyClass() extends MyTrait[MyClass]

// With a helper type
type Helper = MyTrait[_]

List(MyClass()).collect {
	case e: Helper => e
}.collect {
  case e: Helper => e
}
trait MyTrait[E <: MyTrait[E]]

case class MyClass() extends MyTrait[MyClass]

// Computation split in two steps with an helper variable
val x = List(MyClass()).collect {
	case e: MyTrait[_] => e
}
x.collect {
  case e: MyTrait[_] => e
}
// No F-bounds
trait MyTrait[E]

case class MyClass() extends MyTrait[MyClass]

List(MyClass()).collect {
	case e: MyTrait[_] => e
}.collect {
  case e: MyTrait[_] => e
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions