Skip to content

Commit 872082e

Browse files
committed
Fix problem with extension methods in givens
For these we need an eligibility pre-check. That pre-check did not skip leading implicit parameters, so failed to recognize eligible extension methods.
1 parent 5cd3a3a commit 872082e

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

compiler/src/dotty/tools/dotc/typer/Applications.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1363,7 +1363,10 @@ trait Applications extends Compatibility {
13631363
*/
13641364
def hasExtensionMethodNamed(tp: Type, xname: TermName, argType: Type, resultType: Type)(using Context) = {
13651365
def qualifies(mbr: Denotation) =
1366-
mbr.exists && isApplicableType(tp.select(xname, mbr), argType :: Nil, resultType)
1366+
mbr.exists
1367+
&& isApplicableType(
1368+
normalize(tp.select(xname, mbr), WildcardType),
1369+
argType :: Nil, resultType)
13671370
tp.memberBasedOnFlags(xname, required = ExtensionMethod) match {
13681371
case mbr: SingleDenotation => qualifies(mbr)
13691372
case mbr => mbr.hasAltWith(qualifies(_))

tests/pos/i9530.scala

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
trait Food
2+
case class Banana(color: String) extends Food
3+
4+
trait Diet[A <: Animal]:
5+
type F <: Food
6+
def food: Seq[F]
7+
8+
trait Animal
9+
object Animal:
10+
extension [A <: Animal](using diet: Diet[A])(animal: A) def food1 = diet.food
11+
extension [A <: Animal](animal: A)(using diet: Diet[A]) def food2 = diet.food
12+
13+
extension [A <: Animal](using diet: Diet[A])(animal: A) def food3 = diet.food
14+
extension [A <: Animal](animal: A)(using diet: Diet[A]) def food4 = diet.food
15+
16+
trait Monkey extends Animal
17+
18+
given Diet[Monkey] with
19+
type F = Banana
20+
def food: Seq[Banana] = Seq(new Banana("yellow"), Banana("green"))
21+
22+
trait FoodOps
23+
given FoodOps with
24+
extension [A <: Animal](using diet: Diet[A])(animal: A) def food5 = diet.food
25+
extension [A <: Animal](animal: A)(using diet: Diet[A]) def food6 = diet.food
26+
27+
28+
val monkey = new Monkey {}
29+
30+
val foods = Seq(
31+
monkey.food1, // doesn't compile
32+
monkey.food2, // compiles
33+
monkey.food3, // compiles
34+
monkey.food4, // compiles
35+
monkey.food5, // doesn't compile
36+
monkey.food6, // compiles
37+
)

0 commit comments

Comments
 (0)