diff options
author | Hubert Plociniczak <hubert.plociniczak@gmail.com> | 2013-02-19 17:16:13 +0100 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@gmail.com> | 2013-04-26 16:20:38 +0200 |
commit | accaa314f3473553d9ffaff8c37e3c5b29f0f2e3 (patch) | |
tree | b020cbdb01a335ce41aa597c8f3cef8551b0370e /test | |
parent | f33af58f3b6538398da6974275099fb18560e92d (diff) | |
download | scala-accaa314f3473553d9ffaff8c37e3c5b29f0f2e3.tar.gz scala-accaa314f3473553d9ffaff8c37e3c5b29f0f2e3.tar.bz2 scala-accaa314f3473553d9ffaff8c37e3c5b29f0f2e3.zip |
SI-7291: No exception throwing for diverging implicit expansion
Since we don't throw exceptions for normal errors it was a bit odd
that we don't do that for DivergingImplicit.
As SI-7291 shows, the logic behind catching/throwing exception
was broken for divergence. Instead of patching it, I rewrote
the mechanism so that we now another SearchFailure type related
to diverging expansion, similar to ambiguous implicit scenario.
The logic to prevent diverging expansion from stopping the search
had to be slightly adapted but works as usual.
The upside is that we don't have to catch diverging implicit
for example in the presentation compiler which was again showing
that something was utterly broken with the exception approach.
Diffstat (limited to 'test')
-rw-r--r-- | test/files/neg/t696.check | 10 | ||||
-rw-r--r-- | test/files/neg/t696.scala | 7 | ||||
-rw-r--r-- | test/files/run/t7291.check | 2 | ||||
-rw-r--r-- | test/files/run/t7291.scala | 19 |
4 files changed, 32 insertions, 6 deletions
diff --git a/test/files/neg/t696.check b/test/files/neg/t696.check index ac26a864a5..b7bc5cdf98 100644 --- a/test/files/neg/t696.check +++ b/test/files/neg/t696.check @@ -1,5 +1,9 @@ -t696.scala:4: error: diverging implicit expansion for type TypeUtil0.Type[Any] +t696.scala:5: error: diverging implicit expansion for type TypeUtil0.Type[Any] starting with method WithType in object TypeUtil0 - as[Any](null); + as[Any](null) ^ -one error found +t696.scala:6: error: diverging implicit expansion for type TypeUtil0.Type[X] +starting with method WithType in object TypeUtil0 + def foo[X]() = as[X](null) + ^ +two errors found diff --git a/test/files/neg/t696.scala b/test/files/neg/t696.scala index a06a32141a..ca76f7ef6c 100644 --- a/test/files/neg/t696.scala +++ b/test/files/neg/t696.scala @@ -1,6 +1,7 @@ object TypeUtil0 { - trait Type[+T]; + trait Type[+T] implicit def WithType[S,T](implicit tpeS : Type[S], tpeT : Type[T]) : Type[S with T] = null - as[Any](null); - def as[T](x : Any)(implicit tpe : Type[T]) = null; + def as[T](x : Any)(implicit tpe : Type[T]) = null + as[Any](null) + def foo[X]() = as[X](null) } diff --git a/test/files/run/t7291.check b/test/files/run/t7291.check new file mode 100644 index 0000000000..c07ba986a3 --- /dev/null +++ b/test/files/run/t7291.check @@ -0,0 +1,2 @@ +conjure +traversable diff --git a/test/files/run/t7291.scala b/test/files/run/t7291.scala new file mode 100644 index 0000000000..30c4261a81 --- /dev/null +++ b/test/files/run/t7291.scala @@ -0,0 +1,19 @@ +trait Fooable[T] +object Fooable { + implicit def conjure[T]: Fooable[T] = { + println("conjure") + new Fooable[T]{} + } + +} + +object Test { + implicit def traversable[T, Coll[_] <: Traversable[_]](implicit +elem: Fooable[T]): Fooable[Coll[T]] = { + println("traversable") + new Fooable[Coll[T]]{} + } + def main(args: Array[String]) { + implicitly[Fooable[List[Any]]] + } +} |