diff --git a/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala b/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala index e2505144abda..0f6646028790 100644 --- a/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala +++ b/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala @@ -267,8 +267,14 @@ object PatternMatcher { def matchArgsPatternPlan(args: List[Tree], syms: List[Symbol]): Plan = args match { case arg :: args1 => - val sym :: syms1 = syms: @unchecked - patternPlan(sym, arg, matchArgsPatternPlan(args1, syms1)) + if (args.length != syms.length) + report.error(UnapplyInvalidNumberOfArguments(tree, tree.tpe :: Nil), arg.srcPos) + // Generate a throwaway but type-correct plan. + // This plan will never execute because it'll be guarded by a `NonNullTest`. + ResultPlan(tpd.Throw(tpd.nullLiteral)) + else + val sym :: syms1 = syms: @unchecked + patternPlan(sym, arg, matchArgsPatternPlan(args1, syms1)) case Nil => assert(syms.isEmpty) onSuccess diff --git a/tests/neg/i23155a.scala b/tests/neg/i23155a.scala new file mode 100644 index 000000000000..ac48bbf298e0 --- /dev/null +++ b/tests/neg/i23155a.scala @@ -0,0 +1,7 @@ +import scala.NamedTuple +object Unpack_NT { + (1, 2) match { + case Unpack_NT(first, _) => first // error + } + def unapply(e: (Int, Int)): Some[NamedTuple.NamedTuple["x" *: "y" *: EmptyTuple, Int *: Int *: EmptyTuple]] = ??? +} diff --git a/tests/neg/i23155b.scala b/tests/neg/i23155b.scala new file mode 100644 index 000000000000..ef35f4631983 --- /dev/null +++ b/tests/neg/i23155b.scala @@ -0,0 +1,6 @@ +object Unpack_T { + (1, 2) match { + case Unpack_T(first, _) => first // error + } + def unapply(e: (Int, Int)): Some[Int *: Int *: EmptyTuple] = ??? +}