Skip to content

Commit 9c18d25

Browse files
som-snytttgodzik
authored andcommitted
Nowarn extension matching nonpublic member
[Cherry-picked d0fdbfb]
1 parent d32f488 commit 9c18d25

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,16 +1069,19 @@ object RefChecks {
10691069
target.nonPrivateMember(sym.name)
10701070
.filterWithPredicate:
10711071
member =>
1072-
val memberIsImplicit = member.info.hasImplicitParams
1073-
val paramTps =
1074-
if memberIsImplicit then methTp.stripPoly.firstParamTypes
1075-
else methTp.firstExplicitParamTypes
1076-
1077-
paramTps.isEmpty || memberIsImplicit && !methTp.hasImplicitParams || {
1078-
val memberParamTps = member.info.stripPoly.firstParamTypes
1079-
!memberParamTps.isEmpty
1080-
&& memberParamTps.lengthCompare(paramTps) == 0
1081-
&& memberParamTps.lazyZip(paramTps).forall((m, x) => x frozen_<:< m)
1072+
val memberIsPublic = (member.symbol.flags & AccessFlags).isEmpty && !member.symbol.privateWithin.exists
1073+
memberIsPublic && {
1074+
val memberIsImplicit = member.info.hasImplicitParams
1075+
val paramTps =
1076+
if memberIsImplicit then methTp.stripPoly.firstParamTypes
1077+
else methTp.firstExplicitParamTypes
1078+
1079+
paramTps.isEmpty || memberIsImplicit && !methTp.hasImplicitParams || {
1080+
val memberParamTps = member.info.stripPoly.firstParamTypes
1081+
!memberParamTps.isEmpty
1082+
&& memberParamTps.lengthCompare(paramTps) == 0
1083+
&& memberParamTps.lazyZip(paramTps).forall((m, x) => x frozen_<:< m)
1084+
}
10821085
}
10831086
.exists
10841087
if !target.typeSymbol.denot.isAliasType && !target.typeSymbol.denot.isOpaqueAlias && hidden

tests/warn/i21816.scala

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
case class CC(a: String, b: String) extends Iterable[String] {
3+
override def iterator: Iterator[String] = Iterator(a, b)
4+
}
5+
6+
trait T {
7+
extension (cc: CC) def className: String = "foo"
8+
}
9+
10+
object O extends T {
11+
def foo = {
12+
val cc = CC("a", "b")
13+
println(cc.className)
14+
}
15+
}
16+
17+
@main def main() = O.foo

0 commit comments

Comments
 (0)