Skip to content

Commit bac4eec

Browse files
authored
Merge pull request #1596 from dotty-staging/fix-#1531
Fix #1531: Ignore private members when looking for abstract ones
2 parents 148551a + bcd3c1f commit bac4eec

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -620,13 +620,13 @@ object Types {
620620
/** The set of abstract term members of this type. */
621621
final def abstractTermMembers(implicit ctx: Context): Seq[SingleDenotation] = track("abstractTermMembers") {
622622
memberDenots(abstractTermNameFilter,
623-
(name, buf) => buf ++= member(name).altsWith(_ is Deferred))
623+
(name, buf) => buf ++= nonPrivateMember(name).altsWith(_ is Deferred))
624624
}
625625

626626
/** The set of abstract type members of this type. */
627627
final def abstractTypeMembers(implicit ctx: Context): Seq[SingleDenotation] = track("abstractTypeMembers") {
628628
memberDenots(abstractTypeNameFilter,
629-
(name, buf) => buf += member(name).asSingleDenotation)
629+
(name, buf) => buf += nonPrivateMember(name).asSingleDenotation)
630630
}
631631

632632
/** The set of abstract type members of this type. */
@@ -3763,7 +3763,7 @@ object Types {
37633763
object abstractTypeNameFilter extends NameFilter {
37643764
def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean =
37653765
name.isTypeName && {
3766-
val mbr = pre.member(name)
3766+
val mbr = pre.nonPrivateMember(name)
37673767
(mbr.symbol is Deferred) && mbr.info.isInstanceOf[RealTypeBounds]
37683768
}
37693769
}
@@ -3780,7 +3780,7 @@ object Types {
37803780
/** A filter for names of deferred term definitions of a given type */
37813781
object abstractTermNameFilter extends NameFilter {
37823782
def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean =
3783-
name.isTermName && (pre member name).hasAltWith(_.symbol is Deferred)
3783+
name.isTermName && pre.nonPrivateMember(name).hasAltWith(_.symbol is Deferred)
37843784
}
37853785

37863786
object typeNameFilter extends NameFilter {

src/dotty/tools/dotc/typer/RefChecks.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ object RefChecks {
487487
// abstract method, and a cursory examination of the difference reveals
488488
// something obvious to us, let's make it more obvious to them.
489489
val abstractParams = underlying.info.firstParamTypes
490-
val matchingName = clazz.info.member(underlying.name).alternatives
490+
val matchingName = clazz.info.nonPrivateMember(underlying.name).alternatives
491491
val matchingArity = matchingName filter { m =>
492492
!m.symbol.is(Deferred) &&
493493
m.info.firstParamTypes.length == abstractParams.length

tests/neg/i1531.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
trait T {
2+
def f: Int
3+
}
4+
5+
class A(f: Int) extends T // error: class A needs to be abstract
6+

0 commit comments

Comments
 (0)