diff options
-rw-r--r-- | src/dotty/tools/dotc/core/Types.scala | 17 | ||||
-rw-r--r-- | test/dotc/tests.scala | 1 | ||||
-rw-r--r-- | tests/neg/i1050.scala | 24 |
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) + } +} |