Skip to content

Commit ebb8490

Browse files
som-snytttgodzik
authored andcommitted
Invent given pattern name in for comprehension
1 parent 8333a53 commit ebb8490

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,18 +1653,19 @@ object desugar {
16531653
* that refers to the bound variable for the pattern. Wildcard Binds are
16541654
* also replaced by Binds with fresh names.
16551655
*/
1656-
def makeIdPat(pat: Tree): (Tree, Ident) = pat match {
1657-
case bind @ Bind(name, pat1) =>
1658-
if name == nme.WILDCARD then
1659-
val name = UniqueName.fresh()
1660-
(cpy.Bind(pat)(name, pat1).withMods(bind.mods), Ident(name))
1661-
else (pat, Ident(name))
1656+
def makeIdPat(pat: Tree): (Tree, Ident) = pat match
1657+
case pat @ Bind(nme.WILDCARD, body) =>
1658+
val name =
1659+
body match
1660+
case Typed(Ident(nme.WILDCARD), tpt) if pat.mods.is(Given) => inventGivenName(tpt)
1661+
case _ => UniqueName.fresh()
1662+
(cpy.Bind(pat)(name, body).withMods(pat.mods), Ident(name))
1663+
case Bind(name, _) => (pat, Ident(name))
16621664
case id: Ident if isVarPattern(id) && id.name != nme.WILDCARD => (id, id)
16631665
case Typed(id: Ident, _) if isVarPattern(id) && id.name != nme.WILDCARD => (pat, id)
16641666
case _ =>
16651667
val name = UniqueName.fresh()
16661668
(Bind(name, pat), Ident(name))
1667-
}
16681669

16691670
/** Make a pattern filter:
16701671
* rhs.withFilter { case pat => true case _ => false }

tests/pos/i23119.scala

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//> using options -Wunused:patvars -Werror
2+
3+
def make: IndexedSeq[FalsePositive] =
4+
for {
5+
i <- 1 to 2
6+
given Int = i
7+
fp = FalsePositive()
8+
} yield fp
9+
10+
def broken =
11+
for
12+
i <- List(42)
13+
(x, y) = "hello" -> "world"
14+
yield
15+
s"$x, $y" * i
16+
17+
def alt: IndexedSeq[FalsePositive] =
18+
given String = "hi"
19+
for
20+
given Int <- 1 to 2
21+
j: Int = summon[Int] // simple assign because irrefutable
22+
_ = j + 1
23+
k :: Nil = j :: Nil : @unchecked // pattern in one var
24+
fp = FalsePositive(using k)
25+
yield fp
26+
27+
class FalsePositive(using Int):
28+
def usage(): Unit =
29+
println(summon[Int])

0 commit comments

Comments
 (0)