summaryrefslogtreecommitdiff
path: root/test/files/neg/t8675.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2014-06-23 11:27:31 +0200
committerJason Zaugg <jzaugg@gmail.com>2014-06-25 11:01:19 +0200
commit7a16f76673530f71bf1b8fa79b489b502ef504a8 (patch)
treecc94c0760f798cf2988d45dee6a29ad4d43ec098 /test/files/neg/t8675.scala
parent1c0b48da8dfa124eb762620c8cb803a9079b7c81 (diff)
downloadscala-7a16f76673530f71bf1b8fa79b489b502ef504a8.tar.gz
scala-7a16f76673530f71bf1b8fa79b489b502ef504a8.tar.bz2
scala-7a16f76673530f71bf1b8fa79b489b502ef504a8.zip
SI-8675 Avoid unreported error after second try using implicit view
This is specific to situations in which we first typecheck an application `qual.m(arg)` against the method `m` directly provided by `qual`, and then fall back to `implicitView(qual).m(arg)`. Regressed in SI-3971 / 7fa77af, in which error reports were moved to the innermost `Apply`, and the check for `errorInResult` was accordingly changed to recurse through `Apply` trees. Before that change, we did not fall back to using a view. After the change, we do try a view. We retypecheck the arguments under the `retyping` mode (see `tryTypedArgs`), but this doesn't seem to be enough to avoid leaking the error typed nested trees from the first try. Here's an example from the enclosed test case: a.update(0, x[A]({new isString(true)})) `-- error typed refArrayOps(a).update(0, x[A]({new isString(true)})) ` `-- error type persists `-- this tree is retypecked by tryTypedArgs This commit changes `onError` to only proceed with the second try if the retyped argument trees are error free.
Diffstat (limited to 'test/files/neg/t8675.scala')
-rw-r--r--test/files/neg/t8675.scala24
1 files changed, 24 insertions, 0 deletions
diff --git a/test/files/neg/t8675.scala b/test/files/neg/t8675.scala
new file mode 100644
index 0000000000..ca9bb57ffa
--- /dev/null
+++ b/test/files/neg/t8675.scala
@@ -0,0 +1,24 @@
+class A(s: String) {
+ def foo(x: A) = x
+}
+
+class isString(s: String)
+
+class Test {
+
+ def x[A](a: Any): A = ???
+
+ def test {
+ val a = Array[A]()
+ a.update(0, x[A]({new isString(true)})) // !!! allowed
+
+ // boils down to
+ class X {
+ def m(p: Any) {}
+ }
+ implicit class XOps(x: X) {
+ def m(p: Any) {}
+ }
+ new X().m(x[A]({new isString(true)})) // !!! allowed
+ }
+}