diff --git a/compiler/src/dotty/tools/dotc/ast/Desugar.scala b/compiler/src/dotty/tools/dotc/ast/Desugar.scala index c49ba02ae96a..803f2015262d 100644 --- a/compiler/src/dotty/tools/dotc/ast/Desugar.scala +++ b/compiler/src/dotty/tools/dotc/ast/Desugar.scala @@ -1577,10 +1577,10 @@ object desugar { * also replaced by Binds with fresh names. */ def makeIdPat(pat: Tree): (Tree, Ident) = pat match { - case Bind(name, pat1) => + case bind @ Bind(name, pat1) => if name == nme.WILDCARD then val name = UniqueName.fresh() - (cpy.Bind(pat)(name, pat1), Ident(name)) + (cpy.Bind(pat)(name, pat1).withMods(bind.mods), Ident(name)) else (pat, Ident(name)) case id: Ident if isVarPattern(id) && id.name != nme.WILDCARD => (id, id) case Typed(id: Ident, _) if isVarPattern(id) && id.name != nme.WILDCARD => (pat, id) @@ -1679,7 +1679,12 @@ object desugar { val rhss = valeqs map { case GenAlias(_, rhs) => rhs } val (defpat0, id0) = makeIdPat(gen.pat) val (defpats, ids) = (pats map makeIdPat).unzip - val pdefs = valeqs.lazyZip(defpats).lazyZip(rhss).map(makePatDef(_, Modifiers(), _, _)) + val pdefs = valeqs.lazyZip(defpats).lazyZip(rhss).map { (valeq, defpat, rhs) => + val mods = defpat match + case defTree: DefTree => defTree.mods + case _ => Modifiers() + makePatDef(valeq, mods, defpat, rhs) + } val rhs1 = makeFor(nme.map, nme.flatMap, GenFrom(defpat0, gen.expr, gen.checkMode) :: Nil, Block(pdefs, makeTuple(id0 :: ids))) val allpats = gen.pat :: pats val vfrom1 = GenFrom(makeTuple(allpats), rhs1, GenCheckMode.Ignore) diff --git a/tests/run/fors.check b/tests/run/fors.check index a8c7dfd6c4bd..50f6385e5845 100644 --- a/tests/run/fors.check +++ b/tests/run/fors.check @@ -44,3 +44,8 @@ hello world hello world hello/1~2 hello/3~4 /1~2 /3~4 world/1~2 world/3~4 (2,1) (4,3) + +testGivens +123 +456 +0 diff --git a/tests/run/fors.scala b/tests/run/fors.scala index d8f76473f773..682978b5b3d8 100644 --- a/tests/run/fors.scala +++ b/tests/run/fors.scala @@ -74,7 +74,6 @@ object Test extends App { // arrays for (x <- ar) print(x + " "); println() - } /////////////////// filtering with case /////////////////// @@ -109,9 +108,38 @@ object Test extends App { for case (x, y) <- xs do print(s"${(y, x)} "); println() } + def testGivens(): Unit = { + println("\ntestGivens") + + // bound given that is summoned in subsequent bind + for + a <- List(123) + given Int = a + b = summon[Int] + do + println(b) + + // generated given that is summoned in subsequent bind + for + given Int <- List(456) + x = summon[Int] + do + println(x) + + // pick the correct given + for + a <- List(789) + given Int = a + given Int <- List(0) + x = summon[Int] + do + println(x) + } + //////////////////////////////////////////////////// testOld() testNew() testFiltering() + testGivens() }