summaryrefslogtreecommitdiff
path: root/test/files/neg/delayed-init-ref.scala
blob: f2aa804e28f9302e31a1048103f546abe0f5bbf5 (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
30
31
32
33
34
35
36
37
38
39
40
41
42
trait T {
  val traitVal = ""
}

object O extends App with T {
  val vall = ""
  lazy val lazyy = ""
  def deff = ""

  println(vall)       // no warn
  new {
    println(vall)     // no warn
  }
}

object Client {
  println(O.vall)     // warn
  import O.vall
  println(vall)       // warn

  println(O.lazyy)    // no warn
  println(O.deff)     // no warn
  println(O.traitVal) // no warn
}

// Delayed init usage pattern from Specs2
// See: https://groups.google.com/d/msg/scala-sips/wP6dL8nIAQs/ogjoPE-MSVAJ
trait Before extends DelayedInit {
  def before()
  override def delayedInit(x: => Unit): Unit = { before; x }
}
object Spec {
  trait UserContext extends Before {
    def before() = ()
    val foo = "foo"
  }
  new UserContext {
    println(foo)                      // no warn
    println(this.foo)                 // no warn
    println({locally(()); this}.foo)  // warn (spurious, but we can't discriminate)
  }
}