Skip to content

Commit ced51fd

Browse files
committed
Also consider type aliases when checking for realizability
Fixes #50.
1 parent b0b409e commit ced51fd

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

src/dotty/tools/dotc/core/Types.scala

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ object Types {
139139
case _ => false
140140
}
141141
isConcrete(tp) &&
142-
tp.abstractTypeMembers.forall { m =>
142+
tp.nonClassTypeMembers.forall { m =>
143143
val bounds = m.info.bounds
144144
bounds.lo <:< bounds.hi
145145
} ||
@@ -592,6 +592,12 @@ object Types {
592592
(name, buf) => buf += member(name).asSingleDenotation)
593593
}
594594

595+
/** The set of abstract type members of this type. */
596+
final def nonClassTypeMembers(implicit ctx: Context): Seq[SingleDenotation] = track("nonClassTypeMembers") {
597+
memberDenots(nonClassTypeNameFilter,
598+
(name, buf) => buf += member(name).asSingleDenotation)
599+
}
600+
595601
/** The set of type members of this type */
596602
final def typeMembers(implicit ctx: Context): Seq[SingleDenotation] = track("typeMembers") {
597603
memberDenots(typeNameFilter,
@@ -3367,6 +3373,15 @@ object Types {
33673373
}
33683374
}
33693375

3376+
/** A filter for names of abstract types of a given type */
3377+
object nonClassTypeNameFilter extends NameFilter {
3378+
def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean =
3379+
name.isTypeName && {
3380+
val mbr = pre.member(name)
3381+
mbr.symbol.isType && !mbr.symbol.isClass
3382+
}
3383+
}
3384+
33703385
/** A filter for names of deferred term definitions of a given type */
33713386
object abstractTermNameFilter extends NameFilter {
33723387
def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean =

test/dotc/tests.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ class tests extends CompilerTest {
159159
@Test def neg_i705 = compileFile(negDir, "i705-inner-value-class", xerrors = 7)
160160
@Test def neg_i866 = compileFile(negDir, "i866", xerrors = 2)
161161
@Test def neg_i974 = compileFile(negDir, "i974", xerrors = 2)
162+
@Test def neg_i1050 = compileFile(negDir, "i1050", xerrors = 2)
162163
@Test def neg_moduleSubtyping = compileFile(negDir, "moduleSubtyping", xerrors = 4)
163164
@Test def neg_escapingRefs = compileFile(negDir, "escapingRefs", xerrors = 2)
164165
@Test def neg_instantiateAbstract = compileFile(negDir, "instantiateAbstract", xerrors = 8)

tests/neg/i1050.scala

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
trait A { type L <: Nothing }
2+
trait B { type L >: Any}
3+
object Test {
4+
lazy val x: A & B = ???
5+
val y: x.L = 1
6+
val z: String = y
7+
}
8+
object Test50 {
9+
trait A {
10+
type X = String
11+
}
12+
trait B {
13+
type X = Int
14+
}
15+
lazy val o: A & B = ???
16+
17+
def xToString(x: o.X): String = x
18+
19+
def intToString(i: Int): String = xToString(i)
20+
21+
def main(args: Array[String]) = {
22+
val s: String = intToString(1)
23+
}
24+
}

0 commit comments

Comments
 (0)