File tree 2 files changed +11
-2
lines changed
compiler/src/dotty/tools/dotc
2 files changed +11
-2
lines changed Original file line number Diff line number Diff line change @@ -246,6 +246,11 @@ object Types {
246
246
case _ => false
247
247
}
248
248
249
+ /** Is this type exactly `Any`, or a type lambda ending in `Any`? */
250
+ def isTopOfSomeKind (using Context ): Boolean = dealias match
251
+ case tp : TypeLambda => tp.resType.isTopOfSomeKind
252
+ case _ => isExactlyAny
253
+
249
254
def isBottomType (using Context ): Boolean =
250
255
if ctx.mode.is(Mode .SafeNulls ) && ! ctx.phase.erasedTypes then hasClassSymbol(defn.NothingClass )
251
256
else isBottomTypeAfterErasure
@@ -4813,7 +4818,7 @@ object Types {
4813
4818
def hasLowerBound (using Context ): Boolean = ! currentEntry.loBound.isExactlyNothing
4814
4819
4815
4820
/** For uninstantiated type variables: Is the upper bound different from Any? */
4816
- def hasUpperBound (using Context ): Boolean = ! currentEntry.hiBound.finalResultType.isExactlyAny
4821
+ def hasUpperBound (using Context ): Boolean = ! currentEntry.hiBound.isTopOfSomeKind
4817
4822
4818
4823
/** Unwrap to instance (if instantiated) or origin (if not), until result
4819
4824
* is no longer a TypeVar
Original file line number Diff line number Diff line change @@ -187,7 +187,11 @@ object Inferencing {
187
187
// else hold off instantiating unbounded unconstrained variable
188
188
else if direction != 0 then
189
189
instantiate(tvar, fromBelow = direction < 0 )
190
- else if variance >= 0 && (force.ifBottom == IfBottom .ok && ! tvar.hasUpperBound || tvar.hasLowerBound) then
190
+ else if variance >= 0 && tvar.hasLowerBound then
191
+ instantiate(tvar, fromBelow = true )
192
+ else if (variance > 0 || variance == 0 && ! tvar.hasUpperBound)
193
+ && force.ifBottom == IfBottom .ok
194
+ then // if variance == 0, prefer upper bound if one is given
191
195
instantiate(tvar, fromBelow = true )
192
196
else if variance >= 0 && force.ifBottom == IfBottom .fail then
193
197
fail = true
You can’t perform that action at this time.
0 commit comments