diff options
| author | Roy Frostig <[email protected]> | 2010-07-19 18:19:31 -0700 |
|---|---|---|
| committer | Roy Frostig <[email protected]> | 2010-07-19 18:25:26 -0700 |
| commit | fde9ca0937171b77542028ef433fddf979aa506b (patch) | |
| tree | fcf675dbbca7d865cc05b8cb76683b7de5138e86 | |
| parent | Include the statements on the LHS of a binop when desugaring. Closes #117. (diff) | |
| download | rust-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.
| -rw-r--r-- | src/Makefile | 1 | ||||
| -rw-r--r-- | src/boot/me/trans.ml | 13 | ||||
| -rw-r--r-- | src/test/run-pass/autoderef-objfn.rs | 16 |
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); +} |