Skip to content

Commit 71280c8

Browse files
committed
Invent given pattern name in for comprehension
1 parent ebe241e commit 71280c8

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,7 +1347,7 @@ object desugar {
13471347
)).withSpan(tree.span)
13481348
end makePolyFunctionType
13491349

1350-
/** Invent a name for an anonympus given of type or template `impl`. */
1350+
/** Invent a name for an anonymous given of type or template `impl`. */
13511351
def inventGivenName(impl: Tree)(using Context): SimpleName =
13521352
val str = impl match
13531353
case impl: Template =>
@@ -2136,18 +2136,19 @@ object desugar {
21362136
* that refers to the bound variable for the pattern. Wildcard Binds are
21372137
* also replaced by Binds with fresh names.
21382138
*/
2139-
def makeIdPat(pat: Tree): (Tree, Ident) = pat match {
2140-
case bind @ Bind(name, pat1) =>
2141-
if name == nme.WILDCARD then
2142-
val name = UniqueName.fresh()
2143-
(cpy.Bind(pat)(name, pat1).withMods(bind.mods), Ident(name))
2144-
else (pat, Ident(name))
2139+
def makeIdPat(pat: Tree): (Tree, Ident) = pat match
2140+
case pat @ Bind(nme.WILDCARD, body) =>
2141+
val name =
2142+
body match
2143+
case Typed(Ident(nme.WILDCARD), tpt) if pat.mods.is(Given) => inventGivenName(tpt)
2144+
case _ => UniqueName.fresh()
2145+
(cpy.Bind(pat)(name, body).withMods(pat.mods), Ident(name))
2146+
case Bind(name, _) => (pat, Ident(name))
21452147
case id: Ident if isVarPattern(id) && id.name != nme.WILDCARD => (id, id)
21462148
case Typed(id: Ident, _) if isVarPattern(id) && id.name != nme.WILDCARD => (pat, id)
21472149
case _ =>
21482150
val name = UniqueName.fresh()
21492151
(Bind(name, pat), Ident(name))
2150-
}
21512152

21522153
/** Make a pattern filter:
21532154
* 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)