From f85c62e33e6ec7e84ed5946f1d72f3f74941ab9e Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Tue, 24 Jan 2017 17:50:38 +1000 Subject: Fix erasure of the qualifier of ## --- src/compiler/scala/tools/nsc/transform/Erasure.scala | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src/compiler') 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) -- cgit v1.2.3