@@ -1177,29 +1177,53 @@ class TreeUnpickler(reader: TastyReader,
11771177 val levels = readNat()
11781178 readTerm().outerSelect(levels, SkolemType (readType()))
11791179 case SELECTin =>
1180+ // ================================================================================
1181+ // Test Report
1182+ // ================================================================================
1183+
1184+ // 3 suites passed, 1 failed, 4 total
1185+ // tests/pos/avoid.scala failed
1186+ // tests/pos/i5418.scala failed
1187+ // tests/pos/i5980.scala failed
1188+ val srcnme = " ???"
11801189 var symname = readName()
11811190 var precisesig = readName() match
11821191 case SignedName (_, sig, _) => sig
11831192 case _ => Signature .NotAMethod
11841193 val qual = readTerm()
11851194 val qualType = qual.tpe.widenIfUnstable
11861195 val space = if currentAddr == end then qualType else readType()
1187- def selectAmbiguous (name : Name , pre : Type , denot : Denotation ) =
1188- makeSelect(qual, name, denot.asSeenFrom(pre))
11891196 def select (name : Name , sig : Signature , target : Name ) =
1197+ def accessibleDenot (qualType : Type , name : Name , sig : Signature , target : Name ) = {
1198+ val pre = ctx.typeAssigner.maybeSkolemizePrefix(qualType, name)
1199+ val d1 = qualType.findMember(name, pre)
1200+ if ! d1.isOverloaded && ! d1.atSignature(sig, target).symbol.exists then
1201+ // TODO: workaround for refined types
1202+ d1
1203+ else
1204+ val d = space.decl(name).atSignature(sig, target)
1205+ if ! d.symbol.exists then d
1206+ else if d.symbol.isAccessibleFrom(pre) then d.asSeenFrom(pre)
1207+ else space.nonPrivateDecl(name).atSignature(sig, target).asSeenFrom(pre)
1208+ }
11901209 makeSelect(qual, name, accessibleDenot(qualType, name, sig, target))
11911210 val res = symname match
11921211 case SignedName (name, sig, target) =>
11931212 val pre = ctx.typeAssigner.maybeSkolemizePrefix(qualType, name)
11941213 assert(precisesig != Signature .NotAMethod )
11951214 val isAmbiguous = pre.nonPrivateMember(name).match
11961215 case d : MultiDenotation =>
1197- d.atSignature(precisesig , target).isInstanceOf [MultiDenotation ]
1216+ d.atSignature(sig , target).isInstanceOf [MultiDenotation ]
11981217 case _ => false
11991218 if isAmbiguous then
1219+ if ctx.source.name.startsWith(srcnme) then
1220+ val diff = if sig != precisesig then i " $sig => $precisesig" else i " $sig"
1221+ report.error(i " $qual . $name differs ambiguously: [ $diff] " )
12001222 makeSelect(qual, name, space.decl(name).atSignature(sig, target).asSeenFrom(pre))
12011223 else
1202- select(name, precisesig, target)
1224+ if ctx.source.name.startsWith(srcnme) && sig != precisesig then
1225+ report.error(i " $qual . $name differs: [ $sig => $precisesig] " )
1226+ select(name, sig, target)
12031227 case name =>
12041228 select(name, Signature .NotAMethod , EmptyTermName )
12051229 res
0 commit comments