Skip to content

Commit ab8ee53

Browse files
committed
mergeDenot should prefer concerete over deferred.
Previously it did this only sometimes. Now it always prefers concrete over deferred unless the deferred info is a proper subtype of the concrete info.
1 parent 472d711 commit ab8ee53

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

src/dotty/tools/dotc/core/Denotations.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,13 +231,16 @@ object Denotations {
231231
else if (denot1.signature matches denot2.signature) {
232232
val info1 = denot1.info
233233
val info2 = denot2.info
234+
val sym1 = denot1.symbol
234235
val sym2 = denot2.symbol
235236
val sym2Accessible = sym2.isAccessibleFrom(pre)
236-
if (sym2Accessible && info2 <:< info1) denot2
237+
def prefer(info1: Type, sym1: Symbol, info2: Type, sym2: Symbol) =
238+
info1 <:< info2 &&
239+
(sym1.isAsConcrete(sym2) || !(info2 <:< info1))
240+
if (sym2Accessible && prefer(info2, sym2, info1, sym1)) denot2
237241
else {
238-
val sym1 = denot1.symbol
239242
val sym1Accessible = sym1.isAccessibleFrom(pre)
240-
if (sym1Accessible && info1 <:< info2) denot1
243+
if (sym1Accessible && prefer(info1, sym1, info2, sym2)) denot1
241244
else if (sym1Accessible && sym2.exists && !sym2Accessible) denot1
242245
else if (sym2Accessible && sym1.exists && !sym1Accessible) denot2
243246
else {

0 commit comments

Comments
 (0)