summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2009-11-06 18:00:43 +0000
committerIulian Dragos <jaguarul@gmail.com>2009-11-06 18:00:43 +0000
commitd42f62bbd76df85ed57162118a8c720f50bbd5c5 (patch)
tree7f250f596a8dafbe3503bdd66e9f67bfa2c3f236
parent1b807250a30c8526851e67271f0545c67362b365 (diff)
downloadscala-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.scala6
-rw-r--r--test/files/run/inliner-infer.check2
-rw-r--r--test/files/run/inliner-infer.scala29
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
+}
+
+