File tree Expand file tree Collapse file tree 3 files changed +23
-3
lines changed
compiler/src/dotty/tools/dotc/parsing Expand file tree Collapse file tree 3 files changed +23
-3
lines changed Original file line number Diff line number Diff line change @@ -2615,12 +2615,19 @@ object Parsers {
2615
2615
})
2616
2616
}
2617
2617
2618
- /** TypeCaseClause ::= ‘case’ InfixType ‘=>’ Type [semi]
2618
+ /** TypeCaseClause ::= ‘case’ ( InfixType | ‘_’) ‘=>’ Type [semi]
2619
2619
*/
2620
2620
def typeCaseClause (): CaseDef = atSpan(in.offset) {
2621
2621
val pat = inSepRegion(InCase ) {
2622
2622
accept(CASE )
2623
- infixType()
2623
+ in.token match {
2624
+ case USCORE if in.lookahead.isArrow =>
2625
+ val start = in.skipToken()
2626
+ typeBounds().withSpan(Span (start, in.lastOffset, start))
2627
+
2628
+ case _ =>
2629
+ infixType()
2630
+ }
2624
2631
}
2625
2632
CaseDef (pat, EmptyTree , atSpan(accept(ARROW )) {
2626
2633
val t = typ()
Original file line number Diff line number Diff line change @@ -291,7 +291,7 @@ CaseClauses ::= CaseClause { CaseClause }
291
291
CaseClause ::= ‘case’ Pattern [Guard] ‘=>’ Block CaseDef(pat, guard?, block) // block starts at =>
292
292
ExprCaseClause ::= ‘case’ Pattern [Guard] ‘=>’ Expr
293
293
TypeCaseClauses ::= TypeCaseClause { TypeCaseClause }
294
- TypeCaseClause ::= ‘case’ InfixType ‘=>’ Type [semi]
294
+ TypeCaseClause ::= ‘case’ ( InfixType | ‘_’) ‘=>’ Type [semi]
295
295
296
296
Pattern ::= Pattern1 { ‘|’ Pattern1 } Alternative(pats)
297
297
Pattern1 ::= Pattern2 [‘:’ RefinedType] Bind(name, Typed(Ident(wildcard), tpe))
Original file line number Diff line number Diff line change
1
+ // `case _ => expr` in a match expression should be equivalant to
2
+ // `case _: Any => expr`. Likewise, in a match type, `case _ => T`
3
+ // should be equivalant to `case Any => T`.
4
+
5
+ object Test0 {
6
+ type M [X ] = X match { case String => Int case Any => String }
7
+ def m [X ](x : X ): M [X ] = x match { case _ : String => 1 case _ : Any => " s" }
8
+ }
9
+
10
+ object Test2 {
11
+ type M [X ] = X match { case String => Int case _ => String }
12
+ def m [X ](x : X ): M [X ] = x match { case _ : String => 1 case _ : Any => " s" }
13
+ }
You can’t perform that action at this time.
0 commit comments