diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2009-11-06 18:00:43 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2009-11-06 18:00:43 +0000 |
commit | d42f62bbd76df85ed57162118a8c720f50bbd5c5 (patch) | |
tree | 7f250f596a8dafbe3503bdd66e9f67bfa2c3f236 | |
parent | 1b807250a30c8526851e67271f0545c67362b365 (diff) | |
download | scala-d42f62bbd76df85ed57162118a8c720f50bbd5c5.tar.gz scala-d42f62bbd76df85ed57162118a8c720f50bbd5c5.tar.bz2 scala-d42f62bbd76df85ed57162118a8c720f50bbd5c5.zip |
Fixed initial variable binding for method param...
Fixed initial variable binding for method parameters, that caused the
inliner to infer wrong types for tail recursive methods
-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 +} + + |