@@ -652,7 +652,7 @@ object Semantic:
652
652
value.promote(msg)
653
653
value
654
654
655
- def select (field : Symbol , needResolve : Boolean = true ): Contextual [Value ] = log(" select " + field.show + " , this = " + value, printer, (_ : Value ).show) {
655
+ def select (field : Symbol , receiver : Type , needResolve : Boolean = true ): Contextual [Value ] = log(" select " + field.show + " , this = " + value, printer, (_ : Value ).show) {
656
656
if promoted.isCurrentObjectPromoted then Hot
657
657
else value match {
658
658
case Hot =>
@@ -668,13 +668,11 @@ object Semantic:
668
668
if target.is(Flags .Lazy ) then
669
669
val rhs = target.defTree.asInstanceOf [ValDef ].rhs
670
670
eval(rhs, ref, target.owner.asClass, cacheResult = true )
671
- else
671
+ else if target.exists then
672
672
val obj = ref.objekt
673
673
if obj.hasField(target) then
674
674
obj.field(target)
675
675
else if ref.isInstanceOf [Warm ] then
676
- if ! target.exists then
677
- println(" obj.klass = " + obj.klass.show + " , field = " + field.show)
678
676
assert(obj.klass.isSubClass(target.owner))
679
677
if target.is(Flags .ParamAccessor ) then
680
678
// possible for trait parameters
@@ -693,13 +691,21 @@ object Semantic:
693
691
val error = AccessNonInit (target, trace.toVector)
694
692
reporter.report(error)
695
693
Hot
694
+ else
695
+ if ref.klass.isSubClass(receiver.widenSingleton.classSymbol) then
696
+ report.error(" Unexpected resolution failure: ref.klass = " + ref.klass.show + " , field = " + field.show + buildStacktrace(trace.toVector, " \n " ))
697
+ Hot
698
+ else
699
+ // This is possible due to incorrect type cast.
700
+ // See tests/init/pos/Type.scala
701
+ Hot
696
702
697
703
case fun : Fun =>
698
704
report.error(" [Internal error] unexpected tree in selecting a function, fun = " + fun.expr.show, fun.expr)
699
705
Hot
700
706
701
707
case RefSet (refs) =>
702
- refs.map(_.select(field)).join
708
+ refs.map(_.select(field, receiver )).join
703
709
}
704
710
}
705
711
@@ -811,13 +817,21 @@ object Semantic:
811
817
val error = CallUnknown (target, trace.toVector)
812
818
reporter.report(error)
813
819
Hot
814
- else
820
+ else if target.exists then
815
821
// method call resolves to a field
816
822
val obj = ref.objekt
817
823
if obj.hasField(target) then
818
824
obj.field(target)
819
825
else
820
- value.select(target, needResolve = false )
826
+ value.select(target, receiver, needResolve = false )
827
+ else
828
+ if ref.klass.isSubClass(receiver.widenSingleton.classSymbol) then
829
+ report.error(" Unexpected resolution failure: ref.klass = " + ref.klass.show + " , meth = " + meth.show + buildStacktrace(trace.toVector, " \n " ))
830
+ Hot
831
+ else
832
+ // This is possible due to incorrect type cast.
833
+ // See tests/init/pos/Type.scala
834
+ Hot
821
835
822
836
case Fun (body, thisV, klass) =>
823
837
// meth == NoSymbol for poly functions
@@ -1126,12 +1140,12 @@ object Semantic:
1126
1140
if member.is(Flags .Method , butNot = Flags .Accessor ) then
1127
1141
withTrace(Trace .empty) {
1128
1142
val args = member.info.paramInfoss.flatten.map(_ => ArgInfo (Hot , Trace .empty))
1129
- val res = warm.call(member, args, receiver = NoType , superType = NoType )
1143
+ val res = warm.call(member, args, receiver = warm.klass.typeRef , superType = NoType )
1130
1144
res.promote(" Cannot prove that the return value of " + member.show + " is hot. Found = " + res.show + " . " )
1131
1145
}
1132
1146
else
1133
1147
withTrace(Trace .empty) {
1134
- val res = warm.select(member)
1148
+ val res = warm.select(member, receiver = warm.klass.typeRef )
1135
1149
res.promote(" Cannot prove that the field " + member.show + " is hot. Found = " + res.show + " . " )
1136
1150
}
1137
1151
end for
@@ -1346,7 +1360,7 @@ object Semantic:
1346
1360
resolveThis(target, qual, current.asClass)
1347
1361
}
1348
1362
case _ =>
1349
- withTrace(trace2) { qual.select(expr.symbol) }
1363
+ withTrace(trace2) { qual.select(expr.symbol, receiver = qualifier.tpe ) }
1350
1364
1351
1365
case _ : This =>
1352
1366
cases(expr.tpe, thisV, klass)
@@ -1468,7 +1482,7 @@ object Semantic:
1468
1482
thisV.accessLocal(tmref, klass)
1469
1483
1470
1484
case tmref : TermRef =>
1471
- cases(tmref.prefix, thisV, klass).select(tmref.symbol)
1485
+ cases(tmref.prefix, thisV, klass).select(tmref.symbol, receiver = tmref.prefix )
1472
1486
1473
1487
case tp @ ThisType (tref) =>
1474
1488
val cls = tref.classSymbol.asClass
0 commit comments