@@ -3470,12 +3470,11 @@ class Typer extends Namer
34703470 }
34713471 }
34723472
3473- def tryUnsafeNullConver (fail : => Tree ): Tree =
3473+ def tryUnsafeNullConver (fail : => Tree )( using Context ) : Tree =
34743474 // If explicitNulls and unsafeNulls are enabled, and
3475- if ctx.explicitNulls && config.Feature .enabled(nme.unsafeNulls) &&
3476- tree.tpe.isUnsafeConvertable(pt) then {
3477- tree.cast(pt)
3478- }
3475+ if ctx.mode.is(Mode .UnsafeNullConversion ) && pt.isValueType &&
3476+ tree.tpe.isUnsafeConvertable(pt)
3477+ then tree.cast(pt)
34793478 else fail
34803479
34813480 def cannotFind (failure : SearchFailure ) =
@@ -3488,21 +3487,31 @@ class Typer extends Namer
34883487 tree
34893488 else recover(failure.reason)
34903489
3491- if ctx.mode.is(Mode .ImplicitsEnabled ) && tree.typeOpt.isValueType then
3492- if pt.isRef(defn.AnyValClass ) || pt.isRef(defn.ObjectClass ) then
3493- ctx.error(em " the result of an implicit conversion must be more specific than $pt" , tree.sourcePos)
3494- val searchCtx = if config.Feature .enabled(nme.unsafeNulls)
3495- then ctx.addMode(Mode .UnsafeNullConversion )
3496- else ctx
3497- tree.tpe match {
3498- case OrNull (tpe1) if ctx.explicitNulls && config.Feature .enabled(nme.unsafeNulls) =>
3499- searchTree(tree.cast(tpe1)) { _ =>
3500- searchTree(tree)(failure => tryUnsafeNullConver(cannotFind(failure)))(using searchCtx)
3501- }(using searchCtx)
3502- case _ =>
3503- searchTree(tree)(failure => tryUnsafeNullConver(cannotFind(failure)))(using searchCtx)
3504- }
3505- else tryUnsafeNullConver(recover(NoMatchingImplicits ))
3490+ def process (using Context ): Tree = {
3491+ if ctx.mode.is(Mode .ImplicitsEnabled ) && tree.typeOpt.isValueType then
3492+ if pt.isRef(defn.AnyValClass ) || pt.isRef(defn.ObjectClass ) then
3493+ ctx.error(em " the result of an implicit conversion must be more specific than $pt" , tree.sourcePos)
3494+ tree.tpe match {
3495+ case OrNull (tpe1) if ctx.explicitNulls && config.Feature .enabled(nme.unsafeNulls) =>
3496+ searchTree(tree.cast(tpe1)) { _ =>
3497+ searchTree(tree)(failure => tryUnsafeNullConver(cannotFind(failure)))
3498+ }
3499+ case _ =>
3500+ searchTree(tree)(failure => tryUnsafeNullConver(cannotFind(failure)))
3501+ }
3502+ else tryUnsafeNullConver(recover(NoMatchingImplicits ))
3503+ }
3504+
3505+ val javaCompatibleCall = ctx.explicitNullsJavaCompatible && (tree match {
3506+ case Apply (_, _) => tree.symbol.is(JavaDefined )
3507+ case _ => false
3508+ })
3509+ val searchCtx =
3510+ if ctx.explicitNulls && (javaCompatibleCall || config.Feature .enabled(nme.unsafeNulls)) then
3511+ ctx.addMode(Mode .UnsafeNullConversion )
3512+ else ctx
3513+
3514+ process(using searchCtx)
35063515 }
35073516
35083517 def adaptType (tp : Type ): Tree = {
0 commit comments