blob: 16e9d00f1733a74b83c41ca60ae4426e546f3650 (
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
|
object Test {
def BrokenMethod(): HasFilter[(Int, String)] = ???
trait HasFilter[B] {
def filter(p: B => Boolean) = ???
}
trait HasWithFilter {
def withFilter = ???
}
object addWithFilter {
trait NoImplicit
implicit def enrich(v: Any)
(implicit F0: NoImplicit): HasWithFilter = ???
}
BrokenMethod().withFilter(_ => true) // okay
BrokenMethod().filter(_ => true) // okay
locally {
import addWithFilter._
BrokenMethod().withFilter((_: (Int, String)) => true) // okay
}
locally {
import addWithFilter._
// adaptToMemberWithArgs sets the type of the tree `x`
// to ErrorType (while in silent mode, so the error is not
// reported. Later, when the fallback from `withFilter`
// to `filter` is attempted, the closure is taken to have
// have the type `<error> => Boolean`, which conforms to
// `(B => Boolean)`. Only later during pickling does the
// defensive check for erroneous types in the tree pick up
// the problem.
BrokenMethod().withFilter(x => true) // erroneous or inaccessible type.
}
}
|