Permalink
Browse files

[backport] Fix SI-6637 (misoptimization in erasure)

commit f9ef5300ab561628e53c654df9000c75f488d74a
Author: Jan Niehusmann <jan@gondor.com>
Date:   Fri Nov 9 15:05:58 2012 +0100

    Fix SI-6637 (misoptimization in erasure)

    Move the optimization one level deeper so the expression
    being tested with isInstanceOf is always evaluated.
    (cherry picked from commit b540aae)
  • Loading branch information...
1 parent 884737c commit 4dceb2268780462823a98168d7350687d5cf27a8 @retronym retronym committed Jan 22, 2013
Showing with 20 additions and 11 deletions.
  1. +11 −11 src/compiler/scala/tools/nsc/transform/Erasure.scala
  2. +1 −0 test/files/run/t6637.check
  3. +8 −0 test/files/run/t6637.scala
@@ -1057,17 +1057,17 @@ abstract class Erasure extends AddInterfaces
Apply(Select(qual, cmpOp), List(gen.mkAttributedQualifier(targ.tpe)))
}
case RefinedType(parents, decls) if (parents.length >= 2) =>
- // Optimization: don't generate isInstanceOf tests if the static type
- // conforms, because it always succeeds. (Or at least it had better.)
- // At this writing the pattern matcher generates some instance tests
- // involving intersections where at least one parent is statically known true.
- // That needs fixing, but filtering the parents here adds an additional
- // level of robustness (in addition to the short term fix.)
- val parentTests = parents filterNot (qual.tpe <:< _)
-
- if (parentTests.isEmpty) Literal(Constant(true))
- else gen.evalOnce(qual, currentOwner, unit) { q =>
- atPos(tree.pos) {
+ gen.evalOnce(qual, currentOwner, unit) { q =>
+ // Optimization: don't generate isInstanceOf tests if the static type
+ // conforms, because it always succeeds. (Or at least it had better.)
+ // At this writing the pattern matcher generates some instance tests
+ // involving intersections where at least one parent is statically known true.
+ // That needs fixing, but filtering the parents here adds an additional
+ // level of robustness (in addition to the short term fix.)
+ val parentTests = parents filterNot (qual.tpe <:< _)
+
+ if (parentTests.isEmpty) Literal(Constant(true))
+ else atPos(tree.pos) {
parentTests map mkIsInstanceOf(q) reduceRight gen.mkAnd
}
}
@@ -0,0 +1 @@
+ok
@@ -0,0 +1,8 @@
+
+object Test extends App {
+ try {
+ class A ; class B ; List().head.isInstanceOf[A with B]
+ } catch {
+ case _ :java.util.NoSuchElementException => println("ok")
+ }
+}

0 comments on commit 4dceb22

Please sign in to comment.