File tree 4 files changed +44
-10
lines changed
compiler/src/dotty/tools/dotc
4 files changed +44
-10
lines changed Original file line number Diff line number Diff line change @@ -1667,7 +1667,7 @@ object desugar {
1667
1667
AppliedTypeTree (
1668
1668
TypeTree (defn.throwsAlias.typeRef).withSpan(op.span), tpt :: excepts :: Nil )
1669
1669
1670
- private def checkWellFormedTupleElems (elems : List [Tree ])(using Context ): List [Tree ] =
1670
+ def checkWellFormedTupleElems (elems : List [Tree ])(using Context ): List [Tree ] =
1671
1671
val seen = mutable.Set [Name ]()
1672
1672
for case arg @ NamedArg (name, _) <- elems do
1673
1673
if seen.contains(name) then
Original file line number Diff line number Diff line change @@ -208,20 +208,22 @@ object Applications {
208
208
else tp :: Nil
209
209
210
210
private def productUnapplySelectors (tp : Type )(using Context ): Option [List [Type ]] =
211
+ val validatedTupleElements = desugar.checkWellFormedTupleElems(args)
212
+
211
213
if defn.isProductSubType(tp) && args.lengthCompare(productArity(tp)) <= 0 then
212
- tryAdaptPatternArgs(args , tp) match
214
+ tryAdaptPatternArgs(validatedTupleElements , tp) match
213
215
case Some (args1) if isProductMatch(tp, args1.length, pos) =>
214
216
args = args1
215
217
Some (productSelectorTypes(tp, pos))
216
218
case _ => None
217
- else tp.widen.normalized.dealias match
218
- case tp @ defn.NamedTuple (_, tt) =>
219
- tryAdaptPatternArgs(args , tp) match
220
- case Some (args1) =>
221
- args = args1
222
- tt.tupleElementTypes
223
- case _ => None
224
- case _ => None
219
+ else tp.widen.normalized.dealias match
220
+ case tp @ defn.NamedTuple (_, tt) =>
221
+ tryAdaptPatternArgs(validatedTupleElements , tp) match
222
+ case Some (args1) =>
223
+ args = args1
224
+ tt.tupleElementTypes
225
+ case _ => None
226
+ case _ => None
225
227
226
228
/** The computed argument types which will be the scutinees of the sub-patterns. */
227
229
val argTypes : List [Type ] =
Original file line number Diff line number Diff line change
1
+ -- Error: tests/neg/named-tuples-4.scala:10:35 -------------------------------------------------------------------------
2
+ 10 | case PersonCaseClass(name = n, age) => () // error
3
+ | ^^^
4
+ | Illegal combination of named and unnamed tuple elements
5
+ -- Error: tests/neg/named-tuples-4.scala:11:31 -------------------------------------------------------------------------
6
+ 11 | case PersonCaseClass(name, age = a) => () // error
7
+ | ^^^^^^^
8
+ | Illegal combination of named and unnamed tuple elements
9
+ -- Error: tests/neg/named-tuples-4.scala:15:20 -------------------------------------------------------------------------
10
+ 15 | case (name = n, age) => () // error
11
+ | ^^^
12
+ | Illegal combination of named and unnamed tuple elements
13
+ -- Error: tests/neg/named-tuples-4.scala:16:16 -------------------------------------------------------------------------
14
+ 16 | case (name, age = a) => () // error
15
+ | ^^^^^^^
16
+ | Illegal combination of named and unnamed tuple elements
Original file line number Diff line number Diff line change
1
+ import language .experimental .namedTuples
2
+ import scala .annotation .experimental
3
+
4
+ @ experimental object Test :
5
+
6
+ case class PersonCaseClass (name : String , age : Int )
7
+
8
+ val personCaseClass = PersonCaseClass (" Bob" , 33 )
9
+ personCaseClass match
10
+ case PersonCaseClass (name = n, age) => () // error
11
+ case PersonCaseClass (name, age = a) => () // error
12
+
13
+ val person = (name = " Bob" , age = 33 ): (name : String , age : Int )
14
+ person match
15
+ case (name = n, age) => () // error
16
+ case (name, age = a) => () // error
You can’t perform that action at this time.
0 commit comments