Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Backported fix for SI-7753 to 2.10.x.
- Loading branch information
1 parent
ad0ddd4
commit 2f5ff59
Showing
5 changed files
with
123 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
t3873.scala:11: error: type mismatch; | ||
found : Test.a.B | ||
required: a.B | ||
wrongf(new A)(a.b) // should not compile -- TODO: improve error message? the "a" is ambiguous | ||
required: a.B where val a: A | ||
wrongf(new A)(a.b) // should not compile | ||
^ | ||
one error found |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
import scala.language.{ higherKinds, implicitConversions } | ||
|
||
trait Foo { type Out } | ||
|
||
trait SI { | ||
val instance: Foo | ||
type Out | ||
} | ||
|
||
object Test { | ||
def test { | ||
def indirect(si: SI)(v: si.instance.Out) = v | ||
|
||
val foo: Foo { type Out = Int } = ??? | ||
def conv(i: Foo): SI { type Out = i.Out; val instance: i.type } = ??? | ||
|
||
val converted = conv(foo) | ||
|
||
val v1: Int = indirect(converted)(23) // Okay (after refining the return type `instance` in the return type of `conv`) | ||
/* | ||
indirect(converted){(v: converted.instance.Out)converted.instance.Out}( | ||
23{Int(23)} | ||
){converted.instance.Out}; | ||
*/ | ||
|
||
val v2: Int = indirect(conv(foo))(23) // Used to fail as follows: | ||
/* | ||
indirect( | ||
conv(foo){si.SI{type Out = foo.Out; val instance: si.Test.<refinement>.type}} | ||
){(v: si.instance.Out)si.instance.Out}( | ||
23{<error>} | ||
){<error>}; | ||
*/ | ||
|
||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package p { | ||
class ViewEnv[AIn] { | ||
type A = AIn | ||
class SubView { def has(x: A): Boolean = ??? } | ||
def get: SubView = new SubView | ||
} | ||
|
||
trait HasA { type A } | ||
trait Indexable[R] extends HasA | ||
class ArrayTC[AIn] extends Indexable[Array[AIn]] { type A = AIn } | ||
} | ||
|
||
package object p { | ||
implicit def arrayTypeClass[A] : ArrayTC[A] = new ArrayTC[A] | ||
object intArrayTC extends ArrayTC[Int] | ||
|
||
type EnvAlias[W <: HasA] = ViewEnv[W#A] | ||
type SubAlias[W <: HasA] = ViewEnv[W#A]#SubView | ||
|
||
def f0[R](xs: R)(implicit tc: Indexable[R]): ViewEnv[tc.A]#SubView = new ViewEnv[tc.A]() get | ||
def f1[R](xs: R)(implicit tc: Indexable[R]): EnvAlias[tc.type]#SubView = new ViewEnv[tc.A]() get | ||
def f2[R](xs: R)(implicit tc: Indexable[R]): SubAlias[tc.type] = new ViewEnv[tc.A]() get | ||
|
||
def g0 = f0(Array(1)) has 2 // ok | ||
def g1 = f1(Array(1)) has 2 // ok | ||
def g2 = f2(Array(1)) has 2 // "found: Int(2), required: tc.A" | ||
def g3 = f2(Array(1))(new ArrayTC[Int]) has 2 // "found: Int(2), required: tc.A" | ||
def g4 = f2(Array(1))(intArrayTC) has 2 // ok | ||
} |