Skip to content

Commit d09bfda

Browse files
Allow Tuple.Head and Tuple.Tail to work with EmptyTuple (#17189)
Fixes #17186. I think this is correct behaviour since we already allow things like ```Scala val a = List(1).tail val b = Tuple1(1).tail ```
2 parents 86565a4 + 85dc04b commit d09bfda

File tree

5 files changed

+18
-6
lines changed

5 files changed

+18
-6
lines changed

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

+2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ i9804.scala
2727
i13433.scala
2828
i16649-irrefutable.scala
2929
strict-pattern-bindings-3.0-migration.scala
30+
i17186b.scala
31+
i11982a.scala
3032

3133
# Tree is huge and blows stack for printing Text
3234
i7034.scala

library/src/scala/Tuple.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ object Tuple {
9696
}
9797

9898
/** Type of the head of a tuple */
99-
type Head[X <: NonEmptyTuple] = X match {
99+
type Head[X <: Tuple] = X match {
100100
case x *: _ => x
101101
}
102102

@@ -108,7 +108,7 @@ object Tuple {
108108
}
109109

110110
/** Type of the tail of a tuple */
111-
type Tail[X <: NonEmptyTuple] <: Tuple = X match {
111+
type Tail[X <: Tuple] <: Tuple = X match {
112112
case _ *: xs => xs
113113
}
114114

tests/neg/i11982a.scala renamed to tests/pos/i11982a.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ object Unpair {
66

77
def unpair[X <: Tuple2[?, ?]](
88
using a: ValueOf[Tuple.Head[X]],
9-
b: ValueOf[Tuple.Head[Tuple.Tail[X]]] // error
10-
): Tuple2[Tuple.Head[X], Tuple.Head[Tuple.Tail[X]]] = // error
9+
b: ValueOf[Tuple.Head[Tuple.Tail[X]]]
10+
): Tuple2[Tuple.Head[X], Tuple.Head[Tuple.Tail[X]]] =
1111
type AA = Tuple.Head[X]
12-
type BB = Tuple.Head[Tuple.Tail[X]] // error
12+
type BB = Tuple.Head[Tuple.Tail[X]]
1313
pair[AA, BB](using a, b)
14-
}
14+
}

tests/pos/i17186a.scala

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
type second[X <: Tuple2[Any, Any]] = Tuple.Head[Tuple.Tail[X]]
2+
type middle[X <: Tuple3[Any, Any, Any]] = Tuple.Head[Tuple.Tail[X]]
3+
4+
val a: Tuple.Head[Tuple.Tail[Tuple2[Int, String]]] = ???
5+
val b: Tuple.Head[Tuple.Tail[Tuple3[Int, String, Boolean]]] = ???

tests/pos/i17186b.scala

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
type SecondOfTwo[X <: Tuple2[Any, Any]] = Tuple.Head[Tuple.Tail[X]]
2+
val a = implicitly[SecondOfTwo[Tuple2[Int, String]] =:= String]
3+
4+
type LastOfThree[X <: Tuple3[Any, Any, Any]] = Tuple.Tail[Tuple.Tail[X]]
5+
val b = implicitly[LastOfThree[Tuple3[Int, String, Boolean]] =:= Tuple1[Boolean]]

0 commit comments

Comments
 (0)