File tree Expand file tree Collapse file tree 4 files changed +16
-13
lines changed
compiler/src/dotty/tools/dotc Expand file tree Collapse file tree 4 files changed +16
-13
lines changed Original file line number Diff line number Diff line change @@ -1762,13 +1762,14 @@ object desugar {
1762
1762
def adaptPatternArgs (elems : List [Tree ], pt : Type )(using Context ): List [Tree ] =
1763
1763
1764
1764
def reorderedNamedArgs (wildcardSpan : Span ): List [untpd.Tree ] =
1765
- var selNames = pt.namedTupleElementTypes(false ).map(_(0 ))
1766
- if selNames.isEmpty && pt.classSymbol.is(CaseClass ) then
1767
- selNames = pt.classSymbol.caseAccessors.map(_.name.asTermName)
1768
- if selNames.isEmpty then {
1769
- report.error(NamedElementsNotDefined (pt), elems.head.srcPos)
1765
+ val isCaseClass = pt.classSymbol.is(CaseClass ) && ! defn.isTupleClass(pt.classSymbol)
1766
+ if ! pt.isNamedTupleType && ! isCaseClass then
1767
+ report.error(NamedPatternNotApplicable (pt), elems.head.srcPos)
1770
1768
Nil
1771
- } else {
1769
+ else
1770
+ var selNames = pt.namedTupleElementTypes(false ).map(_(0 ))
1771
+ if selNames.isEmpty && isCaseClass then
1772
+ selNames = pt.classSymbol.caseAccessors.map(_.name.asTermName)
1772
1773
val nameToIdx = selNames.zipWithIndex.toMap
1773
1774
val reordered = Array .fill[untpd.Tree ](selNames.length):
1774
1775
untpd.Ident (nme.WILDCARD ).withSpan(wildcardSpan)
@@ -1782,7 +1783,7 @@ object desugar {
1782
1783
case _ =>
1783
1784
report.error(em " No element named ` $name` is defined in selector type $pt" , arg.srcPos)
1784
1785
reordered.toList
1785
- }
1786
+ end if
1786
1787
1787
1788
elems match
1788
1789
case (first @ NamedArg (_, _)) :: _ => reorderedNamedArgs(first.span.startPos)
Original file line number Diff line number Diff line change @@ -228,7 +228,7 @@ enum ErrorMessageID(val isActive: Boolean = true) extends java.lang.Enum[ErrorMe
228
228
case OnlyFullyDependentAppliedConstructorTypeID // errorNumber: 212
229
229
case PointlessAppliedConstructorTypeID // errorNumber: 213
230
230
case IllegalContextBoundsID // errorNumber: 214
231
- case NamedElementsNotDefinedID // errorNumber: 215
231
+ case NamedPatternNotApplicableID // errorNumber: 215
232
232
233
233
def errorNumber = ordinal - 1
234
234
Original file line number Diff line number Diff line change @@ -3523,10 +3523,8 @@ final class IllegalContextBounds(using Context) extends SyntaxMsg(IllegalContext
3523
3523
3524
3524
override protected def explain (using Context ): String = " "
3525
3525
3526
- final class NamedElementsNotDefined (selectorType : Type )(using Context ) extends PatternMatchMsg (NamedElementsNotDefinedID ):
3526
+ final class NamedPatternNotApplicable (selectorType : Type )(using Context ) extends PatternMatchMsg (NamedPatternNotApplicableID ):
3527
3527
override protected def msg (using Context ): String =
3528
- i " Selector type $selectorType does not define any named elements "
3528
+ i " Named patterns cannot be used with $selectorType, because it is not a named tuple or case class "
3529
3529
3530
- override protected def explain (using Context ): String =
3531
- i """ | $selectorType is not a valid selector type for the use with named patterns.
3532
- |Only named tuples and case classes can be used with named patterns. """ .stripMargin
3530
+ override protected def explain (using Context ): String = " "
Original file line number Diff line number Diff line change @@ -58,3 +58,7 @@ object Test:
58
58
// conversion to (name: Int, age: Int). This one would be harder to guard against.
59
59
60
60
val typo : (name : ? , age : ? ) = (name = " he" , ag = 1 ) // error
61
+
62
+ val unnamedTuple : (String , Int ) = (" text" , 10 )
63
+ unnamedTuple match
64
+ case (name = n, age = a) => // error
You can’t perform that action at this time.
0 commit comments