aboutsummaryrefslogtreecommitdiff
path: root/tests/pos/t9004.scala
blob: d591bc852a7bba8afdd41f5f86fd50de53ee3d22 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
object Main {
  trait AA[RR] { type R = RR; def r: R }

  def test1(a: AA[_]) = {
    val f = () => a.r
    // The tree a.r is given the type `a.R` which normalizes
    // to B', where B' is a distinct symbol ("captured existential skolem")
    // to substitute for the reference to an existential skolem of B.
    //
    // inference of the result type of the function computes the
    // packed type of tree `a.r` to make sure that terms and types
    // local to the body of the function don't leak into its result
    // type. The captured existential skolem is considered to be local
    // so it is abstracted to its upper bound, Any.
    //
    // However, the packedType transformation need not have even considered
    // B', as it is clear that the type `a.R` is not local to the function
    // body!
    f: (() => a.R)

    // The workaround is to annotate the function type, rather than
    // relying in inference.
    val g: (() => a.R) = () => a.r
    val g2  = () => a.r

    ()
  }
  // typer debug trace: http://rawgit.com/retronym/d5aeaf8e0a4a2e6eef4b/raw/out.html
}