diff options
author | odersky <odersky@gmail.com> | 2016-08-26 09:32:16 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-26 09:32:16 +0300 |
commit | b3005424d449b6280aab9b2c92d13c1c9e914f76 (patch) | |
tree | 4c4c90a784dec3784a578e9bbd76628ee416f845 /tests/pending | |
parent | 0e8f05d88bfef95fac59f522fd9d06792126bd11 (diff) | |
parent | 41b7ca73480e868d830b08db382debf049418973 (diff) | |
download | dotty-b3005424d449b6280aab9b2c92d13c1c9e914f76.tar.gz dotty-b3005424d449b6280aab9b2c92d13c1c9e914f76.tar.bz2 dotty-b3005424d449b6280aab9b2c92d13c1c9e914f76.zip |
Merge pull request #1460 from dotty-staging/fix-t1756
Make sure arguments are evaluated in the correct typer state.
Diffstat (limited to 'tests/pending')
-rw-r--r-- | tests/pending/pos/t1756.scala | 59 |
1 files changed, 0 insertions, 59 deletions
diff --git a/tests/pending/pos/t1756.scala b/tests/pending/pos/t1756.scala deleted file mode 100644 index 34bf273ab..000000000 --- a/tests/pending/pos/t1756.scala +++ /dev/null @@ -1,59 +0,0 @@ - -/** -This is a tricky issue which has to do with the fact that too much conflicting -type information is propagated into a single implicit search, where the intended -solution applies two implicit searches. - -Roughly, in x + x * y, the first x is first typed as Poly[A]. That -means the x * y is then typed as Poly[A]. Then the second x is typed -as Poly[A], then y is typed as Poly[Poly[A]]. The application x * y -fails, so the coef2poly implicit conversion is applied to x. That -means we look for an implicit conversion from type Poly[A] to type -?{val *(x$1: ?>: Poly[Poly[A]] <: Any): Poly[A]}. Note that the result -type Poly[A] is propagated into the implicit search. Poly[A] comes as -expected type from x+, because the lhs x is still typed as a Poly[A]. -This means that the argument of the implicit conversion is typechecked -with expected type A with Poly[A]. And no solution is found. - -To solve this, I added a fallback scheme similar to implicit arguments: -When an implicit view that adds a method matching given arguments and result -type fails, try again without the result type. - -However, troubles are not yet over. We now get an oprhan poly param C when pickling -and, if typr printer and -Ylog:front is on, an infinite type of the form - - mu x. Ring[LazyRef(x) & A] -*/ -trait Ring[T <: Ring[T]] { - def +(that: T): T - def *(that: T): T -} - -class A extends Ring[A] { - def +(that: A) = new A - def *(that: A) = new A -} - -class Poly[C <: Ring[C]](val c: C) extends Ring[Poly[C]] { - def +(that: Poly[C]) = new Poly(this.c + that.c) - def *(that: Poly[C]) = new Poly(this.c*that.c) -} - -object Test extends App { - - implicit def coef2poly[C <: Ring[C]](c: C): Poly[C] = new Poly(c) - - val a = new A - val x = new Poly(new A) - - println(x + a) // works - println(a + x) // works - - val y = new Poly(new Poly(new A)) - - println(x + y*x) // works - println(x*y + x) // works - println(y*x + x) // works - - println(x + x*y) // failed before -} |