8000 Default getter is never assignment · scala/scala@2060dba · GitHub
[go: up one dir, main page]

Skip to content 8000

Commit 2060dba

Browse files
committed
Default getter is never assignment
Don't check whether supplied `f(x = default$getter)` is an assignment to `x`.
1 parent c2a5883 commit 2060dba

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,10 @@ trait NamesDefaults { self: Analyzer =>
596596
var positionalAllowed = true
597597
def stripNamedArg(arg: AssignOrNamedArg, argIndex: Int): Tree = {
598598
val AssignOrNamedArg(Ident(name), rhs) = arg
599+
def invokesDefault: Boolean = rhs match {
600+
case Select(_, f) => f.startsWith(nme.DEFAULT_GETTER_INIT_STRING) || f.indexOf(nme.DEFAULT_GETTER_STRING) >= 0
601+
case _ => false
602+
}
599603
params indexWhere (p => matchesName(p, name, argIndex)) match {
600604
case -1 if positionalAllowed && !settings.isScala213 =>
601605
if (isVariableInScope(context0, name)) {
@@ -617,7 +621,7 @@ trait NamesDefaults { self: Analyzer =>
617621
case AssignOrNamedArg(Ident(oName), _) if oName != name => oName
618622
}
619623
DoubleParamNamesDefaultError(arg, name, existingArgIndex+1, otherName)
620-
case paramPos if !settings.isScala213 && isAmbiguousAssignment(typer, params(paramPos), arg) =>
624+
case paramPos if !settings.isScala213 && !invokesDefault && isAmbiguousAssignment(typer, params(paramPos), arg) =>
621625
AmbiguousReferenceInNamesDefaultError(arg, name)
622626
case paramPos if paramPos != argIndex =>
623627
positionalAllowed = false // named arg CEAD is not in original parameter order: require names after this

test/files/neg/names-defaults-neg.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,21 @@ object t3685 {
186186
class u20 { val x: Int = u.f(x = "32") }
187187
class u21 { var x: Int = u.f(x = "32") }
188188
}
189+
190+
trait t10336 {
191+
case class C(a: Int = 10, b: String = "20")
192+
193+
class X {
194+
def c(c: C): (Int, String) = (c.a, c.b)
195+
def f() = {
196+
val (x, y) = c(C(b = "30"))
197+
val a = y.toInt
198+
()
199+
}
200+
def g() = {
201+
val (x, y) = c(C(10, "20").copy(b = "30"))
202+
val a = y.toInt
203+
()
204+
}
205+
}
206+
}

0 commit comments

Comments
 (0)
0