Skip to content

Commit ac47299

Browse files
authored
Call dealias after stripping type variables for tupleElementTypesUpTo (#23005)
Fixes [#22643](#22643) and [#22645](#22645).
2 parents 2d034c2 + fbaca4c commit ac47299

File tree

5 files changed

+106
-1
lines changed

5 files changed

+106
-1
lines changed

Diff for: compiler/src/dotty/tools/dotc/core/TypeUtils.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class TypeUtils:
6868
def tupleElementTypesUpTo(bound: Int, normalize: Boolean = true)(using Context): Option[List[Type]] =
6969
def recur(tp: Type, bound: Int): Option[List[Type]] =
7070
if bound < 0 then Some(Nil)
71-
else (if normalize then tp.normalized else tp).dealias match
71+
else (if normalize then tp.dealias.normalized else tp).dealias match
7272
case AppliedType(tycon, hd :: tl :: Nil) if tycon.isRef(defn.PairClass) =>
7373
recur(tl, bound - 1).map(hd :: _)
7474
case tp: AppliedType if defn.isTupleNType(tp) && normalize =>

Diff for: compiler/test/dotc/pos-test-pickling.excludelist

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ i18211.scala
7171
named-tuples1.scala
7272
i20897.scala
7373
i20512.scala
74+
i22645b.scala
7475

7576
# Opaque type
7677
i5720.scala

Diff for: tests/pos/i22643.scala

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import language.experimental.namedTuples
2+
3+
4+
5+
object ExhibitB:
6+
7+
trait JoinB[A <: Tuple, B <: Tuple]:
8+
type NTB = NamedTuple.NamedTuple[Tuple.Concat[A, B], (String, Int)]
9+
val ntB: NTB = ???
10+
11+
val joinB: JoinB[Tuple1["nameB"], Tuple1["ageB"]] = ???
12+
13+
joinB.ntB.nameB // works
14+
15+
16+
object ExhibitC:
17+
18+
type A = Tuple1["nameC"]
19+
type B = Tuple1["ageC"]
20+
21+
type NamesC = Tuple.Concat[A, B]
22+
type NTC = NamedTuple.NamedTuple[NamesC, (String, Int)]
23+
val ntC: NTC = ???
24+
25+
ntC.nameC // works
26+
27+
28+
object ExhibitD:
29+
30+
trait JoinD[A, B]:
31+
type NamesD = (A, B)
32+
type NTD = NamedTuple.NamedTuple[NamesD, (String, Int)]
33+
val ntD: NTD = ???
34+
35+
val joinD: JoinD["nameD", "ageD"] = ???
36+
37+
joinD.ntD.nameD // works
38+
39+
object ExhibitA:
40+
41+
trait JoinA[A <: Tuple, B <: Tuple]:
42+
type NamesA = Tuple.Concat[A, B]
43+
type NTA = NamedTuple.NamedTuple[NamesA, (String, Int)]
44+
val ntA: NTA = ???
45+
46+
val joinA: JoinA[Tuple1["nameA"], Tuple1["ageA"]] = ???
47+
48+
joinA.ntA.nameA // fixed

Diff for: tests/pos/i22645a.scala

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import language.experimental.namedTuples
2+
object ExhibitA: // fails
3+
4+
class SelectableNT[N <: Tuple] extends Selectable:
5+
def selectDynamic(name: String) = ???
6+
type Names = Tuple.Map[N, [X] =>> X]
7+
type Fields = NamedTuple.NamedTuple[Names, (String, Int)]
8+
9+
val x = new SelectableNT[("name", "age")]
10+
x.name // fails
11+
12+
13+
object ExhibitB: // works
14+
15+
class SelectableNT[N <: Tuple] extends Selectable:
16+
def selectDynamic(name: String) = ???
17+
type Fields = NamedTuple.NamedTuple[N, (String, Int)]
18+
19+
val x = new SelectableNT[("name", "age")]
20+
x.name
21+
22+
23+
object ExhibitC: // works
24+
25+
class SelectableNT[N <: Tuple] extends Selectable:
26+
def selectDynamic(name: String) = ???
27+
type Fields = NamedTuple.NamedTuple[N, (String, Int)]
28+
29+
type N = ("name", "age")
30+
val x = new SelectableNT[N]
31+
x.name
32+
33+
34+
object ExhibitD: // works
35+
36+
class SelectableNT[N <: Tuple] extends Selectable:
37+
def selectDynamic(name: String) = ???
38+
type Fields = NamedTuple.NamedTuple[N, (String, Int)]
39+
40+
type N = ("name", "age")
41+
type Names = Tuple.Map[N, [X] =>> X]
42+
val x = new SelectableNT[Names]
43+
x.name
44+

Diff for: tests/pos/i22645b.scala

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import language.experimental.namedTuples
2+
object ExhibitE: // works
3+
4+
type N = ("name", "age")
5+
type Names = Tuple.Map[N, [X] =>> X]
6+
7+
class SelectableNT extends Selectable:
8+
def selectDynamic(name: String) = ???
9+
type Fields = NamedTuple.NamedTuple[Names, (String, Int)]
10+
11+
val x = new SelectableNT
12+
x.name

0 commit comments

Comments
 (0)