summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2017-01-24 17:50:38 +1000
committerJason Zaugg <jzaugg@gmail.com>2017-01-24 17:52:11 +1000
commitf85c62e33e6ec7e84ed5946f1d72f3f74941ab9e (patch)
tree05bab2d3f057e63850f31e78f00af97adb7080e8
parentb9d4089d19ead36d07c2d6cdda283c9b678d515e (diff)
downloadscala-f85c62e33e6ec7e84ed5946f1d72f3f74941ab9e.tar.gz
scala-f85c62e33e6ec7e84ed5946f1d72f3f74941ab9e.tar.bz2
scala-f85c62e33e6ec7e84ed5946f1d72f3f74941ab9e.zip
Fix erasure of the qualifier of ##
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala13
-rw-r--r--test/files/run/hash-hash-hash-hash.scala5
-rw-r--r--test/files/run/unit-block-hash-hash.scala12
3 files changed, 24 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index 3ce7db35d8..1135d537f9 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -1060,20 +1060,21 @@ abstract class Erasure extends InfoTransform
}
else if (args.isEmpty && interceptedMethods(fn.symbol)) {
if (poundPoundMethods.contains(fn.symbol)) {
+ val qual1 = preErase(qual)
// This is unattractive, but without it we crash here on ().## because after
// erasure the ScalaRunTime.hash overload goes from Unit => Int to BoxedUnit => Int.
// This must be because some earlier transformation is being skipped on ##, but so
// far I don't know what. For null we now define null.## == 0.
def staticsCall(methodName: TermName): Tree = {
- val newTree = gen.mkMethodCall(RuntimeStaticsModule, methodName, qual :: Nil)
+ val newTree = gen.mkMethodCall(RuntimeStaticsModule, methodName, qual1 :: Nil)
global.typer.typed(newTree)
}
- qual.tpe.typeSymbol match {
- case UnitClass | NullClass => LIT(0)
- case IntClass => qual
- case s @ (ShortClass | ByteClass | CharClass) => numericConversion(qual, s)
- case BooleanClass => If(qual, LIT(true.##), LIT(false.##))
+ qual1.tpe.typeSymbol match {
+ case UnitClass | NullClass => BLOCK(qual1, LIT(0))
+ case IntClass => qual1
+ case s @ (ShortClass | ByteClass | CharClass) => numericConversion(qual1, s)
+ case BooleanClass => If(qual1, LIT(true.##), LIT(false.##))
case LongClass => staticsCall(nme.longHash)
case FloatClass => staticsCall(nme.floatHash)
case DoubleClass => staticsCall(nme.doubleHash)
diff --git a/test/files/run/hash-hash-hash-hash.scala b/test/files/run/hash-hash-hash-hash.scala
new file mode 100644
index 0000000000..08793871a7
--- /dev/null
+++ b/test/files/run/hash-hash-hash-hash.scala
@@ -0,0 +1,5 @@
+object Test {
+ def main(args: Array[String]): Unit = {
+ assert(1.##.## == 1) // was java.lang.NoSuchMethodError: java.lang.Object.$hash$hash()I
+ }
+}
diff --git a/test/files/run/unit-block-hash-hash.scala b/test/files/run/unit-block-hash-hash.scala
new file mode 100644
index 0000000000..2708810a71
--- /dev/null
+++ b/test/files/run/unit-block-hash-hash.scala
@@ -0,0 +1,12 @@
+object Ex extends Exception
+object Test {
+ def ex: Any = throw Ex
+ def main(args: Array[String]): Unit = {
+ try {
+ { ex; () }.##
+ sys.error("no exception was thrown")
+ } catch {
+ case `Ex` =>
+ }
+ }
+} \ No newline at end of file