@@ -1347,7 +1347,15 @@ pub impl Liveness {
13471347 self.propagate_through_expr(e, succ)
13481348 }
13491349
1350- expr_inline_asm(*) |
1350+ expr_inline_asm(_, ins, outs, _, _, _) =>{
1351+ let succ = do ins.foldr(succ) |&(_, expr), succ| {
1352+ self.propagate_through_expr(expr, succ)
1353+ };
1354+ do outs.foldr(succ) |&(_, expr), succ| {
1355+ self.propagate_through_expr(expr, succ)
1356+ }
1357+ }
1358+
13511359 expr_lit(*) => {
13521360 succ
13531361 }
@@ -1613,6 +1621,20 @@ fn check_expr(expr: @expr, &&self: @Liveness, vt: vt<@Liveness>) {
16131621 visit:: visit_expr( expr, self , vt) ;
16141622 }
16151623
1624+ expr_inline_asm( _, ins, outs, _, _, _) => {
1625+ for ins. each |& ( _, in) | {
1626+ ( vt. visit_expr) ( in, self , vt) ;
1627+ }
1628+
1629+ // Output operands must be lvalues
1630+ for outs. each |& ( _, out) | {
1631+ self . check_lvalue( out, vt) ;
1632+ ( vt. visit_expr) ( out, self , vt) ;
1633+ }
1634+
1635+ visit:: visit_expr( expr, self , vt) ;
1636+ }
1637+
16161638 // no correctness conditions related to liveness
16171639 expr_call( * ) | expr_method_call( * ) | expr_if( * ) | expr_match( * ) |
16181640 expr_while( * ) | expr_loop( * ) | expr_index( * ) | expr_field( * ) |
@@ -1621,7 +1643,7 @@ fn check_expr(expr: @expr, &&self: @Liveness, vt: vt<@Liveness>) {
16211643 expr_cast( * ) | expr_unary( * ) | expr_ret( * ) | expr_break( * ) |
16221644 expr_again( * ) | expr_lit( _) | expr_block( * ) | expr_swap( * ) |
16231645 expr_mac( * ) | expr_addr_of( * ) | expr_struct( * ) | expr_repeat( * ) |
1624- expr_paren( * ) | expr_inline_asm ( * ) => {
1646+ expr_paren( * ) => {
16251647 visit:: visit_expr( expr, self , vt) ;
16261648 }
16271649 }
0 commit comments