Skip to content

Commit f618dd6

Browse files
Merge pull request #12137 from dotty-staging/fix-12073
Handle alternative patterns in inline reduction
2 parents b52007d + f8f6841 commit f618dd6

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

compiler/src/dotty/tools/dotc/typer/Inliner.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,6 +1249,8 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(using Context) {
12491249
case _ =>
12501250
false
12511251
}
1252+
case Alternative(pats) =>
1253+
pats.exists(reducePattern(caseBindingMap, scrut, _))
12521254
case Inlined(EmptyTree, Nil, ipat) =>
12531255
reducePattern(caseBindingMap, scrut, ipat)
12541256
case _ => false

tests/pos/i12073.scala

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
inline def ff: Unit =
2+
inline 1 match
3+
case 1 | 2 =>
4+
5+
def test = ff
6+
7+
transparent inline def f: Option[String] =
8+
None
9+
10+
object Override {
11+
12+
trait Trait { def s: String }
13+
14+
object OK extends Trait {
15+
override transparent inline def s: String =
16+
inline f match {
17+
case Some("x") => "x"
18+
case Some("y") => "y"
19+
case None => "-"
20+
}
21+
}
22+
23+
object KO_1 extends Trait {
24+
override transparent inline def s: String =
25+
inline f match {
26+
case Some("x") => "x"
27+
case Some("y")
28+
| None => "0"
29+
}
30+
}
31+
32+
object KO_2 extends Trait {
33+
override transparent inline def s: String =
34+
inline f match {
35+
case Some("x") => "x"
36+
case Some("y") => "y"
37+
case Some(z) => "z"
38+
case None => "0"
39+
}
40+
}
41+
}
42+
43+
object NonOverride {
44+
45+
transparent inline def ok_1: String =
46+
inline f match {
47+
case Some("x") => "x"
48+
case Some("y") => "y"
49+
case None => "-"
50+
}
51+
52+
// ok: Some("y") | None
53+
transparent inline def ok_2: String =
54+
inline f match {
55+
case Some("x") => "x"
56+
case Some("y")
57+
| None => "0"
58+
}
59+
60+
// ok: no None
61+
transparent inline def ok_3: String =
62+
inline f match {
63+
case Some("x") => "x"
64+
case Some("y") => "y"
65+
case Some(z) => "z"
66+
case None => "0"
67+
}
68+
69+
ok_1 + ok_2 ++ ok_3
70+
}

0 commit comments

Comments
 (0)