aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoy Frostig <[email protected]>2010-07-19 18:19:31 -0700
committerRoy Frostig <[email protected]>2010-07-19 18:25:26 -0700
commitfde9ca0937171b77542028ef433fddf979aa506b (patch)
treefcf675dbbca7d865cc05b8cb76683b7de5138e86 /src
parentInclude the statements on the LHS of a binop when desugaring. Closes #117. (diff)
downloadrust-fde9ca0937171b77542028ef433fddf979aa506b.tar.xz
rust-fde9ca0937171b77542028ef433fddf979aa506b.zip
Autoderef objects when passing them as implicit (indirect) arg upon vtbl-dispatch. Add testcase and XFAIL it on LLVM. Closes #112.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile1
-rw-r--r--src/boot/me/trans.ml13
-rw-r--r--src/test/run-pass/autoderef-objfn.rs16
3 files changed, 28 insertions, 2 deletions
diff --git a/src/Makefile b/src/Makefile
index 79164467..adc3ec17 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -386,6 +386,7 @@ TEST_XFAILS_LLVM := $(addprefix test/run-pass/, \
acyclic-unwind.rs \
alt-pattern-simple.rs \
alt-tag.rs \
+ autoderef-objfn.rs \
basic.rs \
bind-obj-ctor.rs \
bind-thunk.rs \
diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml
index 6f496775..d1e707b7 100644
--- a/src/boot/me/trans.ml
+++ b/src/boot/me/trans.ml
@@ -3912,8 +3912,17 @@ let trans_visitor
if cc = CALL_direct
then zero
else
- let (pair_cell, _) = trans_lval pair_lval in
- Il.Cell (get_element_ptr pair_cell Abi.fn_field_closure)
+ let (pair_cell, ty) = trans_lval pair_lval in
+ let (pair_cell, _) =
+ if cc = CALL_vtbl
+ (* |pair_lval| here is the obj to whose vtbl we're dispatching.
+ * Said obj might have been auto-deref'ed for the method call,
+ * so we have to be sure to do the same here.
+ *)
+ then deref_ty DEREF_all_boxes false pair_cell ty
+ else (pair_cell, ty)
+ in
+ Il.Cell (get_element_ptr pair_cell Abi.binding_field_bound_data)
and call_ctrl flv : call_ctrl =
if lval_is_static cx flv
diff --git a/src/test/run-pass/autoderef-objfn.rs b/src/test/run-pass/autoderef-objfn.rs
new file mode 100644
index 00000000..ed6f3cc4
--- /dev/null
+++ b/src/test/run-pass/autoderef-objfn.rs
@@ -0,0 +1,16 @@
+// -*- rust -*-
+
+obj clam() {
+ fn chowder() {
+ log "in clam chowder";
+ }
+}
+
+fn foo(@clam c) {
+ c.chowder();
+}
+
+fn main() {
+ let clam c = clam();
+ foo(@c);
+}