[svn] r5981: nemerle/trunk/ncc: generation/ILEmitter.n
testsuite/positive/tail-call-opt.n
malekith
svnadmin at nemerle.org
Tue Nov 29 20:13:54 CET 2005
Log:
Don't emit stores to non-existant parameters. Resolves #578.
Author: malekith
Date: Tue Nov 29 20:13:53 2005
New Revision: 5981
Modified:
nemerle/trunk/ncc/generation/ILEmitter.n
nemerle/trunk/ncc/testsuite/positive/tail-call-opt.n
Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n (original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n Tue Nov 29 20:13:53 2005
@@ -933,7 +933,10 @@
| MultipleAssign (assigns) =>
def emit_store (local_var : LocalValue, _) {
Mark (local_var.Location);
- store_local (local_var);
+ if (local_var.EverUsed)
+ store_local (local_var)
+ else
+ _ilg.Emit (OpCodes.Pop);
}
foreach ((_, e) in assigns) emit (e);
List.Iter (List.Rev (assigns), emit_store);
Modified: nemerle/trunk/ncc/testsuite/positive/tail-call-opt.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/tail-call-opt.n (original)
+++ nemerle/trunk/ncc/testsuite/positive/tail-call-opt.n Tue Nov 29 20:13:53 2005
@@ -130,6 +130,19 @@
}
}
+
+ Bug578 [a] (l : list [a]) : int
+ {
+ def loop (acc : int, x : list [a]) : int // W: never used
+ {
+ match (l) {
+ | _::xs => loop(acc + 1, xs)
+ | Nil => 0
+ }
+ };
+ loop (0, l)
+ }
+
Main () : void {
mutable sum = 0;
for (mutable i = 0; i < 20000000; i = i + 1)
More information about the svn
mailing list