summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/transform/CleanUp.scala7
-rw-r--r--test/files/run/bug2636.scala35
2 files changed, 40 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
index dafec5e1c3..444dc42299 100644
--- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala
+++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
@@ -374,8 +374,11 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
((resType :: paramTypes) forall (x => isValueClass(x.typeSymbol))) // issue #1110
}
def useArrayOperator =
- ((qualSym == definitions.ObjectClass) || (qualSym == definitions.ArrayClass)) &&
- ((methSym.name == nme.length) || (methSym.name == nme.update) || (methSym.name == nme.apply))
+ ((qualSym == definitions.ObjectClass) || (qualSym == definitions.ArrayClass)) && (
+ (methSym.name == nme.length && params.isEmpty) ||
+ (methSym.name == nme.update && (structResType.typeSymbol eq UnitClass)) ||
+ (methSym.name == nme.apply && params.size == 1)
+ )
val callCode = if (useValueOperator) {
val (operator, test) = getPrimitiveReplacementForStructuralCall(methSym.name)
def args = qual :: params
diff --git a/test/files/run/bug2636.scala b/test/files/run/bug2636.scala
new file mode 100644
index 0000000000..8c49a733fd
--- /dev/null
+++ b/test/files/run/bug2636.scala
@@ -0,0 +1,35 @@
+object Test
+{
+ type Foo = { def update(x: Int, value: String): Unit }
+ type Foo2 = { def update(x: Int, value: String): Int }
+ type Foo3 = { def update(x: Int, value: String): Array[Int] }
+
+ def alen() = {
+ type L1 = { def length: Int }
+ def len(p: L1) = p.length
+ val x: L1 = Array(1,2,3)
+ len(x)
+ }
+
+ type A1 = { def apply(x: Int): String }
+ def arrApply(a: A1, x: Int) = a(x)
+
+ def main(args: Array[String]): Unit = {
+ val arr = new Array[String](3)
+ val p1: Foo = arr
+ def a1 = p1(0) = "b"
+
+ val p2: Foo2 = new { def update(x: Int, value: String) = { p1(1) = "o" ; 1 } }
+ def a2 = p2(0) = "c"
+
+ val p3: Foo3 = new { def update(x: Int, value: String) = { p1(2) = "b" ; Array(1) } }
+ def a3 = p3(10) = "hi mom"
+
+ a1 ; a2 ; a3 ;
+
+ assert(arr.mkString == "bob")
+ assert(alen() == 3)
+ assert(arrApply(arr, 1) == "o")
+ assert(arrApply(new { def apply(x: Int) = "tom" }, -100) == "tom")
+ }
+} \ No newline at end of file