Skip to content

Commit 15ea35b

Browse files
authored
Fix #20512: Try implicit searching after finding dynamic select (#22318)
Fix #20512
2 parents dc0bb59 + 200548e commit 15ea35b

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -852,11 +852,11 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
852852
else EmptyTree
853853

854854
def dynamicSelect(pt: Type) =
855-
val tree2 = cpy.Select(tree0)(untpd.TypedSplice(qual), selName)
856-
if pt.isInstanceOf[FunOrPolyProto] || pt == LhsProto then
857-
assignType(tree2, TryDynamicCallType)
858-
else
859-
typedDynamicSelect(tree2, Nil, pt)
855+
val tree2 = cpy.Select(tree0)(untpd.TypedSplice(qual), selName)
856+
if pt.isInstanceOf[FunOrPolyProto] || pt == LhsProto then
857+
assignType(tree2, TryDynamicCallType)
858+
else
859+
typedDynamicSelect(tree2, Nil, pt)
860860

861861
// Otherwise, if the qualifier derives from class Dynamic, expand to a
862862
// dynamic dispatch using selectDynamic or applyDynamic
@@ -885,7 +885,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
885885
// Reject corner case where selectDynamic needs annother selectDynamic to be called. E.g. as in neg/unselectable-fields.scala.
886886
report.error(i"Cannot use selectDynamic here since it needs another selectDynamic to be invoked", tree.srcPos)
887887
case _ =>
888-
dynSelected.ensureConforms(fieldType)
888+
adapt(dynSelected, defn.AnyType).ensureConforms(fieldType)
889889
case _ => EmptyTree
890890
else EmptyTree
891891

compiler/test/dotc/pos-test-pickling.blacklist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ i18211.scala
7070
10867.scala
7171
named-tuples1.scala
7272
i20897.scala
73+
i20512.scala
7374

7475
# Opaque type
7576
i5720.scala

tests/pos/i20512.scala

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import language.experimental.namedTuples
2+
3+
import NamedTuple.*
4+
5+
trait Selector1 extends Selectable {
6+
type Fields = (int: Int, str: String)
7+
8+
def selectDynamic(name: String)(using name.type <:< Tuple.Union[NamedTuple.Names[Fields]]) = ???
9+
}
10+
11+
def test20512 = {
12+
val s: Selector1 = new Selector1 {}
13+
val int = s.int
14+
val str = s.str
15+
}
16+
17+
trait Ctx
18+
19+
class Selector2 extends Selectable:
20+
type Fields = (bar: Int, baz: Int)
21+
def selectDynamic(fieldName: String)(using Ctx): Any = ???
22+
23+
def test22023(using Ctx) =
24+
val f = Selector2()
25+
val bar = f.bar
26+
val baz = f.baz

0 commit comments

Comments
 (0)