aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/config/Config.scala5
-rw-r--r--src/dotty/tools/dotc/core/TypeApplications.scala19
-rw-r--r--tests/pos/i1181b.scala11
-rw-r--r--tests/pos/i1181c.scala11
4 files changed, 31 insertions, 15 deletions
diff --git a/src/dotty/tools/dotc/config/Config.scala b/src/dotty/tools/dotc/config/Config.scala
index a50945108..0949d7fee 100644
--- a/src/dotty/tools/dotc/config/Config.scala
+++ b/src/dotty/tools/dotc/config/Config.scala
@@ -98,9 +98,8 @@ object Config {
final val splitProjections = false
/** If this flag is on, always rewrite an application `S[Ts]` where `S` is an alias for
- * `[Xs] -> U` to `[Xs := Ts]U`. If this flag is off, the rewriting is only done if `S` is a
- * reference to an instantiated parameter. Turning this flag on was observed to
- * give a ~6% speedup on the JUnit test suite.
+ * `[Xs] -> U` to `[Xs := Ts]U`.
+ * Turning this flag on was observed to give a ~6% speedup on the JUnit test suite.
*/
final val simplifyApplications = true
diff --git a/src/dotty/tools/dotc/core/TypeApplications.scala b/src/dotty/tools/dotc/core/TypeApplications.scala
index 314233709..cb11d3fdc 100644
--- a/src/dotty/tools/dotc/core/TypeApplications.scala
+++ b/src/dotty/tools/dotc/core/TypeApplications.scala
@@ -470,18 +470,13 @@ class TypeApplications(val self: Type) extends AnyVal {
case dealiased: TypeLambda =>
def tryReduce =
if (!args.exists(_.isInstanceOf[TypeBounds])) {
- val followAlias = stripped match {
- case stripped: TypeRef =>
- stripped.symbol.is(BaseTypeArg)
- case _ =>
- Config.simplifyApplications && {
- dealiased.resType match {
- case AppliedType(tyconBody, _) =>
- variancesConform(typParams, tyconBody.typeParams)
- // Reducing is safe for type inference, as kind of type constructor does not change
- case _ => false
- }
- }
+ val followAlias = Config.simplifyApplications && {
+ dealiased.resType match {
+ case AppliedType(tyconBody, _) =>
+ variancesConform(typParams, tyconBody.typeParams)
+ // Reducing is safe for type inference, as kind of type constructor does not change
+ case _ => false
+ }
}
if ((dealiased eq stripped) || followAlias) dealiased.instantiate(args)
else HKApply(self, args)
diff --git a/tests/pos/i1181b.scala b/tests/pos/i1181b.scala
new file mode 100644
index 000000000..7694aed0b
--- /dev/null
+++ b/tests/pos/i1181b.scala
@@ -0,0 +1,11 @@
+class Foo[A]
+
+object Test {
+ def foo[M[_,_]](x: M[Int,Int]) = x
+
+ type Alias[X,Y] = Foo[X]
+ val x: Alias[Int,Int] = new Foo[Int]
+
+ foo[Alias](x) // ok
+ foo(x)
+}
diff --git a/tests/pos/i1181c.scala b/tests/pos/i1181c.scala
new file mode 100644
index 000000000..940629259
--- /dev/null
+++ b/tests/pos/i1181c.scala
@@ -0,0 +1,11 @@
+class Foo[A]
+
+trait Bar[DD[_,_]] {
+ val x: DD[Int, Int]
+}
+
+trait Baz extends Bar[[X,Y] -> Foo[X]] {
+ def foo[M[_,_]](x: M[Int, Int]) = x
+
+ foo(x)
+}