@@ -1719,7 +1719,7 @@ object desugar {
17191719   */  
17201720  def  tuple (tree : Tuple , pt : Type )(using  Context ):  Tree  = 
17211721    var  elems  =  checkWellFormedTupleElems(tree.trees)
1722-     if  ctx.mode.is(Mode .Pattern ) then  elems =  adaptPatternArgs(elems, pt)
1722+     if  ctx.mode.is(Mode .Pattern ) then  elems =  adaptPatternArgs(elems, pt, tree.srcPos )
17231723    val  elemValues  =  elems.mapConserve(stripNamedArg)
17241724    val  tup  = 
17251725      val  arity  =  elems.length
@@ -1759,25 +1759,31 @@ object desugar {
17591759   *   - If `elems` are named pattern elements, rearrange them to match `pt`. 
17601760   *     This requires all names in `elems` to be also present in `pt`. 
17611761   */  
1762-   def  adaptPatternArgs (elems : List [Tree ], pt : Type )(using  Context ):  List [Tree ] = 
1762+   def  adaptPatternArgs (elems : List [Tree ], pt : Type ,  pos :  SrcPos )(using  Context ):  List [Tree ] = 
17631763
17641764    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-       val  nameToIdx  =  selNames.zipWithIndex.toMap
1769-       val  reordered  =  Array .fill[untpd.Tree ](selNames.length): 
1770-         untpd.Ident (nme.WILDCARD ).withSpan(wildcardSpan)
1771-       for  case  arg @  NamedArg (name : TermName , _) <-  elems do 
1772-         nameToIdx.get(name) match 
1773-           case  Some (idx) => 
1774-             if  reordered(idx).isInstanceOf [Ident ] then 
1775-               reordered(idx) =  arg
1776-             else 
1777-               report.error(em " Duplicate named pattern " , arg.srcPos)
1778-           case  _ => 
1779-             report.error(em " No element named ` $name` is defined in selector type  $pt" , arg.srcPos)
1780-       reordered.toList
1765+       inline  def  isCaseClass  =  pt.classSymbol.is(CaseClass ) &&  ! defn.isTupleClass(pt.classSymbol)
1766+       if  ! isCaseClass &&  ! pt.isNamedTupleType then 
1767+         report.error(NamedPatternNotApplicable (pt), pos)
1768+         Nil 
1769+       else 
1770+         var  selNames  =  pt.namedTupleElementTypes(false ).map(_(0 ))
1771+         if  isCaseClass &&  selNames.isEmpty then 
1772+           selNames =  pt.classSymbol.caseAccessors.map(_.name.asTermName)
1773+         val  nameToIdx  =  selNames.zipWithIndex.toMap
1774+         val  reordered  =  Array .fill[untpd.Tree ](selNames.length): 
1775+           untpd.Ident (nme.WILDCARD ).withSpan(wildcardSpan)
1776+         for  case  arg @  NamedArg (name : TermName , _) <-  elems do 
1777+           nameToIdx.get(name) match 
1778+             case  Some (idx) => 
1779+               if  reordered(idx).isInstanceOf [Ident ] then 
1780+                 reordered(idx) =  arg
1781+               else 
1782+                 report.error(em " Duplicate named pattern " , arg.srcPos)
1783+             case  _ => 
1784+               report.error(em " No element named ` $name` is defined in selector type  $pt" , arg.srcPos)
1785+         reordered.toList
1786+       end if 
17811787
17821788    elems match 
17831789      case  (first @  NamedArg (_, _)) ::  _ =>  reorderedNamedArgs(first.span.startPos)
0 commit comments