summaryrefslogtreecommitdiff
path: root/test/files/run/t7015.scala
blob: 37a73a9fc4f729f519400f285a57416a6784e60d (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
43
44
45
46
47
48
49
object Test {
  def main(args : Array[String]) : Unit = {
    println(s"Method returns Null type: $f")
    println(s"Method takes non Null type: ${g(null)}")

    // pass things through the g function because it expects
    // a string. If we haven't adapted properly then we'll
    // get verify errors
    val b = new B
    println(s"call through method ${g(b.f(null))}")
    println(s"call through bridge ${g((b: A).f(null))}")

    println(s"fetch field: ${g(b.nullField)}")
    println(s"fetch field on companion: ${g(B.nullCompanionField)}")

    val x = f
    println(s"fetch local: ${g(x)}")

    val nulls = Array(f, f, f)
    println(s"fetch array element: ${g(nulls(0))}")

    println(s"method that takes object: ${q(f)}")
    println(s"method that takes anyref: ${r(f)}")
    println(s"method that takes any: ${s(f)}")
  }

  def f: Null = null

  def g(x: String) = x

  def q(x: java.lang.Object) = x
  def r(x: AnyRef) = x
  def s(x: Any) = x
}

abstract class A {
	def f(x: String): String
}

class B extends A {
	val nullField = null

	// this forces a bridge method because the return type is different
	override def f(x: String) : Null = null
}

object B {
	val nullCompanionField = null
}