diff options
author | Martin Odersky <odersky@gmail.com> | 2017-03-02 18:14:24 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2017-03-02 18:14:30 +0100 |
commit | 10d868ce335d1ecbb0a6acb8d4bd804d76edcac9 (patch) | |
tree | 92523271c9bbeddee77f2ff7a0f19287e6962f60 | |
parent | 4c6a69ec075de6948f2c82778f6ccf7a30b6bc70 (diff) | |
download | dotty-10d868ce335d1ecbb0a6acb8d4bd804d76edcac9.tar.gz dotty-10d868ce335d1ecbb0a6acb8d4bd804d76edcac9.tar.bz2 dotty-10d868ce335d1ecbb0a6acb8d4bd804d76edcac9.zip |
More tests
and a typo fixed
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/TypeComparer.scala | 2 | ||||
-rw-r--r-- | tests/pos/t5070.scala | 23 | ||||
-rw-r--r-- | tests/pos/t5643.scala | 19 |
3 files changed, 43 insertions, 1 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala index 6042cc12c..168742257 100644 --- a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala +++ b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala @@ -1312,7 +1312,7 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling { case tp1: RefinedType => tp2 match { case tp2: RefinedType if tp1.refinedName == tp2.refinedName => - // Given two refinements `T1 { X = S1 }` and `T2 { X = S2 }` rwrite to + // Given two refinements `T1 { X = S1 }` and `T2 { X = S2 }` rewrite to // `T1 & T2 { X B }` where `B` is the conjunction of the bounds of `X` in `T1` and `T2`. // // However, if `homogenizeArgs` is set, and both aliases `X = Si` are diff --git a/tests/pos/t5070.scala b/tests/pos/t5070.scala index 410afba14..0e5c0ffc0 100644 --- a/tests/pos/t5070.scala +++ b/tests/pos/t5070.scala @@ -13,3 +13,26 @@ class Test { implicitly[a.T](b(a)) // works } + + +class ImplicitVsTypeAliasTezt { + + class Monad[m[_]] { + type For[a] = _For[m, a] + implicit def toFor[a](m: m[a]): For[a] = throw new Error("todo") // lookup fails +// implicit def toFor[a](m: m[a]): _For[m, a] = throw new Error("todo") // fine. + } + + trait _For[m[_], a] { + def map[b](p: a => b): m[b] + } + + def useMonad[m[_], a](m: m[a])(implicit i: Monad[m]) = { + import i._ + + // value map is not a member of type parameter m[a] + for { + x <- m + } yield x.toString + } +} diff --git a/tests/pos/t5643.scala b/tests/pos/t5643.scala new file mode 100644 index 000000000..1ce34ba36 --- /dev/null +++ b/tests/pos/t5643.scala @@ -0,0 +1,19 @@ +object TupledEvidenceTest { + + abstract class TupledEvidence[M[_], T0] { type T = T0 } + + implicit def witnessTuple2[M[_], T1, T2](implicit ev1: M[T1], ev2: M[T2]): + TupledEvidence[M, (T1, T2)] { type T = (T1, T2) } = sys.error("") + + class GetResult[T] + + implicit val getString: GetResult[String] = new GetResult[String] + + implicit def getTuple[T](implicit w: TupledEvidence[GetResult, T]): GetResult[w.T] = sys.error("") + + def f[T : GetResult] = "" + + f[(String,String)](getTuple[(String, String)]) + + f[(String,String)] +} |