diff options
| author | Graydon Hoare <[email protected]> | 2010-09-13 13:37:24 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-09-13 13:37:24 -0700 |
| commit | bc646d01c501f2566fd78057e23c283cfedc0eb0 (patch) | |
| tree | 9bfe2f19a42e79b1ded82be5428f0bb33ec3f61f | |
| parent | Fix a leak when box types are used via type descriptors. (diff) | |
| download | rust-bc646d01c501f2566fd78057e23c283cfedc0eb0.tar.xz rust-bc646d01c501f2566fd78057e23c283cfedc0eb0.zip | |
Fix leaking arg slots on tail calls. Closes #160.
| -rw-r--r-- | src/Makefile | 1 | ||||
| -rw-r--r-- | src/boot/me/trans.ml | 2 | ||||
| -rw-r--r-- | src/test/run-pass/tail-call-arg-leak.rs | 11 |
3 files changed, 14 insertions, 0 deletions
diff --git a/src/Makefile b/src/Makefile index 56fe9b98..8400e7a1 100644 --- a/src/Makefile +++ b/src/Makefile @@ -533,6 +533,7 @@ TEST_XFAILS_LLVM := $(TASK_XFAILS) \ str-concat.rs \ str-idx.rs \ tag.rs \ + tail-call-arg-leak.rs \ tail-cps.rs \ tail-direct.rs \ task-comm.rs \ diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml index ad0d6445..dd1dd46d 100644 --- a/src/boot/me/trans.ml +++ b/src/boot/me/trans.ml @@ -4219,6 +4219,8 @@ let trans_visitor (Printf.sprintf "copy args for tail call to %s" (logname ()))); copy_fn_args true true CLONE_none call; drop_slots_at_curr_stmt(); + iflog (fun _ -> annotate "drop args"); + iter_arg_slots cx (current_fn()) callee_drop_slot; abi.Abi.abi_emit_fn_tail_call (emitter()) (force_sz (current_fn_callsz())) caller_argsz callee_code callee_argsz; diff --git a/src/test/run-pass/tail-call-arg-leak.rs b/src/test/run-pass/tail-call-arg-leak.rs new file mode 100644 index 00000000..d99ceaec --- /dev/null +++ b/src/test/run-pass/tail-call-arg-leak.rs @@ -0,0 +1,11 @@ +// use of tail calls causes arg slot leaks, issue #160. + +fn inner(str dummy, bool b) { + if (b) { + be inner(dummy, false); + } +} + +fn main() { + inner("hi", true); +} |