@@ -1177,29 +1177,53 @@ class TreeUnpickler(reader: TastyReader,
1177
1177
val levels = readNat()
1178
1178
readTerm().outerSelect(levels, SkolemType (readType()))
1179
1179
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 = " ???"
1180
1189
var symname = readName()
1181
1190
var precisesig = readName() match
1182
1191
case SignedName (_, sig, _) => sig
1183
1192
case _ => Signature .NotAMethod
1184
1193
val qual = readTerm()
1185
1194
val qualType = qual.tpe.widenIfUnstable
1186
1195
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))
1189
1196
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
+ }
1190
1209
makeSelect(qual, name, accessibleDenot(qualType, name, sig, target))
1191
1210
val res = symname match
1192
1211
case SignedName (name, sig, target) =>
1193
1212
val pre = ctx.typeAssigner.maybeSkolemizePrefix(qualType, name)
1194
1213
assert(precisesig != Signature .NotAMethod )
1195
1214
val isAmbiguous = pre.nonPrivateMember(name).match
1196
1215
case d : MultiDenotation =>
1197
- d.atSignature(precisesig , target).isInstanceOf [MultiDenotation ]
1216
+ d.atSignature(sig , target).isInstanceOf [MultiDenotation ]
1198
1217
case _ => false
1199
1218
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] " )
1200
1222
makeSelect(qual, name, space.decl(name).atSignature(sig, target).asSeenFrom(pre))
1201
1223
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)
1203
1227
case name =>
1204
1228
select(name, Signature .NotAMethod , EmptyTermName )
1205
1229
res
0 commit comments