diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala | 6 | ||||
-rw-r--r-- | test/files/run/inliner-infer.check | 2 | ||||
-rw-r--r-- | test/files/run/inliner-infer.scala | 29 |
3 files changed, 37 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala index 0dadd8980d..32a6037d41 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala @@ -126,6 +126,12 @@ abstract class TypeFlowAnalysis { in(b) = typeFlowLattice.bottom out(b) = typeFlowLattice.bottom } + + // start block has var bindings for each of its parameters + val entryBindings = new VarBinding + m.params.foreach(p => entryBindings += ((p, p.kind))) + in(m.code.startBlock) = lattice.IState(entryBindings, typeStackLattice.bottom) + m.exh foreach { e => in(e.startBlock) = lattice.IState(in(e.startBlock).vars, typeStackLattice.exceptionHandlerStack) } diff --git a/test/files/run/inliner-infer.check b/test/files/run/inliner-infer.check new file mode 100644 index 0000000000..d702bd602d --- /dev/null +++ b/test/files/run/inliner-infer.check @@ -0,0 +1,2 @@ +non-empty +empty diff --git a/test/files/run/inliner-infer.scala b/test/files/run/inliner-infer.scala new file mode 100644 index 0000000000..107b9508ee --- /dev/null +++ b/test/files/run/inliner-infer.scala @@ -0,0 +1,29 @@ + + +/** Test that the inliner is not inferring that `xs' is + * always Nil, removing the call to isEmpty. + */ +object Test extends Application { + + @annotation.tailrec + def walk(xs: MyList): Unit = { + if (xs.isEmpty) + println("empty") + else { + println("non-empty") + walk(MyNil) + } + } + + walk(new MyList) +} + +class MyList { + def isEmpty = false +} + +object MyNil extends MyList { + override def isEmpty = true +} + + |