summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-12-11 15:56:37 +0100
committerJason Zaugg <jzaugg@gmail.com>2013-12-11 20:06:08 +0100
commit0304e00168393d47e18dbb4d2c634d51bab1383a (patch)
tree191643e52a25845360767433364b41d9de091ef6 /test
parentb345b42cac64aa97e3bbcc6f14ef8f08214ab56f (diff)
downloadscala-0304e00168393d47e18dbb4d2c634d51bab1383a.tar.gz
scala-0304e00168393d47e18dbb4d2c634d51bab1383a.tar.bz2
scala-0304e00168393d47e18dbb4d2c634d51bab1383a.zip
SI-6780 Better handling of cycles in in-scope implicit search
Implicit searches in the body of implicit members with inferred types were leading to cycles. Before we used to resolve that by saying there were no implicits in scope at all; now we just skip the current context and still include the enclosing implicits. Care is taken not to cache results under these circumstances. This entails reworking `Context#implicitss` so that: - the implicit info cache only contains implicits from the current level. The List[List[_]] is now contructed on demand; - we can detect cycles by setting `implicitsCacheRunId` to -1 during the computation. The outer implicits when we encounter that. - we avoid caching when we hit a cycle or when the owner is uninitialized.
Diffstat (limited to 'test')
-rw-r--r--test/files/neg/t712.check1
-rw-r--r--test/files/pos/t6780.scala20
2 files changed, 21 insertions, 0 deletions
diff --git a/test/files/neg/t712.check b/test/files/neg/t712.check
index 6819dc0ce9..831e943063 100644
--- a/test/files/neg/t712.check
+++ b/test/files/neg/t712.check
@@ -1,4 +1,5 @@
t712.scala:10: error: value self is not a member of B.this.ParentImpl
+ Note: implicit method coerce is not applicable here because it comes after the application point and it lacks an explicit result type
implicit def coerce(p : ParentImpl) = p.self;
^
one error found
diff --git a/test/files/pos/t6780.scala b/test/files/pos/t6780.scala
new file mode 100644
index 0000000000..4a358046c6
--- /dev/null
+++ b/test/files/pos/t6780.scala
@@ -0,0 +1,20 @@
+object O {
+ implicit def i: Int = 0
+}
+
+import O._
+
+trait Foo {
+ implicit val v1: Any
+ implicit def d1: Any
+ val v2: Any
+ implicit val v3: Any
+}
+
+trait Bar1 extends Foo {
+ implicit val v1 = {implicitly[Int]; ()} // failed due to cycle in Context#implicits being broken with Nil.
+ def d1 = {implicitly[Int]; ()} // okay
+ implicit val v2 = {implicitly[Int]; ()} // okay
+ implicit val v3: Any = {implicitly[Int]; ()} // okay
+
+}