diff --git a/src/librustc/ich/impls_mir.rs b/src/librustc/ich/impls_mir.rs index ec54613d1db..656f5795e18 100644 --- a/src/librustc/ich/impls_mir.rs +++ b/src/librustc/ich/impls_mir.rs @@ -194,11 +194,13 @@ for mir::TerminatorKind<'gcx> { mir::TerminatorKind::Call { ref func, ref args, ref destination, - cleanup } => { + cleanup, + from_hir_call, } => { func.hash_stable(hcx, hasher); args.hash_stable(hcx, hasher); destination.hash_stable(hcx, hasher); cleanup.hash_stable(hcx, hasher); + from_hir_call.hash_stable(hcx, hasher); } mir::TerminatorKind::Assert { ref cond, expected, diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index 27ef01b93cd..98d81bd639e 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -1049,6 +1049,9 @@ pub enum TerminatorKind<'tcx> { destination: Option<(Place<'tcx>, BasicBlock)>, /// Cleanups to be done if the call unwinds. cleanup: Option, + /// Whether this is from a call in HIR, rather than from an overloaded + /// operator. True for overloaded function call. + from_hir_call: bool, }, /// Jump to the target if the condition has the expected value, @@ -2810,6 +2813,7 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> { ref args, ref destination, cleanup, + from_hir_call, } => { let dest = destination .as_ref() @@ -2820,6 +2824,7 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> { args: args.fold_with(folder), destination: dest, cleanup, + from_hir_call, } } Assert { diff --git a/src/librustc/mir/visit.rs b/src/librustc/mir/visit.rs index 6de7e2215bf..cbfbed90c90 100644 --- a/src/librustc/mir/visit.rs +++ b/src/librustc/mir/visit.rs @@ -468,7 +468,8 @@ macro_rules! make_mir_visitor { TerminatorKind::Call { ref $($mutability)* func, ref $($mutability)* args, ref $($mutability)* destination, - cleanup } => { + cleanup, + from_hir_call: _, } => { self.visit_operand(func, source_location); for arg in args { self.visit_operand(arg, source_location); diff --git a/src/librustc_codegen_llvm/mir/block.rs b/src/librustc_codegen_llvm/mir/block.rs index 709fceb4925..db95b46c38e 100644 --- a/src/librustc_codegen_llvm/mir/block.rs +++ b/src/librustc_codegen_llvm/mir/block.rs @@ -412,7 +412,13 @@ impl FunctionCx<'a, 'll, 'tcx> { bug!("undesugared DropAndReplace in codegen: {:?}", terminator); } - mir::TerminatorKind::Call { ref func, ref args, ref destination, cleanup } => { + mir::TerminatorKind::Call { + ref func, + ref args, + ref destination, + cleanup, + from_hir_call: _ + } => { // Create the callee. This is a fn ptr or zero-sized and hence a kind of scalar. let callee = self.codegen_operand(&bx, func); diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 6ecbc5ee727..103cb3b2a31 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -667,6 +667,7 @@ impl<'cx, 'gcx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx ref args, ref destination, cleanup: _, + from_hir_call: _, } => { self.consume_operand(ContextKind::CallOperator.new(loc), (func, span), flow_state); for arg in args { diff --git a/src/librustc_mir/borrow_check/nll/invalidation.rs b/src/librustc_mir/borrow_check/nll/invalidation.rs index f19c102adcf..a9b5531bae5 100644 --- a/src/librustc_mir/borrow_check/nll/invalidation.rs +++ b/src/librustc_mir/borrow_check/nll/invalidation.rs @@ -203,6 +203,7 @@ impl<'cx, 'tcx, 'gcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx, 'gcx> { ref args, ref destination, cleanup: _, + from_hir_call: _, } => { self.consume_operand(ContextKind::CallOperator.new(location), func); for arg in args { diff --git a/src/librustc_mir/build/expr/into.rs b/src/librustc_mir/build/expr/into.rs index 5708ac4e6b5..c9dfbc2f00f 100644 --- a/src/librustc_mir/build/expr/into.rs +++ b/src/librustc_mir/build/expr/into.rs @@ -264,7 +264,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { ); exit_block.unit() } - ExprKind::Call { ty, fun, args } => { + ExprKind::Call { ty, fun, args, from_hir_call } => { // FIXME(canndrew): This is_never should probably be an is_uninhabited let diverges = expr.ty.is_never(); let intrinsic = match ty.sty { @@ -326,6 +326,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { } else { Some((destination.clone(), success)) }, + from_hir_call, }, ); success.unit() diff --git a/src/librustc_mir/build/matches/test.rs b/src/librustc_mir/build/matches/test.rs index caef3ef80db..a8713286f18 100644 --- a/src/librustc_mir/build/matches/test.rs +++ b/src/librustc_mir/build/matches/test.rs @@ -361,6 +361,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { args: vec![val, expect], destination: Some((eq_result.clone(), eq_block)), cleanup: Some(cleanup), + from_hir_call: false, }); // check the result diff --git a/src/librustc_mir/dataflow/mod.rs b/src/librustc_mir/dataflow/mod.rs index 1e362e6f0dc..da4bd780eb4 100644 --- a/src/librustc_mir/dataflow/mod.rs +++ b/src/librustc_mir/dataflow/mod.rs @@ -795,7 +795,7 @@ impl<'a, 'tcx: 'a, D> DataflowAnalysis<'a, 'tcx, D> where D: BitDenotation self.propagate_bits_into_entry_set_for(in_out, *target, dirty_list); } } - mir::TerminatorKind::Call { cleanup, ref destination, func: _, args: _ } => { + mir::TerminatorKind::Call { cleanup, ref destination, .. } => { if let Some(unwind) = cleanup { if !self.dead_unwinds.contains(bb) { self.propagate_bits_into_entry_set_for(in_out, unwind, dirty_list); diff --git a/src/librustc_mir/dataflow/move_paths/builder.rs b/src/librustc_mir/dataflow/move_paths/builder.rs index 2884b15ca47..32b11870116 100644 --- a/src/librustc_mir/dataflow/move_paths/builder.rs +++ b/src/librustc_mir/dataflow/move_paths/builder.rs @@ -380,7 +380,13 @@ impl<'b, 'a, 'gcx, 'tcx> Gatherer<'b, 'a, 'gcx, 'tcx> { self.gather_operand(value); self.gather_init(location, InitKind::Deep); } - TerminatorKind::Call { ref func, ref args, ref destination, cleanup: _ } => { + TerminatorKind::Call { + ref func, + ref args, + ref destination, + cleanup: _, + from_hir_call: _, + } => { self.gather_operand(func); for arg in args { self.gather_operand(arg); diff --git a/src/librustc_mir/hair/cx/expr.rs b/src/librustc_mir/hair/cx/expr.rs index 3183f0f47ea..aff091ccc54 100644 --- a/src/librustc_mir/hair/cx/expr.rs +++ b/src/librustc_mir/hair/cx/expr.rs @@ -21,6 +21,7 @@ use rustc::ty::cast::CastKind as TyCastKind; use rustc::hir; use rustc::hir::def_id::LocalDefId; use rustc::mir::{BorrowKind}; +use syntax_pos::Span; impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr { type Output = Expr<'tcx>; @@ -232,9 +233,9 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>, let kind = match expr.node { // Here comes the interesting stuff: - hir::ExprKind::MethodCall(.., ref args) => { + hir::ExprKind::MethodCall(_, method_span, ref args) => { // Rewrite a.b(c) into UFCS form like Trait::b(a, c) - let expr = method_callee(cx, expr, None); + let expr = method_callee(cx, expr, method_span,None); let args = args.iter() .map(|e| e.to_ref()) .collect(); @@ -242,6 +243,7 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>, ty: expr.ty, fun: expr.to_ref(), args, + from_hir_call: true, } } @@ -254,7 +256,7 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>, // rewrite f(u, v) into FnOnce::call_once(f, (u, v)) - let method = method_callee(cx, expr, None); + let method = method_callee(cx, expr, fun.span,None); let arg_tys = args.iter().map(|e| cx.tables().expr_ty_adjusted(e)); let tupled_args = Expr { @@ -268,6 +270,7 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>, ty: method.ty, fun: method.to_ref(), args: vec![fun.to_ref(), tupled_args.to_ref()], + from_hir_call: true, } } else { let adt_data = if let hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) = @@ -321,6 +324,7 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>, ty: cx.tables().node_id_to_type(fun.hir_id), fun: fun.to_ref(), args: args.to_ref(), + from_hir_call: true, } } } @@ -812,6 +816,7 @@ fn user_annotated_ty_for_adt( fn method_callee<'a, 'gcx, 'tcx>( cx: &mut Cx<'a, 'gcx, 'tcx>, expr: &hir::Expr, + span: Span, overloaded_callee: Option<(DefId, &'tcx Substs<'tcx>)>, ) -> Expr<'tcx> { let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); @@ -832,7 +837,7 @@ fn method_callee<'a, 'gcx, 'tcx>( Expr { temp_lifetime, ty, - span: expr.span, + span, kind: ExprKind::Literal { literal: ty::Const::zero_sized(cx.tcx(), ty), user_ty, @@ -1093,11 +1098,12 @@ fn overloaded_operator<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>, expr: &'tcx hir::Expr, args: Vec>) -> ExprKind<'tcx> { - let fun = method_callee(cx, expr, None); + let fun = method_callee(cx, expr, expr.span, None); ExprKind::Call { ty: fun.ty, fun: fun.to_ref(), args, + from_hir_call: false, } } @@ -1132,7 +1138,7 @@ fn overloaded_place<'a, 'gcx, 'tcx>( // construct the complete expression `foo()` for the overloaded call, // which will yield the &T type let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); - let fun = method_callee(cx, expr, overloaded_callee); + let fun = method_callee(cx, expr, expr.span, overloaded_callee); let ref_expr = Expr { temp_lifetime, ty: ref_ty, @@ -1141,6 +1147,7 @@ fn overloaded_place<'a, 'gcx, 'tcx>( ty: fun.ty, fun: fun.to_ref(), args, + from_hir_call: false, }, }; diff --git a/src/librustc_mir/hair/mod.rs b/src/librustc_mir/hair/mod.rs index d86aee54312..818c4f6b9cf 100644 --- a/src/librustc_mir/hair/mod.rs +++ b/src/librustc_mir/hair/mod.rs @@ -150,6 +150,9 @@ pub enum ExprKind<'tcx> { ty: Ty<'tcx>, fun: ExprRef<'tcx>, args: Vec>, + // Whether this is from a call in HIR, rather than from an overloaded + // operator. True for overloaded function call. + from_hir_call: bool, }, Deref { arg: ExprRef<'tcx>, diff --git a/src/librustc_mir/shim.rs b/src/librustc_mir/shim.rs index 7ba72366af7..6c3dd0ea3cc 100644 --- a/src/librustc_mir/shim.rs +++ b/src/librustc_mir/shim.rs @@ -468,6 +468,7 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> { args: vec![Operand::Move(ref_loc)], destination: Some((dest, next)), cleanup: Some(cleanup), + from_hir_call: true, }, false); } @@ -766,7 +767,8 @@ fn build_call_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, Some(BasicBlock::new(3)) } else { None - } + }, + from_hir_call: true, }, false); if let Adjustment::RefMut = rcvr_adjustment { diff --git a/src/librustc_mir/transform/lower_128bit.rs b/src/librustc_mir/transform/lower_128bit.rs index b2ddbe04d75..bd7d9d36761 100644 --- a/src/librustc_mir/transform/lower_128bit.rs +++ b/src/librustc_mir/transform/lower_128bit.rs @@ -121,6 +121,7 @@ impl Lower128Bit { args: vec![lhs, rhs], destination: Some((place, bb)), cleanup: None, + from_hir_call: false, }, }); } diff --git a/src/librustc_mir/transform/promote_consts.rs b/src/librustc_mir/transform/promote_consts.rs index 34339b06341..f4efe33da70 100644 --- a/src/librustc_mir/transform/promote_consts.rs +++ b/src/librustc_mir/transform/promote_consts.rs @@ -258,7 +258,7 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { }; match terminator.kind { - TerminatorKind::Call { mut func, mut args, .. } => { + TerminatorKind::Call { mut func, mut args, from_hir_call, .. } => { self.visit_operand(&mut func, loc); for arg in &mut args { self.visit_operand(arg, loc); @@ -272,7 +272,8 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { func, args, cleanup: None, - destination: Some((Place::Local(new_temp), new_target)) + destination: Some((Place::Local(new_temp), new_target)), + from_hir_call, }, ..terminator }; diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index 98420115d75..aa559c96ec6 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -318,6 +318,7 @@ fn check_terminator( TerminatorKind::Call { func, args, + from_hir_call: _, destination: _, cleanup: _, } => { diff --git a/src/librustc_mir/util/elaborate_drops.rs b/src/librustc_mir/util/elaborate_drops.rs index 9b8165181cc..1dca367ffdf 100644 --- a/src/librustc_mir/util/elaborate_drops.rs +++ b/src/librustc_mir/util/elaborate_drops.rs @@ -545,8 +545,9 @@ impl<'l, 'b, 'tcx, D> DropCtxt<'l, 'b, 'tcx, D> args: vec![Operand::Move(Place::Local(ref_place))], destination: Some((unit_temp, succ)), cleanup: unwind.into_option(), + from_hir_call: true, }, - source_info: self.source_info + source_info: self.source_info, }), is_cleanup: unwind.is_cleanup(), }; @@ -903,7 +904,8 @@ impl<'l, 'b, 'tcx, D> DropCtxt<'l, 'b, 'tcx, D> func: Operand::function_handle(tcx, free_func, substs, self.source_info.span), args: args, destination: Some((unit_temp, target)), - cleanup: None + cleanup: None, + from_hir_call: false, }; // FIXME(#43234) let free_block = self.new_block(unwind, call);