From b159489576fc7afdee5b2d93e9465dbc87f8069e Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Sat, 8 Apr 2017 22:51:16 +0200 Subject: Fix #2201: Less aggressive type application reduction for better inference Previously we believed that reducing type applications did not affect type inference as long as the reduced type constructor had the same arity as the unreduced one, for example reducing `Foo[X, Y]` is fine when `Foo` is defined as: type Foo[A, B] = Bar[A, B] but not when it's defined as: type Foo[A] = Bar[A, A] But this is not a sufficient condition: the bounds of the type constructor arguments also matter for type inference, so we need to be more strict and disallow reductions in cases like: type Foo[A, B] = Bar[B, A] and: type Foo[A, B] = Bar[A, Int] --- tests/pos/i2201a.scala | 8 ++++++++ tests/pos/i2201b.scala | 14 ++++++++++++++ tests/pos/i2201c.scala | 11 +++++++++++ 3 files changed, 33 insertions(+) create mode 100644 tests/pos/i2201a.scala create mode 100644 tests/pos/i2201b.scala create mode 100644 tests/pos/i2201c.scala (limited to 'tests') diff --git a/tests/pos/i2201a.scala b/tests/pos/i2201a.scala new file mode 100644 index 000000000..165f0a76e --- /dev/null +++ b/tests/pos/i2201a.scala @@ -0,0 +1,8 @@ +class Foo[T] + +class Fix[F[_]](unfix: F[Fix[F]]) +object DocTree { + type Const[T] = Foo[Int] + type FixConst = Fix[Const] + def docTree(s: Const[FixConst]): FixConst = new Fix(s) +} diff --git a/tests/pos/i2201b.scala b/tests/pos/i2201b.scala new file mode 100644 index 000000000..4aafc0d28 --- /dev/null +++ b/tests/pos/i2201b.scala @@ -0,0 +1,14 @@ +trait X +trait Y + +object Test { + type One[A <: X, B <: Y] + + type Two[TA <: Y, TB <: X] = One[TB, TA] + + def foo[M[_ <: Y, _ <: X]](x: M[_ <: Y, _ <: X]) = x + + val a: Two[Y, X] = ??? + + foo(a) +} diff --git a/tests/pos/i2201c.scala b/tests/pos/i2201c.scala new file mode 100644 index 000000000..91f2529d9 --- /dev/null +++ b/tests/pos/i2201c.scala @@ -0,0 +1,11 @@ +object Test { + implicit val theAnswer: Int = 42 + + type Swap[A, B] = (B, A) + + def foo[M[_, _], T, S](x: M[T, S])(implicit ev: T) = ev + + val a: Swap[Int, String] = ("hi", 1) + + foo(a) +} -- cgit v1.2.3