aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-06-24 13:32:59 -0700
committerGraydon Hoare <[email protected]>2010-06-24 13:32:59 -0700
commitaf44ec2856603b8a978a1f2582c285c7c0065403 (patch)
tree7cc4d0ad4765a2b320580355242a15027eb97062 /src
parentRemove redundant copy of comment. (diff)
downloadrust-af44ec2856603b8a978a1f2582c285c7c0065403.tar.xz
rust-af44ec2856603b8a978a1f2582c285c7c0065403.zip
Issue 24, drop output slot when not initializing. Un-XFAIL generic-tag.rs. Add test for output slot modes with several broken cases.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile2
-rw-r--r--src/boot/me/trans.ml16
-rw-r--r--src/test/run-pass/output-slot-variants.rs58
3 files changed, 69 insertions, 7 deletions
diff --git a/src/Makefile b/src/Makefile
index 193f04d7..2244c350 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -321,7 +321,6 @@ TEST_XFAILS_X86 := test/run-pass/mlist-cycle.rs \
test/run-pass/vec-slice.rs \
test/run-pass/generic-fn-infer.rs \
test/run-pass/generic-recursive-tag.rs \
- test/run-pass/generic-tag.rs \
test/run-pass/bind-obj-ctor.rs \
test/run-pass/task-comm.rs \
test/compile-fail/rec-missing-fields.rs \
@@ -391,6 +390,7 @@ TEST_XFAILS_LLVM := $(addprefix test/run-pass/, \
obj-dtor.rs \
obj-with-vec.rs \
opeq.rs \
+ output-slot-variants.rs \
preempt.rs \
pred.rs \
readalias.rs \
diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml
index fe4a542f..cb492561 100644
--- a/src/boot/me/trans.ml
+++ b/src/boot/me/trans.ml
@@ -3708,7 +3708,7 @@ let trans_visitor
and trans_prepare_call
- ((*initializing*)_:bool)
+ (initializing:bool)
(logname:(unit -> string))
(call:call)
: Il.operand =
@@ -3718,11 +3718,15 @@ let trans_visitor
(Printf.sprintf "copy args for call to %s" (logname ())));
copy_fn_args false CLONE_none call;
iflog (fun _ -> annotate (Printf.sprintf "call %s" (logname ())));
- (* FIXME (issue #24): we need to actually handle writing to an
- * already-initialised slot. Currently we blindly assume we're
- * initializing, overwrite the slot; this is ok if we're writing
- * to an interior output slot, but we'll leak any exteriors as we
- * do that. *)
+ if not initializing
+ then
+ begin
+ match call.call_callee_ty with
+ Ast.TY_fn (tsig, _) ->
+ drop_slot (get_ty_params_of_current_frame()) call.call_output
+ tsig.Ast.sig_output_slot None;
+ | _ -> bug () "calling non-fn"
+ end;
callee_fptr
and callee_drop_slot
diff --git a/src/test/run-pass/output-slot-variants.rs b/src/test/run-pass/output-slot-variants.rs
new file mode 100644
index 00000000..65d03fd8
--- /dev/null
+++ b/src/test/run-pass/output-slot-variants.rs
@@ -0,0 +1,58 @@
+fn ret_int_i() -> int {
+ ret 10;
+}
+
+fn ret_ext_i() -> @int {
+ ret 10;
+}
+
+fn ret_int_tup() -> tup(int,int) {
+ ret tup(10, 10);
+}
+
+fn ret_ext_tup() -> @tup(int,int) {
+ ret tup(10, 10);
+}
+
+fn ret_ext_mem() -> tup(@int, @int) {
+ ret tup(@10, @10);
+}
+
+fn ret_ext_ext_mem() -> @tup(@int, @int) {
+ ret tup(@10, @10);
+}
+
+fn main() {
+
+ let int int_i;
+ let @int ext_i;
+ let tup(int,int) int_tup;
+ let @tup(int,int) ext_tup;
+ let tup(@int,@int) ext_mem;
+ let @tup(@int,@int) ext_ext_mem;
+
+ int_i = ret_int_i(); // initializing
+ int_i = ret_int_i(); // non-initializing
+ int_i = ret_int_i(); // non-initializing
+
+ //ext_i = ret_ext_i(); // initializing
+ //ext_i = ret_ext_i(); // non-initializing
+ //ext_i = ret_ext_i(); // non-initializing
+
+ int_tup = ret_int_tup(); // initializing
+ int_tup = ret_int_tup(); // non-initializing
+ int_tup = ret_int_tup(); // non-initializing
+
+ //ext_tup = ret_ext_tup(); // initializing
+ //ext_tup = ret_ext_tup(); // non-initializing
+ //ext_tup = ret_ext_tup(); // non-initializing
+
+ ext_mem = ret_ext_mem(); // initializing
+ ext_mem = ret_ext_mem(); // non-initializing
+ ext_mem = ret_ext_mem(); // non-initializing
+
+ //ext_ext_mem = ret_ext_ext_mem(); // initializing
+ //ext_ext_mem = ret_ext_ext_mem(); // non-initializing
+ //ext_ext_mem = ret_ext_ext_mem(); // non-initializing
+
+}