Skip to content

Commit

Permalink
fix(scala#15784): ident rule for pat match was too strict (scala#19501)
Browse files Browse the repository at this point in the history
close scala#15784

Scala 2 allows backticked identifier and capital identifier in pattern
match, but Scala 3 mistakenly prohibited them.

For example, the following code is valid in Scala 2,

```scala
List(42) match {
  case List(_, Rest @ _*) => Rest
  case List(_, `Rest` @ _*) => `Rest`
  _ => ???
}
```
whereas it resulted in `Not Found Rest` error in Scala 3.

This is because the condition to detect wildcard pattern was so strict
that it chose the wrong match arm; `case _ => ifExpr`.
  • Loading branch information
sjrd authored Jan 22, 2024
2 parents 30bdc33 + 09abbd6 commit ca18f4a
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 1 deletion.
2 changes: 1 addition & 1 deletion compiler/src/dotty/tools/dotc/typer/Typer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -944,7 +944,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
* (x: T) to (x @ (w: T)). This is either `_` or `_*`.
*/
def cases(ifPat: => Tree, ifExpr: => Tree, wildName: TermName) = tree.expr match {
case id: untpd.Ident if (ctx.mode is Mode.Pattern) && untpd.isVarPattern(id) =>
case id: untpd.Ident if (ctx.mode is Mode.Pattern) =>
if (id.name == nme.WILDCARD || id.name == nme.WILDCARD_STAR) ifPat
else {
import untpd.*
Expand Down
12 changes: 12 additions & 0 deletions tests/neg/i15784.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- [E006] Not Found Error: tests/neg/i15784.scala:2:22 -----------------------------------------------------------------
2 | case List(_, Rest @ `a`) => Rest // error
| ^^^
| Not found: a
|
| longer explanation available when compiling with `-explain`
-- [E006] Not Found Error: tests/neg/i15784.scala:3:22 -----------------------------------------------------------------
3 | case List(_, Rest @ A) => Rest // error
| ^
| Not found: A
|
| longer explanation available when compiling with `-explain`
4 changes: 4 additions & 0 deletions tests/neg/i15784.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
def i15784 = List(42) match
case List(_, Rest @ `a`) => Rest // error
case List(_, Rest @ A) => Rest // error
case _ => ???
8 changes: 8 additions & 0 deletions tests/pos/i15784.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
def i15784 = List(42) match
case List(_, rest @ _*) => rest
case List(_, Rest @ _*) => Rest
case List(_, `Rest` @ _*) => Rest
case _ => ???

def i15784_auxiliary = 42 match
case `type` : Int => `type`

0 comments on commit ca18f4a

Please sign in to comment.