scala/scala — pull request #4033 by retronym (2014-10-07 05:21:28+00:00)
Title: SI-8888 Avoid ClassFormatError under -Ydelambdafy:method

The pattern matcher phase (conceivably, among others) can generate
code that binds local `Ident`s symbolically, rather than according
to the lexical scope. This means that a lambda can capture more than
one local of the same name.

In the enclosed test case, this ends up creating the following
tree after delambdafy

[[syntax trees at end of delambdafy]] // delambday-patmat-path-dep.scala
matchEnd4({
case val x1: Object = (x2: Object);
case5(){
if (x1.$isInstanceOf[C]())
{
val x2#19598: C = (x1.$asInstanceOf[C](): C);
matchEnd4({
{
(new resume$1(x2#19598, x2#19639): runtime.AbstractFunction0)
};
scala.runtime.BoxedUnit.UNIT
})
}
else
case6()
};
...
})
...
class resume$1 extends AbstractFunction0 {
var x2: C = null;
var x2: C = null;
...
}

After this commit, the var members of `resume$1` are given fresh
names, rather than directly using the name of the captured var:

var x2$3: C = null;
var x2$4: C = null;

Review by @lrytz or @gkossakowski