File tree Expand file tree Collapse file tree 4 files changed +102
-0
lines changed
compiler/src/dotty/tools/dotc/typer Expand file tree Collapse file tree 4 files changed +102
-0
lines changed Original file line number Diff line number Diff line change @@ -3854,6 +3854,12 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
38543854 gadts.println(i " Member selection healed by GADT approximation " )
38553855 tree.cast(gadtApprox)
38563856 else tree
3857+ else if tree.tpe.derivesFrom(defn.PairClass ) && ! defn.isTupleNType(tree.tpe.widenDealias) then
3858+ // If this is a generic tuple we need to cast it to make the TupleN/ members accessible.
3859+ // This only works for generic tuples of know size up to 22.
3860+ defn.tupleTypes(tree.tpe.widenTermRefExpr, Definitions .MaxTupleArity ) match
3861+ case Some (elems) => tree.cast(defn.tupleType(elems))
3862+ case None => tree
38573863 else tree // other adaptations for selections are handled in typedSelect
38583864 case _ if ctx.mode.is(Mode .ImplicitsEnabled ) && tree.tpe.isValueType =>
38593865 checkConversionsSpecific(pt, tree.srcPos)
Original file line number Diff line number Diff line change 1+ def Test : Unit =
2+ val tup1 = 1 *: EmptyTuple
3+ val tup2 = 1 *: 2 *: EmptyTuple
4+ val tup3 = 1 *: 2 *: 3 *: EmptyTuple
5+ val tup4 = 1 *: 2 *: 3 *: 4 *: EmptyTuple
6+ val tup5 = 1 *: 2 *: 3 *: 4 *: 5 *: EmptyTuple
7+ val tup22 = 1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: 20 *: 21 *: 22 *: EmptyTuple
8+ val tup23 = 1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: 20 *: 21 *: 22 *: 23 *: EmptyTuple
9+
10+ tup1._2 // error
11+
12+ tup2._3 // error
13+
14+ tup22._23 // error
15+
16+ tup23._1 // error
17+ tup23._2 // error
18+ tup23._3 // error
19+ tup23._4 // error
20+ tup23._5 // error
21+ tup23._6 // error
22+ tup23._7 // error
23+ tup23._8 // error
24+ tup23._9 // error
25+ tup23._10 // error
26+ tup23._11 // error
27+ tup23._12 // error
28+ tup23._13 // error
29+ tup23._14 // error
30+ tup23._15 // error
31+ tup23._16 // error
32+ tup23._17 // error
33+ tup23._18 // error
34+ tup23._19 // error
35+ tup23._20 // error
36+ tup23._21 // error
37+ tup23._22 // error
38+ tup23._23 // error
Original file line number Diff line number Diff line change 1+
2+ @ main def Test : Unit =
3+ val tup1 = 1 *: EmptyTuple
4+ val tup2 = 1 *: 2 *: EmptyTuple
5+ val tup3 = 1 *: 2 *: 3 *: EmptyTuple
6+ val tup4 = 1 *: 2 *: 3 *: 4 *: EmptyTuple
7+ val tup5 = 1 *: 2 *: 3 *: 4 *: 5 *: EmptyTuple
8+ val tup22 = 1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: 20 *: 21 *: 22 *: EmptyTuple
9+
10+ tup1._1
11+
12+ tup2._1
13+ tup2._2
14+ tup2.swap
15+
16+ tup3._1
17+ tup3._2
18+ tup3._3
19+
20+ tup4._1
21+ tup4._2
22+ tup4._3
23+ tup4._4
24+
25+ tup22._1
26+ tup22._2
27+ tup22._3
28+ tup22._4
29+ tup22._5
30+ tup22._6
31+ tup22._7
32+ tup22._8
33+ tup22._9
34+ tup22._10
35+ tup22._11
36+ tup22._12
37+ tup22._13
38+ tup22._14
39+ tup22._15
40+ tup22._16
41+ tup22._17
42+ tup22._18
43+ tup22._19
44+ tup22._20
45+ tup22._21
46+ tup22._22
Original file line number Diff line number Diff line change 1+ def f [T <: Tuple2 [Int , Int ]](tup : T ): T = tup
2+
3+ @ main def Test : Unit =
4+ (1 , 2 )._1
5+ f((1 , 2 ))._1
6+
7+ (1 *: 2 *: EmptyTuple )._1
8+ f(1 *: 2 *: EmptyTuple )._1
9+ f[Int *: Int *: EmptyTuple ](1 *: 2 *: EmptyTuple )._1
10+
11+ f[Int *: Int *: EmptyTuple ]((1 , 2 ))._1
12+ f[Tuple2 [Int , Int ]](1 *: 2 *: EmptyTuple )._1
You can’t perform that action at this time.
0 commit comments