blob: f3a379b4eba5247f1448ad24d8b271dd0bb435bf (
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
|
// Dotty rewrites only withFilter calls occurring in for expressions to filter calls.
// So this test does not compile.
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) // error
BrokenMethod().filter(_ => true) // ok
locally {
import addWithFilter._
BrokenMethod().withFilter((_: (Int, String)) => true) // error
}
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) // error
}
}
|