about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRoy Frostig <rfrostig@mozilla.com>2010-07-19 19:06:55 -0700
committerRoy Frostig <rfrostig@mozilla.com>2010-07-19 19:06:55 -0700
commitae515c017c0aadb2a4c691804f1bc3b8b343dd67 (patch)
tree162a9bce32a712db96d45ed20f7c8e2e20355ae3 /src
parentfde9ca0937171b77542028ef433fddf979aa506b (diff)
downloadrust-ae515c017c0aadb2a4c691804f1bc3b8b343dd67.tar.gz
rust-ae515c017c0aadb2a4c691804f1bc3b8b343dd67.zip
ctxt_auto_deref_lval decides whether to autoderef the entire lval, not its base.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile1
-rw-r--r--src/boot/me/trans.ml41
-rw-r--r--src/test/run-pass/autoderef-full-lval.rs18
3 files changed, 43 insertions, 17 deletions
diff --git a/src/Makefile b/src/Makefile
index adc3ec170cc..628eab62a1a 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-full-lval.rs \
                       autoderef-objfn.rs \
                       basic.rs \
                       bind-obj-ctor.rs \
diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml
index d1e707b7d72..d8128196717 100644
--- a/src/boot/me/trans.ml
+++ b/src/boot/me/trans.ml
@@ -973,33 +973,40 @@ let trans_visitor
       (lv:Ast.lval)
       : (Il.cell * Ast.ty) =
 
-    let rec trans_slot_lval_full (initializing:bool) lv =
+    let rec trans_slot_lval_full (initializing:bool) (outermost:bool) lv =
       let (cell, ty) =
         match lv with
             Ast.LVAL_ext (base, comp) ->
               let (base_cell, base_ty) =
-                trans_slot_lval_full initializing base
+                trans_slot_lval_full initializing false base
               in
                 trans_slot_lval_ext initializing base_ty base_cell comp
 
-          | Ast.LVAL_base nbi ->
+          | Ast.LVAL_base _ ->
               let sloti = lval_base_to_slot cx lv in
               let cell = cell_of_block_slot sloti.id in
               let ty = slot_ty sloti.node in
               let cell = deref_slot initializing cell sloti.node in
-              let dctrl =
-                (* If this fails, type didn't visit the lval, and we
-                 * don't know whether to auto-deref its base. Crashing
-                 * here is best. Compiler bug.
-                 *)
-                match htab_search cx.ctxt_auto_deref_lval nbi.id with
-                    None ->
-                      bugi cx nbi.id
-                        "Lval without auto-deref info; bad typecheck?"
-                  | Some true -> DEREF_all_boxes
-                  | Some false -> DEREF_none
-              in
-                deref_ty dctrl initializing cell ty
+                (cell, ty)
+      in
+      let (cell, ty) =
+        if outermost
+        then
+          let id = lval_base_id lv in
+          let dctrl =
+            (* If this fails, type didn't visit the lval, and we
+             * don't know whether to auto-deref the entire lval.
+             * Crashing here is best. Compiler bug.
+             *)
+            match htab_search cx.ctxt_auto_deref_lval id with
+                None ->
+                  bugi cx id
+                    "Lval without auto-deref info; bad typecheck?"
+              | Some true -> DEREF_all_boxes
+              | Some false -> DEREF_none
+          in
+            deref_ty dctrl initializing cell ty
+        else (cell, ty)
       in
         iflog
           begin
@@ -1013,7 +1020,7 @@ let trans_visitor
 
     in
       if lval_is_slot cx lv
-      then trans_slot_lval_full initializing lv
+      then trans_slot_lval_full initializing true lv
       else
         if initializing
         then err None "init item"
diff --git a/src/test/run-pass/autoderef-full-lval.rs b/src/test/run-pass/autoderef-full-lval.rs
new file mode 100644
index 00000000000..956a7eb440b
--- /dev/null
+++ b/src/test/run-pass/autoderef-full-lval.rs
@@ -0,0 +1,18 @@
+// -*- rust -*-
+
+type clam = rec(@int x, @int y);
+type fish = tup(@int);
+
+fn main() {
+  let clam a = rec(x=@1, y=@2);
+  let clam b = rec(x=@10, y=@20);
+  let int z = a.x + b.y;
+  log z;
+  check (z == 21);
+
+  let fish forty = tup(@40);
+  let fish two = tup(@2);
+  let int answer = forty._0 + two._0;
+  log answer;
+  check (answer == 42);
+}