@@ -652,7 +652,7 @@ object Semantic:
652652 value.promote(msg)
653653 value
654654
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) {
656656 if promoted.isCurrentObjectPromoted then Hot
657657 else value match {
658658 case Hot =>
@@ -668,13 +668,11 @@ object Semantic:
668668 if target.is(Flags .Lazy ) then
669669 val rhs = target.defTree.asInstanceOf [ValDef ].rhs
670670 eval(rhs, ref, target.owner.asClass, cacheResult = true )
671- else
671+ else if target.exists then
672672 val obj = ref.objekt
673673 if obj.hasField(target) then
674674 obj.field(target)
675675 else if ref.isInstanceOf [Warm ] then
676- if ! target.exists then
677- println(" obj.klass = " + obj.klass.show + " , field = " + field.show)
678676 assert(obj.klass.isSubClass(target.owner))
679677 if target.is(Flags .ParamAccessor ) then
680678 // possible for trait parameters
@@ -693,13 +691,21 @@ object Semantic:
693691 val error = AccessNonInit (target, trace.toVector)
694692 reporter.report(error)
695693 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
696702
697703 case fun : Fun =>
698704 report.error(" [Internal error] unexpected tree in selecting a function, fun = " + fun.expr.show, fun.expr)
699705 Hot
700706
701707 case RefSet (refs) =>
702- refs.map(_.select(field)).join
708+ refs.map(_.select(field, receiver )).join
703709 }
704710 }
705711
@@ -811,13 +817,21 @@ object Semantic:
811817 val error = CallUnknown (target, trace.toVector)
812818 reporter.report(error)
813819 Hot
814- else
820+ else if target.exists then
815821 // method call resolves to a field
816822 val obj = ref.objekt
817823 if obj.hasField(target) then
818824 obj.field(target)
819825 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
821835
822836 case Fun (body, thisV, klass) =>
823837 // meth == NoSymbol for poly functions
@@ -1126,12 +1140,12 @@ object Semantic:
11261140 if member.is(Flags .Method , butNot = Flags .Accessor ) then
11271141 withTrace(Trace .empty) {
11281142 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 )
11301144 res.promote(" Cannot prove that the return value of " + member.show + " is hot. Found = " + res.show + " . " )
11311145 }
11321146 else
11331147 withTrace(Trace .empty) {
1134- val res = warm.select(member)
1148+ val res = warm.select(member, receiver = warm.klass.typeRef )
11351149 res.promote(" Cannot prove that the field " + member.show + " is hot. Found = " + res.show + " . " )
11361150 }
11371151 end for
@@ -1346,7 +1360,7 @@ object Semantic:
13461360 resolveThis(target, qual, current.asClass)
13471361 }
13481362 case _ =>
1349- withTrace(trace2) { qual.select(expr.symbol) }
1363+ withTrace(trace2) { qual.select(expr.symbol, receiver = qualifier.tpe ) }
13501364
13511365 case _ : This =>
13521366 cases(expr.tpe, thisV, klass)
@@ -1468,7 +1482,7 @@ object Semantic:
14681482 thisV.accessLocal(tmref, klass)
14691483
14701484 case tmref : TermRef =>
1471- cases(tmref.prefix, thisV, klass).select(tmref.symbol)
1485+ cases(tmref.prefix, thisV, klass).select(tmref.symbol, receiver = tmref.prefix )
14721486
14731487 case tp @ ThisType (tref) =>
14741488 val cls = tref.classSymbol.asClass
0 commit comments