aboutsummaryrefslogtreecommitdiff
path: root/tests/invalid/pos/t8219b.scala
blob: b820447ce1fd4a86cac425ac17c961554376cc8a (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
trait Equalizer[T]
trait Gen[A]

class Broken {
  implicit def const[T](x: T): Gen[T] = ???
  implicit def convertToEqualizer[T](left: T): Equalizer[T] = ???

  def in(a: Any) = ()
  in {
    import scala.None // any import will do..
    "" == "" // no longer a problem, see pos/t8129.scala
  }

  // We used to fall into the errant code path above when `Any#==` and `AnyRef#==`
  // were overloaded.
  //
  // Real classes couldn't get away with that overloading; it would result in
  // a compiler error because the variants would collapse into an overriding
  // relationship after erasure.
  //
  //
  // But, a structural type can! This triggers the same error, and served as
  // a backstop for this test if we change the signatures of `AnyRef#==` to
  // override `Any#==`.
  type T = {
    def a(a: AnyRef): Boolean
    def a(a: Any): Boolean
  }

  def t: T = ???

  in {
    import scala.None // any import will do..
    t.a("")
  }

  // Or, we can get here with ambiguous implicits from the formal parameter
  // type of the less specific overload to that of the more specific.
  object T {
    def foo(a: Any) = true
    def foo(a: String) = true
  }
  in {
    import scala.None
    implicit def any2str1(a: Any): String = ""
    implicit def any2str2(a: Any): String = ""
    T.foo("")
  }
}