aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/core/Types.scala17
-rw-r--r--test/dotc/tests.scala1
-rw-r--r--tests/neg/i1050.scala24
3 files changed, 41 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala
index db0831ba0..7e8a11e5b 100644
--- a/src/dotty/tools/dotc/core/Types.scala
+++ b/src/dotty/tools/dotc/core/Types.scala
@@ -139,7 +139,7 @@ object Types {
case _ => false
}
isConcrete(tp) &&
- tp.abstractTypeMembers.forall { m =>
+ tp.nonClassTypeMembers.forall { m =>
val bounds = m.info.bounds
bounds.lo <:< bounds.hi
} ||
@@ -592,6 +592,12 @@ object Types {
(name, buf) => buf += member(name).asSingleDenotation)
}
+ /** The set of abstract type members of this type. */
+ final def nonClassTypeMembers(implicit ctx: Context): Seq[SingleDenotation] = track("nonClassTypeMembers") {
+ memberDenots(nonClassTypeNameFilter,
+ (name, buf) => buf += member(name).asSingleDenotation)
+ }
+
/** The set of type members of this type */
final def typeMembers(implicit ctx: Context): Seq[SingleDenotation] = track("typeMembers") {
memberDenots(typeNameFilter,
@@ -3387,6 +3393,15 @@ object Types {
}
}
+ /** A filter for names of abstract types of a given type */
+ object nonClassTypeNameFilter extends NameFilter {
+ def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean =
+ name.isTypeName && {
+ val mbr = pre.member(name)
+ mbr.symbol.isType && !mbr.symbol.isClass
+ }
+ }
+
/** A filter for names of deferred term definitions of a given type */
object abstractTermNameFilter extends NameFilter {
def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean =
diff --git a/test/dotc/tests.scala b/test/dotc/tests.scala
index 13010323e..85b1db139 100644
--- a/test/dotc/tests.scala
+++ b/test/dotc/tests.scala
@@ -161,6 +161,7 @@ class tests extends CompilerTest {
@Test def neg_i803 = compileFile(negDir, "i803", xerrors = 2)
@Test def neg_i866 = compileFile(negDir, "i866", xerrors = 2)
@Test def neg_i974 = compileFile(negDir, "i974", xerrors = 2)
+ @Test def neg_i1050 = compileFile(negDir, "i1050", xerrors = 2)
@Test def neg_moduleSubtyping = compileFile(negDir, "moduleSubtyping", xerrors = 4)
@Test def neg_escapingRefs = compileFile(negDir, "escapingRefs", xerrors = 2)
@Test def neg_instantiateAbstract = compileFile(negDir, "instantiateAbstract", xerrors = 8)
diff --git a/tests/neg/i1050.scala b/tests/neg/i1050.scala
new file mode 100644
index 000000000..48e2b5f2e
--- /dev/null
+++ b/tests/neg/i1050.scala
@@ -0,0 +1,24 @@
+trait A { type L <: Nothing }
+trait B { type L >: Any}
+object Test {
+ lazy val x: A & B = ???
+ val y: x.L = 1
+ val z: String = y
+}
+object Test50 {
+ trait A {
+ type X = String
+ }
+ trait B {
+ type X = Int
+ }
+ lazy val o: A & B = ???
+
+ def xToString(x: o.X): String = x
+
+ def intToString(i: Int): String = xToString(i)
+
+ def main(args: Array[String]) = {
+ val s: String = intToString(1)
+ }
+}