Skip to content

Commit 7db38bf

Browse files
committed
Fix #5833: Refine condition what constitutes an IFT in adapt
1 parent 537f80d commit 7db38bf

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2551,9 +2551,17 @@ class Typer extends Namer
25512551
missingArgs(wtp)
25522552
}
25532553

2554+
def isImplicitFunctionRef(wtp: Type): Boolean = wtp match {
2555+
case RefinedType(parent, nme.apply, _) =>
2556+
isImplicitFunctionRef(parent) // apply refinements indicate a dependent IFT
2557+
case _ =>
2558+
val underlying = wtp.underlyingClassRef(refinementOK = false) // other refinements are not OK
2559+
defn.isImplicitFunctionClass(underlying.classSymbol)
2560+
}
2561+
25542562
def adaptNoArgsOther(wtp: Type): Tree = {
25552563
ctx.typeComparer.GADTused = false
2556-
if (defn.isImplicitFunctionClass(wtp.underlyingClassRef(refinementOK = false).classSymbol) &&
2564+
if (isImplicitFunctionRef(wtp) &&
25572565
!untpd.isContextualClosure(tree) &&
25582566
!isApplyProto(pt) &&
25592567
!ctx.mode.is(Mode.Pattern) &&

tests/pos/i5833.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
object Dependent{
2+
def x: given (i: Int) => Int = ???
3+
def y: given (i: Int) => Int = x
4+
}
5+
object Independent{
6+
def x: given Int => Int = ???
7+
def y: given Int => Int = x
8+
}
9+
object NarrowDependent{
10+
def x: given Int => Int = ???
11+
def y: given (i: Int) => Int = x
12+
}
13+
object WidenDependent{
14+
def x: given (i: Int) => Int = ???
15+
def y: given Int => Int = x
16+
}

0 commit comments

Comments
 (0)