summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-01-04 23:47:41 -0800
committerPaul Phillips <paulp@improving.org>2012-01-04 23:55:51 -0800
commitbe46e487134305edae065de00582928c120bcfbb (patch)
treef20679fe453ade9e72e9220dabcc574e0e5246fc
parentbedb33fd7cb3439a129dff15e1ea1341c5c8fe7d (diff)
downloadscala-be46e487134305edae065de00582928c120bcfbb.tar.gz
scala-be46e487134305edae065de00582928c120bcfbb.tar.bz2
scala-be46e487134305edae065de00582928c120bcfbb.zip
Fix for NoSuchMethod in cleanup.
Don't assume that just because someone is calling x.toInt and x <: java.lang.Number, that it's a boxed primitive. Closes SI-5356.
-rw-r--r--src/compiler/scala/tools/nsc/transform/CleanUp.scala12
-rw-r--r--test/files/run/t5356.check6
-rw-r--r--test/files/run/t5356.scala12
3 files changed, 29 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
index 575fe8f295..f04867b889 100644
--- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala
+++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
@@ -275,7 +275,17 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
/* ### HANDLING METHODS NORMALLY COMPILED TO OPERATORS ### */
val testForNumber: Tree => Tree = {
- qual1 => (qual1 IS_OBJ BoxedNumberClass.tpe) OR (qual1 IS_OBJ BoxedCharacterClass.tpe)
+ // Can't shortcut on BoxedNumber because BoxesRunTime
+ // is unforgiving of other Numbers showing up.
+ qual1 => (
+ (qual1 IS_OBJ BoxedIntClass.tpe)
+ OR (qual1 IS_OBJ BoxedLongClass.tpe)
+ OR (qual1 IS_OBJ BoxedDoubleClass.tpe)
+ OR (qual1 IS_OBJ BoxedFloatClass.tpe)
+ OR (qual1 IS_OBJ BoxedByteClass.tpe)
+ OR (qual1 IS_OBJ BoxedShortClass.tpe)
+ OR (qual1 IS_OBJ BoxedCharacterClass.tpe)
+ )
}
val testForBoolean: Tree => Tree = {
qual1 => (qual1 IS_OBJ BoxedBooleanClass.tpe)
diff --git a/test/files/run/t5356.check b/test/files/run/t5356.check
new file mode 100644
index 0000000000..21c4aef07b
--- /dev/null
+++ b/test/files/run/t5356.check
@@ -0,0 +1,6 @@
+1 scala.runtime.RichInt
+1 scala.runtime.RichInt
+1 scala.math.BigInt
+1 scala.runtime.RichDouble
+1 scala.runtime.RichFloat
+1
diff --git a/test/files/run/t5356.scala b/test/files/run/t5356.scala
new file mode 100644
index 0000000000..f7696c6088
--- /dev/null
+++ b/test/files/run/t5356.scala
@@ -0,0 +1,12 @@
+object Test {
+ def f(x: { def toInt: Int }) = println(x.toInt + " " + x.getClass.getName)
+
+ def main(args: Array[String]): Unit = {
+ f(1)
+ f(1.toInt)
+ f(BigInt(1))
+ f(1d)
+ f(1f)
+ println((1: { def toInt: Int }).toInt)
+ }
+}