@@ -3398,7 +3398,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
3398
3398
/** Translate tuples of all arities */
3399
3399
def typedTuple (tree : untpd.Tuple , pt : Type )(using Context ): Tree =
3400
3400
val tree1 = desugar.tuple(tree, pt)
3401
- checkAmbiguousNamedTuple (tree)
3401
+ checkAmbiguousNamedTupleAssignment (tree)
3402
3402
if tree1 ne tree then typed(tree1, pt)
3403
3403
else
3404
3404
val arity = tree.trees.length
@@ -3424,14 +3424,19 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
3424
3424
val resTpe = TypeOps .nestedPairs(elemTpes)
3425
3425
app1.cast(resTpe)
3426
3426
3427
- def checkAmbiguousNamedTuple (tree : untpd.Tuple )(using Context ): Unit =
3427
+ /** Checks if `tree` is a named tuple with one element that could be
3428
+ * interpreted as an assignment, such as `(x = 1)`. If so, issues a warning.
3429
+ */
3430
+ def checkAmbiguousNamedTupleAssignment (tree : untpd.Tuple )(using Context ): Unit =
3428
3431
tree.trees match
3429
3432
case List (NamedArg (name, value)) =>
3430
- val typedName = typedIdent(untpd.Ident (name), WildcardType )
3431
- val sym = typedName.symbol
3432
- if sym.exists && (sym.is(Flags .Mutable ) || sym.setter.exists) then
3433
+ val tmpCtx = ctx.fresh.setNewTyperState()
3434
+ typedAssign(untpd.Assign (untpd.Ident (name), value), WildcardType )(using tmpCtx)
3435
+ if ! tmpCtx.reporter.hasErrors then
3436
+ // If there are no errors typing the above, then the named tuple is
3437
+ // ambiguous and we issue a warning.
3433
3438
report.migrationWarning(AmbiguousNamedTupleAssignment (name, value), tree.srcPos)
3434
- case _ =>
3439
+ case _ => ()
3435
3440
3436
3441
/** Retrieve symbol attached to given tree */
3437
3442
protected def retrieveSym (tree : untpd.Tree )(using Context ): Symbol = tree.removeAttachment(SymOfTree ) match {
0 commit comments