Skip to content

Commit 180b4eb

Browse files
committed
Check for mismatched argument type length in PatternMatcher due to Named-Tuple :* syntax
1 parent 00d19df commit 180b4eb

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,14 @@ object PatternMatcher {
267267
def matchArgsPatternPlan(args: List[Tree], syms: List[Symbol]): Plan =
268268
args match {
269269
case arg :: args1 =>
270-
val sym :: syms1 = syms: @unchecked
271-
patternPlan(sym, arg, matchArgsPatternPlan(args1, syms1))
270+
if (args.length != syms.length)
271+
report.error(UnapplyInvalidNumberOfArguments(tree, tree.tpe :: Nil), arg.srcPos)
272+
// Generate a throwaway but type-correct plan.
273+
// This plan will never execute because it'll be guarded by a `NonNullTest`.
274+
ResultPlan(tpd.Throw(tpd.nullLiteral))
275+
else
276+
val sym :: syms1 = syms: @unchecked
277+
patternPlan(sym, arg, matchArgsPatternPlan(args1, syms1))
272278
case Nil =>
273279
assert(syms.isEmpty)
274280
onSuccess

tests/neg/i23155a.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import scala.NamedTuple
2+
object Unpack_NT {
3+
(1, 2) match {
4+
case Unpack_NT(first, _) => first // error
5+
}
6+
def unapply(e: (Int, Int)): Some[NamedTuple.NamedTuple["x" *: "y" *: EmptyTuple, Int *: Int *: EmptyTuple]] = ???
7+
}

tests/neg/i23155b.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
object Unpack_T {
2+
(1, 2) match {
3+
case Unpack_T(first, _) => first // error
4+
}
5+
def unapply(e: (Int, Int)): Some[Int *: Int *: EmptyTuple] = ???
6+
}

0 commit comments

Comments
 (0)