summaryrefslogtreecommitdiff
path: root/src/librustc_mir/build/expr/as_rvalue.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/librustc_mir/build/expr/as_rvalue.rs')
-rw-r--r--src/librustc_mir/build/expr/as_rvalue.rs25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/librustc_mir/build/expr/as_rvalue.rs b/src/librustc_mir/build/expr/as_rvalue.rs
index 2338d7df01a..4c0e9b98d9a 100644
--- a/src/librustc_mir/build/expr/as_rvalue.rs
+++ b/src/librustc_mir/build/expr/as_rvalue.rs
@@ -39,8 +39,20 @@ impl<'a,'tcx> Builder<'a,'tcx> {
ExprKind::Scope { extent, value } => {
this.in_scope(extent, block, |this| this.as_rvalue(block, value))
}
- ExprKind::InlineAsm { asm } => {
- block.and(Rvalue::InlineAsm(asm.clone()))
+ ExprKind::InlineAsm { asm, outputs, inputs } => {
+ let outputs = outputs.into_iter().map(|output| {
+ unpack!(block = this.as_lvalue(block, output))
+ }).collect();
+
+ let inputs = inputs.into_iter().map(|input| {
+ unpack!(block = this.as_operand(block, input))
+ }).collect();
+
+ block.and(Rvalue::InlineAsm {
+ asm: asm.clone(),
+ outputs: outputs,
+ inputs: inputs
+ })
}
ExprKind::Repeat { value, count } => {
let value_operand = unpack!(block = this.as_operand(block, value));
@@ -73,8 +85,13 @@ impl<'a,'tcx> Builder<'a,'tcx> {
})
}
ExprKind::Cast { source } => {
- let source = unpack!(block = this.as_operand(block, source));
- block.and(Rvalue::Cast(CastKind::Misc, source, expr.ty))
+ let source = this.hir.mirror(source);
+ if source.ty == expr.ty {
+ this.expr_as_rvalue(block, source)
+ } else {
+ let source = unpack!(block = this.as_operand(block, source));
+ block.and(Rvalue::Cast(CastKind::Misc, source, expr.ty))
+ }
}
ExprKind::ReifyFnPointer { source } => {
let source = unpack!(block = this.as_operand(block, source));