about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAmanieu d'Antras <amanieu@gmail.com>2015-11-09 16:36:11 +0000
committerAmanieu d'Antras <amanieu@gmail.com>2015-12-05 08:18:30 +0000
commitce5b0351a57dcf335ea214de3ff59466e9b929d9 (patch)
tree3bac2d19dad914c25ffec49b5ba7e04e6c8efc92
parent9d7b113b44457ae20cb90828f63edb1f6cea2f06 (diff)
downloadrust-ce5b0351a57dcf335ea214de3ff59466e9b929d9.tar.gz
rust-ce5b0351a57dcf335ea214de3ff59466e9b929d9.zip
Fix liveness analysis for read-write inline asm operands
-rw-r--r--src/librustc/middle/liveness.rs5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs
index 5170b377324..9c8cc45d396 100644
--- a/src/librustc/middle/liveness.rs
+++ b/src/librustc/middle/liveness.rs
@@ -1167,13 +1167,14 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
           hir::ExprInlineAsm(ref ia) => {
 
             let succ = ia.outputs.iter().rev().fold(succ,
-                |succ, &(_, ref expr, _, is_indirect)| {
+                |succ, &(_, ref expr, is_rw, is_indirect)| {
                     // see comment on lvalues
                     // in propagate_through_lvalue_components()
                     if is_indirect {
                         self.propagate_through_expr(&**expr, succ)
                     } else {
-                        let succ = self.write_lvalue(&**expr, succ, ACC_WRITE);
+                        let acc = if is_rw { ACC_WRITE|ACC_READ } else { ACC_WRITE };
+                        let succ = self.write_lvalue(&**expr, succ, acc);
                         self.propagate_through_lvalue_components(&**expr, succ)
                     }
                 }