diff --git a/compiler/rustc_middle/src/mir/visit.rs b/compiler/rustc_middle/src/mir/visit.rs index a618800cc1bd2..7320a5690693b 100644 --- a/compiler/rustc_middle/src/mir/visit.rs +++ b/compiler/rustc_middle/src/mir/visit.rs @@ -162,6 +162,9 @@ macro_rules! make_mir_visitor { self.super_constant(constant, location); } + // The macro results in a false positive of sorts, where &mut Span + // is fine, but &Span is not; just allow the lint. + #[allow(rustc::pass_by_value)] fn visit_span(&mut self, span: & $($mutability)? Span) { self.super_span(span); @@ -869,6 +872,9 @@ macro_rules! make_mir_visitor { } } + // The macro results in a false positive of sorts, where &mut Span + // is fine, but &Span is not; just allow the lint. + #[allow(rustc::pass_by_value)] fn super_span(&mut self, _span: & $($mutability)? Span) { } diff --git a/compiler/rustc_mir_build/src/build/scope.rs b/compiler/rustc_mir_build/src/build/scope.rs index 84d6c1d2db87f..b2ea2889b3e04 100644 --- a/compiler/rustc_mir_build/src/build/scope.rs +++ b/compiler/rustc_mir_build/src/build/scope.rs @@ -671,7 +671,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // a Coverage code region can be generated, `continue` needs no `Assign`; but // without one, the `InstrumentCoverage` MIR pass cannot generate a code region for // `continue`. Coverage will be missing unless we add a dummy `Assign` to MIR. - self.add_dummy_assignment(&span, block, source_info); + self.add_dummy_assignment(span, block, source_info); } } @@ -730,8 +730,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Add a dummy `Assign` statement to the CFG, with the span for the source code's `continue` // statement. - fn add_dummy_assignment(&mut self, span: &Span, block: BasicBlock, source_info: SourceInfo) { - let local_decl = LocalDecl::new(self.tcx.mk_unit(), *span).internal(); + fn add_dummy_assignment(&mut self, span: Span, block: BasicBlock, source_info: SourceInfo) { + let local_decl = LocalDecl::new(self.tcx.mk_unit(), span).internal(); let temp_place = Place::from(self.local_decls.push(local_decl)); self.cfg.push_assign_unit(block, source_info, temp_place, self.tcx); } diff --git a/compiler/rustc_mir_transform/src/coverage/spans.rs b/compiler/rustc_mir_transform/src/coverage/spans.rs index d1cb2826dedfc..27b9b6c2fa3e7 100644 --- a/compiler/rustc_mir_transform/src/coverage/spans.rs +++ b/compiler/rustc_mir_transform/src/coverage/spans.rs @@ -47,9 +47,9 @@ impl CoverageStatement { } } - pub fn span(&self) -> &Span { + pub fn span(&self) -> Span { match self { - Self::Statement(_, span, _) | Self::Terminator(_, span) => span, + Self::Statement(_, span, _) | Self::Terminator(_, span) => *span, } } } diff --git a/compiler/rustc_span/src/lib.rs b/compiler/rustc_span/src/lib.rs index 9d4c2e3bb84a3..6d7377927c291 100644 --- a/compiler/rustc_span/src/lib.rs +++ b/compiler/rustc_span/src/lib.rs @@ -22,6 +22,7 @@ #![feature(negative_impls)] #![feature(nll)] #![feature(min_specialization)] +#![feature(rustc_attrs)] #![allow(rustc::potential_query_instability)] #[macro_use] diff --git a/compiler/rustc_span/src/span_encoding.rs b/compiler/rustc_span/src/span_encoding.rs index cd382d6c956ca..3ee329e9736f2 100644 --- a/compiler/rustc_span/src/span_encoding.rs +++ b/compiler/rustc_span/src/span_encoding.rs @@ -61,8 +61,7 @@ use rustc_data_structures::fx::FxIndexSet; /// using the callback `SPAN_TRACK` to access the query engine. /// #[derive(Clone, Copy, Eq, PartialEq, Hash)] -// FIXME: Enable this in the bootstrap bump, but separate commit. -// #[rustc_pass_by_value] +#[rustc_pass_by_value] pub struct Span { base_or_index: u32, len_or_tag: u16, diff --git a/compiler/rustc_typeck/src/check/expr.rs b/compiler/rustc_typeck/src/check/expr.rs index f84036a7a3990..8d4ffefda73bb 100644 --- a/compiler/rustc_typeck/src/check/expr.rs +++ b/compiler/rustc_typeck/src/check/expr.rs @@ -271,7 +271,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ExprKind::Box(subexpr) => self.check_expr_box(subexpr, expected), ExprKind::Lit(ref lit) => self.check_lit(&lit, expected), ExprKind::Binary(op, lhs, rhs) => self.check_binop(expr, op, lhs, rhs), - ExprKind::Assign(lhs, rhs, ref span) => { + ExprKind::Assign(lhs, rhs, span) => { self.check_expr_assign(expr, expected, lhs, rhs, span) } ExprKind::AssignOp(op, lhs, rhs) => self.check_binop_assign(expr, op, lhs, rhs), @@ -982,7 +982,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { expected: Expectation<'tcx>, lhs: &'tcx hir::Expr<'tcx>, rhs: &'tcx hir::Expr<'tcx>, - span: &Span, + span: Span, ) -> Ty<'tcx> { let expected_ty = expected.coercion_target_type(self, expr.span); if expected_ty == self.tcx.types.bool { @@ -1014,7 +1014,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } if eq { err.span_suggestion_verbose( - *span, + span, "you might have meant to compare for equality", "==".to_string(), applicability, @@ -1031,7 +1031,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { return self.tcx.ty_error(); } - self.check_lhs_assignable(lhs, "E0070", *span); + self.check_lhs_assignable(lhs, "E0070", span); let lhs_ty = self.check_expr_with_needs(&lhs, Needs::MutPlace); let rhs_ty = self.check_expr_coercable_to_type(&rhs, lhs_ty, Some(lhs)); diff --git a/compiler/rustc_typeck/src/check/op.rs b/compiler/rustc_typeck/src/check/op.rs index 5873b0f52a60e..5dd5e71656d23 100644 --- a/compiler/rustc_typeck/src/check/op.rs +++ b/compiler/rustc_typeck/src/check/op.rs @@ -36,7 +36,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let ty = if !lhs_ty.is_ty_var() && !rhs_ty.is_ty_var() && is_builtin_binop(lhs_ty, rhs_ty, op) { - self.enforce_builtin_binop_types(&lhs.span, lhs_ty, &rhs.span, rhs_ty, op); + self.enforce_builtin_binop_types(lhs.span, lhs_ty, rhs.span, rhs_ty, op); self.tcx.mk_unit() } else { return_ty @@ -98,9 +98,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { && is_builtin_binop(lhs_ty, rhs_ty, op) { let builtin_return_ty = self.enforce_builtin_binop_types( - &lhs_expr.span, + lhs_expr.span, lhs_ty, - &rhs_expr.span, + rhs_expr.span, rhs_ty, op, ); @@ -114,9 +114,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { fn enforce_builtin_binop_types( &self, - lhs_span: &Span, + lhs_span: Span, lhs_ty: Ty<'tcx>, - rhs_span: &Span, + rhs_span: Span, rhs_ty: Ty<'tcx>, op: hir::BinOp, ) -> Ty<'tcx> { @@ -129,8 +129,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let tcx = self.tcx; match BinOpCategory::from(op) { BinOpCategory::Shortcircuit => { - self.demand_suptype(*lhs_span, tcx.types.bool, lhs_ty); - self.demand_suptype(*rhs_span, tcx.types.bool, rhs_ty); + self.demand_suptype(lhs_span, tcx.types.bool, lhs_ty); + self.demand_suptype(rhs_span, tcx.types.bool, rhs_ty); tcx.types.bool } @@ -141,13 +141,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { BinOpCategory::Math | BinOpCategory::Bitwise => { // both LHS and RHS and result will have the same type - self.demand_suptype(*rhs_span, lhs_ty, rhs_ty); + self.demand_suptype(rhs_span, lhs_ty, rhs_ty); lhs_ty } BinOpCategory::Comparison => { // both LHS and RHS and result will have the same type - self.demand_suptype(*rhs_span, lhs_ty, rhs_ty); + self.demand_suptype(rhs_span, lhs_ty, rhs_ty); tcx.types.bool } } diff --git a/src/tools/rustfmt/src/expr.rs b/src/tools/rustfmt/src/expr.rs index e1865c8afc2f0..4f333cd27cefe 100644 --- a/src/tools/rustfmt/src/expr.rs +++ b/src/tools/rustfmt/src/expr.rs @@ -1533,7 +1533,7 @@ fn rewrite_struct_lit<'a>( enum StructLitField<'a> { Regular(&'a ast::ExprField), Base(&'a ast::Expr), - Rest(&'a Span), + Rest(Span), } // 2 = " {".len() @@ -1568,7 +1568,7 @@ fn rewrite_struct_lit<'a>( let field_iter = fields.iter().map(StructLitField::Regular).chain( match struct_rest { ast::StructRest::Base(expr) => Some(StructLitField::Base(&**expr)), - ast::StructRest::Rest(span) => Some(StructLitField::Rest(span)), + ast::StructRest::Rest(span) => Some(StructLitField::Rest(*span)), ast::StructRest::None => None, } .into_iter(),