-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Make overload pruning based on result types less aggressive #21744
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2076,16 +2076,27 @@ trait Applications extends Compatibility { | |
def resolveOverloaded(alts: List[TermRef], pt: Type)(using Context): List[TermRef] = | ||
record("resolveOverloaded") | ||
|
||
/** Is `alt` a method or polytype whose result type after the first value parameter | ||
/** Is `alt` a method or polytype whose approximated result type after the first value parameter | ||
* section conforms to the expected type `resultType`? If `resultType` | ||
* is a `IgnoredProto`, pick the underlying type instead. | ||
* | ||
* Using an approximated result types is necessary to avoid false negatives | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Your grammar as right the first time, either "approximated result types" or "an approximated result type" |
||
* due to incomplete type inference such as in tests/pos/i21410.scala and tests/pos/i21410b.scala. | ||
*/ | ||
def resultConforms(altSym: Symbol, altType: Type, resultType: Type)(using Context): Boolean = | ||
resultType.revealIgnored match { | ||
case resultType: ValueType => | ||
altType.widen match { | ||
case tp: PolyType => resultConforms(altSym, instantiateWithTypeVars(tp), resultType) | ||
case tp: MethodType => constrainResult(altSym, tp.resultType, resultType) | ||
case tp: PolyType => resultConforms(altSym, tp.resultType, resultType) | ||
case tp: MethodType => | ||
val wildRes = wildApprox(tp.resultType) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's :cough: wild that |
||
|
||
class ResultApprox extends AvoidWildcardsMap: | ||
// Avoid false negatives by approximating to a lower bound | ||
variance = -1 | ||
|
||
val approx = ResultApprox()(wildRes) | ||
constrainResult(altSym, approx, resultType) | ||
case _ => true | ||
} | ||
case _ => true | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
class A | ||
object Test: | ||
type F[X] <: Any = X match | ||
case A => Int | ||
|
||
def foo[T](x: String): T = ??? | ||
def foo[U](x: U): F[U] = ??? | ||
|
||
val x1 = foo(A()) | ||
val y: Int = x1 | ||
|
||
val x2: Int = foo(A()) // error |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
object Test: | ||
def foo[T](x: Option[T]): T = ??? | ||
def foo[T <: Tuple](x: T): Tuple.Map[T, List] = ??? | ||
|
||
val tup: (Int, String) = (1, "") | ||
|
||
val x = foo(tup) | ||
val y: (List[Int], List[String]) = x | ||
|
||
val x2: (List[Int], List[String]) = foo(tup) // error |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
class AppliedPIso[A, B]() | ||
case class User(age: Int) | ||
|
||
object Test: | ||
extension [From, To](from: From) | ||
def focus(): AppliedPIso[From, From] = ??? | ||
transparent inline def focus(inline lambda: (From => To)): Any = ??? | ||
|
||
|
||
val u = User(1) | ||
val ap: AppliedPIso[User, User] = u.focus(_.age) // error |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does being mapped imply
hasAnnotation(defn.BodyAnnot)
? Why not make the symbol copying inresolveMapped
copy the annotations too? Or (and I'm not sure if this is possible) add a backreference from theMappedAlternativeAnnot
symbol to the original?