From 3f8219d5c2dbe615f7f03f3a0d98dda17e068f2d Mon Sep 17 00:00:00 2001
From: "Paolo G. Giarrusso"
Date: Sun, 2 Dec 2018 15:06:33 +0100
Subject: [PATCH 1/4] Show that Any#L is still rejected when written by the
user
---
tests/neg/i4031-anysel.scala | 3 +++
1 file changed, 3 insertions(+)
create mode 100644 tests/neg/i4031-anysel.scala
diff --git a/tests/neg/i4031-anysel.scala b/tests/neg/i4031-anysel.scala
new file mode 100644
index 000000000000..c97209733375
--- /dev/null
+++ b/tests/neg/i4031-anysel.scala
@@ -0,0 +1,3 @@
+object Test {
+ val v: Any = 1: Any#L // error
+}
From e6b5abe5600092a92f35a676fcd21879648a1fa9 Mon Sep 17 00:00:00 2001
From: "Paolo G. Giarrusso"
Date: Sun, 2 Dec 2018 16:12:39 +0100
Subject: [PATCH 2/4] Drop stray comma
---
compiler/src/dotty/tools/dotc/core/CheckRealizable.scala | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/compiler/src/dotty/tools/dotc/core/CheckRealizable.scala b/compiler/src/dotty/tools/dotc/core/CheckRealizable.scala
index 57dc1bcb5af9..22b87f41e997 100644
--- a/compiler/src/dotty/tools/dotc/core/CheckRealizable.scala
+++ b/compiler/src/dotty/tools/dotc/core/CheckRealizable.scala
@@ -47,7 +47,7 @@ object CheckRealizable {
def boundsRealizability(tp: Type)(implicit ctx: Context): Realizability =
new CheckRealizable().boundsRealizability(tp)
- private val LateInitialized = Lazy | Erased,
+ private val LateInitialized = Lazy | Erased
}
/** Compute realizability status */
From 54a92b1d11d5badfbb29859e3a4fe95322d98fc3 Mon Sep 17 00:00:00 2001
From: "Paolo G. Giarrusso"
Date: Tue, 10 Apr 2018 17:37:44 +0200
Subject: [PATCH 3/4] Seal Realizability
---
compiler/src/dotty/tools/dotc/core/CheckRealizable.scala | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/compiler/src/dotty/tools/dotc/core/CheckRealizable.scala b/compiler/src/dotty/tools/dotc/core/CheckRealizable.scala
index 22b87f41e997..a0e2a2f72177 100644
--- a/compiler/src/dotty/tools/dotc/core/CheckRealizable.scala
+++ b/compiler/src/dotty/tools/dotc/core/CheckRealizable.scala
@@ -10,7 +10,7 @@ import collection.mutable
/** Realizability status */
object CheckRealizable {
- abstract class Realizability(val msg: String) {
+ sealed abstract class Realizability(val msg: String) {
def andAlso(other: => Realizability): Realizability =
if (this == Realizable) other else this
def mapError(f: Realizability => Realizability): Realizability =
From a688061f80d5074c6d3e42893923e8fc2b3d9298 Mon Sep 17 00:00:00 2001
From: "Paolo G. Giarrusso"
Date: Tue, 10 Apr 2018 20:54:03 +0200
Subject: [PATCH 4/4] Add stress-test for realizability checking
I wrote this because I feared (incorrectly) exponential slowdowns in
realizability checking for this code. But debugging suggests that the
complexity of realizability checking is constant in the size of these
expressions (even after I disable caching of `Stable`).
Beware 1: these expressions almost smash the stack by sheer size.
Beware 2: this fails with `-Yno-deep-subtypes`, but simply because the checking
heuristics assumes people don't try to do this.
---
tests/pos-deep-subtype/i4036.scala | 64 ++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
create mode 100644 tests/pos-deep-subtype/i4036.scala
diff --git a/tests/pos-deep-subtype/i4036.scala b/tests/pos-deep-subtype/i4036.scala
new file mode 100644
index 000000000000..df06ad9b3b3c
--- /dev/null
+++ b/tests/pos-deep-subtype/i4036.scala
@@ -0,0 +1,64 @@
+trait A { def x: this.type = this; type T }
+trait B { def y: this.type = this; def x: y.type = y; type T }
+object A {
+ val v = new A { type T = Int }
+ v: v.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.type
+
+ 1: v.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.T
+
+ val u = new B { type T = Int }
+ u: u.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.
+ x.type
+
+ val z = new B { type T = this.type }
+ z: z.T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#
+ T#T#T#T#T#T#T#T#T#T#T#T#T#T#T#T
+}