Auto merge of #71201 - Dylan-DPC:rollup-23202uf, r=Dylan-DPC

Rollup of 5 pull requests

Successful merges:

 - #70566 (Don't bail out before linting in generic contexts.)
 - #71141 (Provide better compiler output when using `?` on `Option` in fn returning `Result` and vice-versa)
 - #71149 (remove an impossible branch from check_consts)
 - #71179 (fix more clippy warnings)
 - #71191 (Clean up E0520 explanation)

Failed merges:

r? @ghost
This commit is contained in:
bors 2020-04-16 18:02:11 +00:00
commit 7f3df57724
41 changed files with 318 additions and 255 deletions

View File

@ -971,7 +971,7 @@ impl<T> Vec<T> {
} }
let len = self.len(); let len = self.len();
if !(index < len) { if index >= len {
assert_failed(index, len); assert_failed(index, len);
} }
unsafe { unsafe {
@ -1010,7 +1010,7 @@ impl<T> Vec<T> {
} }
let len = self.len(); let len = self.len();
if !(index <= len) { if index > len {
assert_failed(index, len); assert_failed(index, len);
} }
@ -1058,7 +1058,7 @@ impl<T> Vec<T> {
} }
let len = self.len(); let len = self.len();
if !(index < len) { if index >= len {
assert_failed(index, len); assert_failed(index, len);
} }
unsafe { unsafe {
@ -1331,10 +1331,10 @@ impl<T> Vec<T> {
panic!("end drain index (is {}) should be <= len (is {})", end, len); panic!("end drain index (is {}) should be <= len (is {})", end, len);
} }
if !(start <= end) { if start > end {
start_assert_failed(start, end); start_assert_failed(start, end);
} }
if !(end <= len) { if end > len {
end_assert_failed(end, len); end_assert_failed(end, len);
} }
@ -1432,7 +1432,7 @@ impl<T> Vec<T> {
panic!("`at` split index (is {}) should be <= len (is {})", at, len); panic!("`at` split index (is {}) should be <= len (is {})", at, len);
} }
if !(at <= self.len()) { if at > self.len() {
assert_failed(at, self.len()); assert_failed(at, self.len());
} }

View File

@ -63,7 +63,7 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>
let span = cx.with_def_site_ctxt(span); let span = cx.with_def_site_ctxt(span);
let name = cx.expr_lit(span, ast::LitKind::Str(ident.name, ast::StrStyle::Cooked)); let name = cx.expr_lit(span, ast::LitKind::Str(ident.name, ast::StrStyle::Cooked));
let builder = cx.ident_of("debug_trait_builder", span); let builder = cx.ident_of("debug_trait_builder", span);
let builder_expr = cx.expr_ident(span, builder.clone()); let builder_expr = cx.expr_ident(span, builder);
let fmt = substr.nonself_args[0].clone(); let fmt = substr.nonself_args[0].clone();

View File

@ -1,5 +1,7 @@
A non-default implementation was already made on this type so it cannot be A non-default implementation was already made on this type so it cannot be
specialized further. Erroneous code example: specialized further.
Erroneous code example:
```compile_fail,E0520 ```compile_fail,E0520
#![feature(specialization)] #![feature(specialization)]

View File

@ -2005,7 +2005,7 @@ fn emit_to_destination(
let _buffer_lock = lock::acquire_global_lock("rustc_errors"); let _buffer_lock = lock::acquire_global_lock("rustc_errors");
for (pos, line) in rendered_buffer.iter().enumerate() { for (pos, line) in rendered_buffer.iter().enumerate() {
for part in line { for part in line {
dst.apply_style(lvl.clone(), part.style)?; dst.apply_style(*lvl, part.style)?;
write!(dst, "{}", part.text)?; write!(dst, "{}", part.text)?;
dst.reset()?; dst.reset()?;
} }

View File

@ -871,7 +871,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
return Some(()); return Some(());
} }
if let &ty::Adt(def, _) = &ta.kind { if let &ty::Adt(def, _) = &ta.kind {
let path_ = self.tcx.def_path_str(def.did.clone()); let path_ = self.tcx.def_path_str(def.did);
if path_ == other_path { if path_ == other_path {
self.highlight_outer(&mut t1_out, &mut t2_out, path, sub, i, &other_ty); self.highlight_outer(&mut t1_out, &mut t2_out, path, sub, i, &other_ty);
return Some(()); return Some(());
@ -1091,8 +1091,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
let sub_no_defaults_1 = self.strip_generic_default_params(def1.did, sub1); let sub_no_defaults_1 = self.strip_generic_default_params(def1.did, sub1);
let sub_no_defaults_2 = self.strip_generic_default_params(def2.did, sub2); let sub_no_defaults_2 = self.strip_generic_default_params(def2.did, sub2);
let mut values = (DiagnosticStyledString::new(), DiagnosticStyledString::new()); let mut values = (DiagnosticStyledString::new(), DiagnosticStyledString::new());
let path1 = self.tcx.def_path_str(def1.did.clone()); let path1 = self.tcx.def_path_str(def1.did);
let path2 = self.tcx.def_path_str(def2.did.clone()); let path2 = self.tcx.def_path_str(def2.did);
if def1.did == def2.did { if def1.did == def2.did {
// Easy case. Replace same types with `_` to shorten the output and highlight // Easy case. Replace same types with `_` to shorten the output and highlight
// the differing ones. // the differing ones.

View File

@ -452,7 +452,7 @@ where
// even though a satisfactory solution exists. // even though a satisfactory solution exists.
let generic = GenericKind::Projection(projection_ty); let generic = GenericKind::Projection(projection_ty);
let verify_bound = self.verify_bound.generic_bound(generic); let verify_bound = self.verify_bound.generic_bound(generic);
self.delegate.push_verify(origin, generic.clone(), region, verify_bound); self.delegate.push_verify(origin, generic, region, verify_bound);
} }
} }

View File

@ -297,7 +297,6 @@ impl<'cx, 'tcx> VerifyBoundCx<'cx, 'tcx> {
self.collect_outlives_from_predicate_list( self.collect_outlives_from_predicate_list(
move |ty| ty == identity_proj, move |ty| ty == identity_proj,
traits::elaborate_predicates(tcx, trait_predicates) traits::elaborate_predicates(tcx, trait_predicates)
.into_iter()
.map(|o| o.predicate) .map(|o| o.predicate)
.collect::<Vec<_>>(), .collect::<Vec<_>>(),
) )

View File

@ -1056,7 +1056,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
place: {:?}", place: {:?}",
place_span.0 place_span.0
); );
this.reservation_error_reported.insert(place_span.0.clone()); this.reservation_error_reported.insert(place_span.0);
} }
Activation(_, activating) => { Activation(_, activating) => {
debug!( debug!(

View File

@ -495,7 +495,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
// to store those. Otherwise, we'll pass in `None` to the // to store those. Otherwise, we'll pass in `None` to the
// functions below, which will trigger them to report errors // functions below, which will trigger them to report errors
// eagerly. // eagerly.
let mut outlives_requirements = infcx.tcx.is_closure(mir_def_id).then(|| vec![]); let mut outlives_requirements = infcx.tcx.is_closure(mir_def_id).then(Vec::new);
self.check_type_tests(infcx, body, outlives_requirements.as_mut(), &mut errors_buffer); self.check_type_tests(infcx, body, outlives_requirements.as_mut(), &mut errors_buffer);

View File

@ -286,7 +286,7 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> {
// Box starts out uninitialized - need to create a separate // Box starts out uninitialized - need to create a separate
// move-path for the interior so it will be separate from // move-path for the interior so it will be separate from
// the exterior. // the exterior.
self.create_move_path(self.builder.tcx.mk_place_deref(place.clone())); self.create_move_path(self.builder.tcx.mk_place_deref(*place));
self.gather_init(place.as_ref(), InitKind::Shallow); self.gather_init(place.as_ref(), InitKind::Shallow);
} else { } else {
self.gather_init(place.as_ref(), InitKind::Deep); self.gather_init(place.as_ref(), InitKind::Deep);
@ -458,9 +458,8 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> {
for offset in from..to { for offset in from..to {
let elem = let elem =
ProjectionElem::ConstantIndex { offset, min_length: len, from_end: false }; ProjectionElem::ConstantIndex { offset, min_length: len, from_end: false };
let path = self.add_move_path(base_path, &elem, |tcx| { let path =
tcx.mk_place_elem(base_place.clone(), elem) self.add_move_path(base_path, &elem, |tcx| tcx.mk_place_elem(base_place, elem));
});
self.record_move(place, path); self.record_move(place, path);
} }
} else { } else {

View File

@ -549,7 +549,7 @@ where
let n = base.len(self)?; let n = base.len(self)?;
if n < u64::from(min_length) { if n < u64::from(min_length) {
// This can only be reached in ConstProp and non-rustc-MIR. // This can only be reached in ConstProp and non-rustc-MIR.
throw_ub!(BoundsCheckFailed { len: min_length.into(), index: n.into() }); throw_ub!(BoundsCheckFailed { len: min_length.into(), index: n });
} }
let index = if from_end { let index = if from_end {

View File

@ -335,7 +335,7 @@ fn collect_items_rec<'tcx>(
recursion_depths: &mut DefIdMap<usize>, recursion_depths: &mut DefIdMap<usize>,
inlining_map: MTRef<'_, MTLock<InliningMap<'tcx>>>, inlining_map: MTRef<'_, MTLock<InliningMap<'tcx>>>,
) { ) {
if !visited.lock_mut().insert(starting_point.clone()) { if !visited.lock_mut().insert(starting_point) {
// We've been here already, no need to search again. // We've been here already, no need to search again.
return; return;
} }

View File

@ -538,7 +538,7 @@ impl CloneShimBuilder<'tcx> {
// BB #2 // BB #2
// `dest[i] = Clone::clone(src[beg])`; // `dest[i] = Clone::clone(src[beg])`;
// Goto #3 if ok, #5 if unwinding happens. // Goto #3 if ok, #5 if unwinding happens.
let dest_field = self.tcx.mk_place_index(dest.clone(), beg); let dest_field = self.tcx.mk_place_index(dest, beg);
let src_field = self.tcx.mk_place_index(src, beg); let src_field = self.tcx.mk_place_index(src, beg);
self.make_clone_call(dest_field, src_field, ty, BasicBlock::new(3), BasicBlock::new(5)); self.make_clone_call(dest_field, src_field, ty, BasicBlock::new(3), BasicBlock::new(5));
@ -620,9 +620,9 @@ impl CloneShimBuilder<'tcx> {
let mut previous_field = None; let mut previous_field = None;
for (i, ity) in tys.enumerate() { for (i, ity) in tys.enumerate() {
let field = Field::new(i); let field = Field::new(i);
let src_field = self.tcx.mk_place_field(src.clone(), field, ity); let src_field = self.tcx.mk_place_field(src, field, ity);
let dest_field = self.tcx.mk_place_field(dest.clone(), field, ity); let dest_field = self.tcx.mk_place_field(dest, field, ity);
// #(2i + 1) is the cleanup block for the previous clone operation // #(2i + 1) is the cleanup block for the previous clone operation
let cleanup_block = self.block_index_offset(1); let cleanup_block = self.block_index_offset(1);
@ -633,7 +633,7 @@ impl CloneShimBuilder<'tcx> {
// BB #(2i) // BB #(2i)
// `dest.i = Clone::clone(&src.i);` // `dest.i = Clone::clone(&src.i);`
// Goto #(2i + 2) if ok, #(2i + 1) if unwinding happens. // Goto #(2i + 2) if ok, #(2i + 1) if unwinding happens.
self.make_clone_call(dest_field.clone(), src_field, ity, next_block, cleanup_block); self.make_clone_call(dest_field, src_field, ity, next_block, cleanup_block);
// BB #(2i + 1) (cleanup) // BB #(2i + 1) (cleanup)
if let Some((previous_field, previous_cleanup)) = previous_field.take() { if let Some((previous_field, previous_cleanup)) = previous_field.take() {

View File

@ -90,16 +90,6 @@ impl NonConstOp for FnCallNonConst {
} }
} }
/// A function call where the callee is not a function definition or function pointer, e.g. a
/// closure.
///
/// This can be subdivided in the future to produce a better error message.
#[derive(Debug)]
pub struct FnCallOther;
impl NonConstOp for FnCallOther {
const IS_SUPPORTED_IN_MIRI: bool = false;
}
/// A call to a `#[unstable]` const fn or `#[rustc_const_unstable]` function. /// A call to a `#[unstable]` const fn or `#[rustc_const_unstable]` function.
/// ///
/// Contains the name of the feature that would allow the use of this function. /// Contains the name of the feature that would allow the use of this function.

View File

@ -495,11 +495,11 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> {
} }
} }
fn visit_terminator_kind(&mut self, kind: &TerminatorKind<'tcx>, location: Location) { fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) {
trace!("visit_terminator_kind: kind={:?} location={:?}", kind, location); trace!("visit_terminator: terminator={:?} location={:?}", terminator, location);
self.super_terminator_kind(kind, location); self.super_terminator(terminator, location);
match kind { match &terminator.kind {
TerminatorKind::Call { func, .. } => { TerminatorKind::Call { func, .. } => {
let fn_ty = func.ty(*self.body, self.tcx); let fn_ty = func.ty(*self.body, self.tcx);
@ -511,8 +511,7 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> {
return; return;
} }
_ => { _ => {
self.check_op(ops::FnCallOther); span_bug!(terminator.source_info.span, "invalid callee of type {:?}", fn_ty)
return;
} }
}; };

View File

@ -581,11 +581,6 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
return None; return None;
} }
// FIXME we need to revisit this for #67176
if rvalue.needs_subst() {
return None;
}
// Perform any special handling for specific Rvalue types. // Perform any special handling for specific Rvalue types.
// Generally, checks here fall into one of two categories: // Generally, checks here fall into one of two categories:
// 1. Additional checking to provide useful lints to the user // 1. Additional checking to provide useful lints to the user
@ -626,6 +621,11 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
_ => {} _ => {}
} }
// FIXME we need to revisit this for #67176
if rvalue.needs_subst() {
return None;
}
self.use_ecx(|this| { self.use_ecx(|this| {
trace!("calling eval_rvalue_into_place(rvalue = {:?}, place = {:?})", rvalue, place); trace!("calling eval_rvalue_into_place(rvalue = {:?}, place = {:?})", rvalue, place);
this.ecx.eval_rvalue_into_place(rvalue, place)?; this.ecx.eval_rvalue_into_place(rvalue, place)?;

View File

@ -582,7 +582,7 @@ impl Inliner<'tcx> {
let tuple_tmp_args = tuple_tys.iter().enumerate().map(|(i, ty)| { let tuple_tmp_args = tuple_tys.iter().enumerate().map(|(i, ty)| {
// This is e.g., `tuple_tmp.0` in our example above. // This is e.g., `tuple_tmp.0` in our example above.
let tuple_field = let tuple_field =
Operand::Move(tcx.mk_place_field(tuple.clone(), Field::new(i), ty.expect_ty())); Operand::Move(tcx.mk_place_field(tuple, Field::new(i), ty.expect_ty()));
// Spill to a local to make e.g., `tmp0`. // Spill to a local to make e.g., `tmp0`.
self.create_temp_if_necessary(tuple_field, callsite, caller_body) self.create_temp_if_necessary(tuple_field, callsite, caller_body)

View File

@ -56,7 +56,7 @@ pub fn expand_aggregate<'tcx>(
let offset = i as u32; let offset = i as u32;
assert_eq!(offset as usize, i); assert_eq!(offset as usize, i);
tcx.mk_place_elem( tcx.mk_place_elem(
lhs.clone(), lhs,
ProjectionElem::ConstantIndex { ProjectionElem::ConstantIndex {
offset, offset,
// FIXME(eddyb) `min_length` doesn't appear to be used. // FIXME(eddyb) `min_length` doesn't appear to be used.
@ -66,7 +66,7 @@ pub fn expand_aggregate<'tcx>(
) )
} else { } else {
let field = Field::new(active_field_index.unwrap_or(i)); let field = Field::new(active_field_index.unwrap_or(i));
tcx.mk_place_field(lhs.clone(), field, ty) tcx.mk_place_field(lhs, field, ty)
}; };
Statement { source_info, kind: StatementKind::Assign(box (lhs_field, Rvalue::Use(op))) } Statement { source_info, kind: StatementKind::Assign(box (lhs_field, Rvalue::Use(op))) }
}) })

View File

@ -212,7 +212,7 @@ where
assert_eq!(self.elaborator.param_env().reveal, Reveal::All); assert_eq!(self.elaborator.param_env().reveal, Reveal::All);
let field_ty = let field_ty =
tcx.normalize_erasing_regions(self.elaborator.param_env(), f.ty(tcx, substs)); tcx.normalize_erasing_regions(self.elaborator.param_env(), f.ty(tcx, substs));
(tcx.mk_place_field(base_place.clone(), field, field_ty), subpath) (tcx.mk_place_field(base_place, field, field_ty), subpath)
}) })
.collect() .collect()
} }
@ -340,7 +340,7 @@ where
.enumerate() .enumerate()
.map(|(i, &ty)| { .map(|(i, &ty)| {
( (
self.tcx().mk_place_field(self.place.clone(), Field::new(i), ty), self.tcx().mk_place_field(self.place, Field::new(i), ty),
self.elaborator.field_subpath(self.path, Field::new(i)), self.elaborator.field_subpath(self.path, Field::new(i)),
) )
}) })
@ -353,7 +353,7 @@ where
fn open_drop_for_box(&mut self, adt: &'tcx ty::AdtDef, substs: SubstsRef<'tcx>) -> BasicBlock { fn open_drop_for_box(&mut self, adt: &'tcx ty::AdtDef, substs: SubstsRef<'tcx>) -> BasicBlock {
debug!("open_drop_for_box({:?}, {:?}, {:?})", self, adt, substs); debug!("open_drop_for_box({:?}, {:?}, {:?})", self, adt, substs);
let interior = self.tcx().mk_place_deref(self.place.clone()); let interior = self.tcx().mk_place_deref(self.place);
let interior_path = self.elaborator.deref_subpath(self.path); let interior_path = self.elaborator.deref_subpath(self.path);
let succ = self.succ; // FIXME(#43234) let succ = self.succ; // FIXME(#43234)
@ -434,7 +434,7 @@ where
if let Some(variant_path) = subpath { if let Some(variant_path) = subpath {
let base_place = tcx.mk_place_elem( let base_place = tcx.mk_place_elem(
self.place.clone(), self.place,
ProjectionElem::Downcast(Some(variant.ident.name), variant_index), ProjectionElem::Downcast(Some(variant.ident.name), variant_index),
); );
let fields = self.move_paths_for_fields(base_place, variant_path, &variant, substs); let fields = self.move_paths_for_fields(base_place, variant_path, &variant, substs);
@ -622,7 +622,7 @@ where
(Rvalue::Use(copy(cur.into())), Rvalue::BinaryOp(BinOp::Offset, move_(cur.into()), one)) (Rvalue::Use(copy(cur.into())), Rvalue::BinaryOp(BinOp::Offset, move_(cur.into()), one))
} else { } else {
( (
Rvalue::AddressOf(Mutability::Mut, tcx.mk_place_index(self.place.clone(), cur)), Rvalue::AddressOf(Mutability::Mut, tcx.mk_place_index(self.place, cur)),
Rvalue::BinaryOp(BinOp::Add, move_(cur.into()), one), Rvalue::BinaryOp(BinOp::Add, move_(cur.into()), one),
) )
}; };
@ -654,7 +654,7 @@ where
self.elaborator.patch().patch_terminator( self.elaborator.patch().patch_terminator(
drop_block, drop_block,
TerminatorKind::Drop { TerminatorKind::Drop {
location: tcx.mk_place_deref(ptr.clone()), location: tcx.mk_place_deref(ptr),
target: loop_block, target: loop_block,
unwind: unwind.into_option(), unwind: unwind.into_option(),
}, },
@ -682,7 +682,7 @@ where
.map(|i| { .map(|i| {
( (
tcx.mk_place_elem( tcx.mk_place_elem(
self.place.clone(), self.place,
ProjectionElem::ConstantIndex { ProjectionElem::ConstantIndex {
offset: i, offset: i,
min_length: size, min_length: size,
@ -719,8 +719,8 @@ where
switch_ty: tcx.types.usize, switch_ty: tcx.types.usize,
values: From::from(USIZE_SWITCH_ZERO), values: From::from(USIZE_SWITCH_ZERO),
targets: vec![ targets: vec![
self.drop_loop_pair(ety, false, len.clone()), self.drop_loop_pair(ety, false, len),
self.drop_loop_pair(ety, true, len.clone()), self.drop_loop_pair(ety, true, len),
], ],
}, },
}), }),
@ -912,7 +912,7 @@ where
.map(|(i, f)| { .map(|(i, f)| {
let field = Field::new(i); let field = Field::new(i);
let field_ty = f.ty(tcx, substs); let field_ty = f.ty(tcx, substs);
Operand::Move(tcx.mk_place_field(self.place.clone(), field, field_ty)) Operand::Move(tcx.mk_place_field(self.place, field, field_ty))
}) })
.collect(); .collect();

View File

@ -2,8 +2,8 @@ use crate::build::matches::ArmHasGuard;
use crate::build::ForGuard::OutsideGuard; use crate::build::ForGuard::OutsideGuard;
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder}; use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
use crate::hair::*; use crate::hair::*;
use rustc_middle::mir::*;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_middle::mir::*;
use rustc_span::Span; use rustc_span::Span;
impl<'a, 'tcx> Builder<'a, 'tcx> { impl<'a, 'tcx> Builder<'a, 'tcx> {
@ -29,7 +29,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
// This is a `break`-able block // This is a `break`-able block
let exit_block = this.cfg.start_new_block(); let exit_block = this.cfg.start_new_block();
let block_exit = let block_exit =
this.in_breakable_scope(None, exit_block, destination.clone(), |this| { this.in_breakable_scope(None, exit_block, destination, |this| {
this.ast_block_stmts(destination, block, span, stmts, expr, safety_mode) this.ast_block_stmts(destination, block, span, stmts, expr, safety_mode)
}); });
this.cfg.goto(unpack!(block_exit), source_info, exit_block); this.cfg.goto(unpack!(block_exit), source_info, exit_block);

View File

@ -3,10 +3,10 @@
use crate::build::expr::category::{Category, RvalueFunc}; use crate::build::expr::category::{Category, RvalueFunc};
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder}; use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
use crate::hair::*; use crate::hair::*;
use rustc_middle::mir::*;
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation};
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_middle::mir::*;
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi;
@ -139,11 +139,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
// Start the loop. // Start the loop.
this.cfg.goto(block, source_info, loop_block); this.cfg.goto(block, source_info, loop_block);
this.in_breakable_scope( this.in_breakable_scope(Some(loop_block), exit_block, destination, move |this| {
Some(loop_block),
exit_block,
destination.clone(),
move |this| {
// conduct the test, if necessary // conduct the test, if necessary
let body_block = this.cfg.start_new_block(); let body_block = this.cfg.start_new_block();
let diverge_cleanup = this.diverge_cleanup(); let diverge_cleanup = this.diverge_cleanup();
@ -162,8 +158,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
// Execute the body, branching back to the test. // Execute the body, branching back to the test.
let body_block_end = unpack!(this.into(tmp, body_block, body)); let body_block_end = unpack!(this.into(tmp, body_block, body));
this.cfg.goto(body_block_end, source_info, loop_block); this.cfg.goto(body_block_end, source_info, loop_block);
}, });
);
exit_block.unit() exit_block.unit()
} }
ExprKind::Call { ty, fun, args, from_hir_call } => { ExprKind::Call { ty, fun, args, from_hir_call } => {
@ -278,8 +273,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
let field_names = this.hir.all_fields(adt_def, variant_index); let field_names = this.hir.all_fields(adt_def, variant_index);
let fields = let fields = if let Some(FruInfo { base, field_types }) = base {
if let Some(FruInfo { base, field_types }) = base {
let base = unpack!(block = this.as_place(block, base)); let base = unpack!(block = this.as_place(block, base));
// MIR does not natively support FRU, so for each // MIR does not natively support FRU, so for each
@ -291,7 +285,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
.map(|(n, ty)| match fields_map.get(&n) { .map(|(n, ty)| match fields_map.get(&n) {
Some(v) => v.clone(), Some(v) => v.clone(),
None => this.consume_by_copy_or_move( None => this.consume_by_copy_or_move(
this.hir.tcx().mk_place_field(base.clone(), n, ty), this.hir.tcx().mk_place_field(base, n, ty),
), ),
}) })
.collect() .collect()

View File

@ -1903,9 +1903,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
self.schedule_drop_for_binding(binding.var_id, binding.span, OutsideGuard); self.schedule_drop_for_binding(binding.var_id, binding.span, OutsideGuard);
} }
let rvalue = match binding.binding_mode { let rvalue = match binding.binding_mode {
BindingMode::ByValue => { BindingMode::ByValue => Rvalue::Use(self.consume_by_copy_or_move(binding.source)),
Rvalue::Use(self.consume_by_copy_or_move(binding.source.clone()))
}
BindingMode::ByRef(borrow_kind) => { BindingMode::ByRef(borrow_kind) => {
Rvalue::Ref(re_erased, borrow_kind, binding.source) Rvalue::Ref(re_erased, borrow_kind, binding.source)
} }

View File

@ -15,11 +15,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
subpatterns subpatterns
.iter() .iter()
.map(|fieldpat| { .map(|fieldpat| {
let place = self.hir.tcx().mk_place_field( let place =
place.clone(), self.hir.tcx().mk_place_field(place, fieldpat.field, fieldpat.pattern.ty);
fieldpat.field,
fieldpat.pattern.ty,
);
MatchPair::new(place, &fieldpat.pattern) MatchPair::new(place, &fieldpat.pattern)
}) })
.collect() .collect()
@ -44,14 +41,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
match_pairs.extend(prefix.iter().enumerate().map(|(idx, subpattern)| { match_pairs.extend(prefix.iter().enumerate().map(|(idx, subpattern)| {
let elem = let elem =
ProjectionElem::ConstantIndex { offset: idx as u32, min_length, from_end: false }; ProjectionElem::ConstantIndex { offset: idx as u32, min_length, from_end: false };
let place = tcx.mk_place_elem(place.clone(), elem); let place = tcx.mk_place_elem(*place, elem);
MatchPair::new(place, subpattern) MatchPair::new(place, subpattern)
})); }));
if let Some(subslice_pat) = opt_slice { if let Some(subslice_pat) = opt_slice {
let suffix_len = suffix.len() as u32; let suffix_len = suffix.len() as u32;
let subslice = tcx.mk_place_elem( let subslice = tcx.mk_place_elem(
place.clone(), *place,
ProjectionElem::Subslice { ProjectionElem::Subslice {
from: prefix.len() as u32, from: prefix.len() as u32,
to: if exact_size { min_length - suffix_len } else { suffix_len }, to: if exact_size { min_length - suffix_len } else { suffix_len },
@ -68,7 +65,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
min_length, min_length,
from_end: !exact_size, from_end: !exact_size,
}; };
let place = tcx.mk_place_elem(place.clone(), elem); let place = tcx.mk_place_elem(*place, elem);
MatchPair::new(place, subpattern) MatchPair::new(place, subpattern)
})); }));
} }

View File

@ -610,7 +610,7 @@ pub fn check_unused_or_stable_features(tcx: TyCtxt<'_>) {
// Warn if the user enables a lib feature multiple times. // Warn if the user enables a lib feature multiple times.
duplicate_feature_err(tcx.sess, *span, *feature); duplicate_feature_err(tcx.sess, *span, *feature);
} }
remaining_lib_features.insert(feature, span.clone()); remaining_lib_features.insert(feature, *span);
} }
// `stdbuild` has special handling for `libc`, so we need to // `stdbuild` has special handling for `libc`, so we need to
// recognise the feature when building std. // recognise the feature when building std.

View File

@ -15,7 +15,7 @@ impl<K: DepKind> DepGraphQuery<K> {
let mut graph = Graph::with_capacity(nodes.len(), edges.len()); let mut graph = Graph::with_capacity(nodes.len(), edges.len());
let mut indices = FxHashMap::default(); let mut indices = FxHashMap::default();
for node in nodes { for node in nodes {
indices.insert(node.clone(), graph.add_node(node.clone())); indices.insert(*node, graph.add_node(*node));
} }
for &(ref source, ref target) in edges { for &(ref source, ref target) in edges {

View File

@ -643,13 +643,13 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
if param_name.name == kw::UnderscoreLifetime { if param_name.name == kw::UnderscoreLifetime {
// Pick the elided lifetime "definition" if one exists // Pick the elided lifetime "definition" if one exists
// and use it to make an elision scope. // and use it to make an elision scope.
self.lifetime_uses.insert(def_id.clone(), LifetimeUseSet::Many); self.lifetime_uses.insert(def_id, LifetimeUseSet::Many);
elision = Some(reg); elision = Some(reg);
} else { } else {
lifetimes.insert(name, reg); lifetimes.insert(name, reg);
} }
} else { } else {
self.lifetime_uses.insert(def_id.clone(), LifetimeUseSet::Many); self.lifetime_uses.insert(def_id, LifetimeUseSet::Many);
lifetimes.insert(name, reg); lifetimes.insert(name, reg);
} }
} }

View File

@ -126,7 +126,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
.borrow_mut() .borrow_mut()
.entry(span) .entry(span)
.or_default() .or_default()
.push(error.obligation.predicate.clone()); .push(error.obligation.predicate);
} }
// We do this in 2 passes because we want to display errors in order, though // We do this in 2 passes because we want to display errors in order, though
@ -312,6 +312,27 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
)) ))
); );
let should_convert_option_to_result =
format!("{}", trait_ref.print_only_trait_path())
.starts_with("std::convert::From<std::option::NoneError");
let should_convert_result_to_option = format!("{}", trait_ref)
.starts_with("<std::option::NoneError as std::convert::From<");
if is_try && is_from && should_convert_option_to_result {
err.span_suggestion_verbose(
span.shrink_to_lo(),
"consider converting the `Option<T>` into a `Result<T, _>` using `Option::ok_or` or `Option::ok_or_else`",
".ok_or_else(|| /* error value */)".to_string(),
Applicability::HasPlaceholders,
);
} else if is_try && is_from && should_convert_result_to_option {
err.span_suggestion_verbose(
span.shrink_to_lo(),
"consider converting the `Result<T, _>` into an `Option<T>` using `Result::ok`",
".ok()".to_string(),
Applicability::MachineApplicable,
);
}
let explanation = let explanation =
if obligation.cause.code == ObligationCauseCode::MainFunctionType { if obligation.cause.code == ObligationCauseCode::MainFunctionType {
"consider using `()`, or a `Result`".to_owned() "consider using `()`, or a `Result`".to_owned()
@ -1388,7 +1409,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> {
(self.tcx.sess.source_map().span_to_snippet(span), &obligation.cause.code) (self.tcx.sess.source_map().span_to_snippet(span), &obligation.cause.code)
{ {
let generics = self.tcx.generics_of(*def_id); let generics = self.tcx.generics_of(*def_id);
if generics.params.iter().filter(|p| p.name.as_str() != "Self").next().is_some() if generics.params.iter().any(|p| p.name.as_str() != "Self")
&& !snippet.ends_with('>') && !snippet.ends_with('>')
{ {
// FIXME: To avoid spurious suggestions in functions where type arguments // FIXME: To avoid spurious suggestions in functions where type arguments
@ -1817,7 +1838,7 @@ pub fn suggest_constraining_type_param(
// Account for `fn foo<T>(t: T) where T: Foo,` so we don't suggest two trailing commas. // Account for `fn foo<T>(t: T) where T: Foo,` so we don't suggest two trailing commas.
let mut trailing_comma = false; let mut trailing_comma = false;
if let Ok(snippet) = tcx.sess.source_map().span_to_snippet(where_clause_span) { if let Ok(snippet) = tcx.sess.source_map().span_to_snippet(where_clause_span) {
trailing_comma = snippet.ends_with(","); trailing_comma = snippet.ends_with(',');
} }
let where_clause_span = if trailing_comma { let where_clause_span = if trailing_comma {
let hi = where_clause_span.hi(); let hi = where_clause_span.hi();

View File

@ -314,7 +314,7 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> {
match obligation.predicate { match obligation.predicate {
ty::Predicate::Trait(ref data, _) => { ty::Predicate::Trait(ref data, _) => {
let trait_obligation = obligation.with(data.clone()); let trait_obligation = obligation.with(*data);
if data.is_global() { if data.is_global() {
// no type variables present, can use evaluation for better caching. // no type variables present, can use evaluation for better caching.
@ -420,7 +420,7 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> {
} }
ty::Predicate::Projection(ref data) => { ty::Predicate::Projection(ref data) => {
let project_obligation = obligation.with(data.clone()); let project_obligation = obligation.with(*data);
match project::poly_project_and_unify_type(self.selcx, &project_obligation) { match project::poly_project_and_unify_type(self.selcx, &project_obligation) {
Ok(None) => { Ok(None) => {
let tcx = self.selcx.tcx(); let tcx = self.selcx.tcx();

View File

@ -413,7 +413,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
match obligation.predicate { match obligation.predicate {
ty::Predicate::Trait(ref t, _) => { ty::Predicate::Trait(ref t, _) => {
debug_assert!(!t.has_escaping_bound_vars()); debug_assert!(!t.has_escaping_bound_vars());
let obligation = obligation.with(t.clone()); let obligation = obligation.with(*t);
self.evaluate_trait_predicate_recursively(previous_stack, obligation) self.evaluate_trait_predicate_recursively(previous_stack, obligation)
} }
@ -460,7 +460,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
} }
ty::Predicate::Projection(ref data) => { ty::Predicate::Projection(ref data) => {
let project_obligation = obligation.with(data.clone()); let project_obligation = obligation.with(*data);
match project::poly_project_and_unify_type(self, &project_obligation) { match project::poly_project_and_unify_type(self, &project_obligation) {
Ok(Some(mut subobligations)) => { Ok(Some(mut subobligations)) => {
self.add_depth(subobligations.iter_mut(), obligation.recursion_depth); self.add_depth(subobligations.iter_mut(), obligation.recursion_depth);
@ -910,7 +910,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
// separately rather than using `stack.fresh_trait_ref` -- // separately rather than using `stack.fresh_trait_ref` --
// this is because we want the unbound variables to be // this is because we want the unbound variables to be
// replaced with fresh types starting from index 0. // replaced with fresh types starting from index 0.
let cache_fresh_trait_pred = self.infcx.freshen(stack.obligation.predicate.clone()); let cache_fresh_trait_pred = self.infcx.freshen(stack.obligation.predicate);
debug!( debug!(
"candidate_from_obligation(cache_fresh_trait_pred={:?}, obligation={:?})", "candidate_from_obligation(cache_fresh_trait_pred={:?}, obligation={:?})",
cache_fresh_trait_pred, stack cache_fresh_trait_pred, stack
@ -1448,8 +1448,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
self.infcx.probe(|_| { self.infcx.probe(|_| {
self.match_projection( self.match_projection(
obligation, obligation,
bound.clone(), *bound,
placeholder_trait_predicate.trait_ref.clone(), placeholder_trait_predicate.trait_ref,
&placeholder_map, &placeholder_map,
snapshot, snapshot,
) )
@ -1468,7 +1468,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
let result = self.match_projection( let result = self.match_projection(
obligation, obligation,
bound, bound,
placeholder_trait_predicate.trait_ref.clone(), placeholder_trait_predicate.trait_ref,
&placeholder_map, &placeholder_map,
snapshot, snapshot,
); );
@ -1520,7 +1520,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
// Keep only those bounds which may apply, and propagate overflow if it occurs. // Keep only those bounds which may apply, and propagate overflow if it occurs.
let mut param_candidates = vec![]; let mut param_candidates = vec![];
for bound in matching_bounds { for bound in matching_bounds {
let wc = self.evaluate_where_clause(stack, bound.clone())?; let wc = self.evaluate_where_clause(stack, bound)?;
if wc.may_apply() { if wc.may_apply() {
param_candidates.push(ParamCandidate(bound)); param_candidates.push(ParamCandidate(bound));
} }
@ -2496,7 +2496,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
// where-clause trait-ref could be unified with the obligation // where-clause trait-ref could be unified with the obligation
// trait-ref. Repeat that unification now without any // trait-ref. Repeat that unification now without any
// transactional boundary; it should not fail. // transactional boundary; it should not fail.
match self.match_where_clause_trait_ref(obligation, param.clone()) { match self.match_where_clause_trait_ref(obligation, param) {
Ok(obligations) => obligations, Ok(obligations) => obligations,
Err(()) => { Err(()) => {
bug!( bug!(

View File

@ -373,7 +373,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
); );
}; };
self.tables.user_provided_types_mut().insert(hir_id, c_ty.clone()); self.tables.user_provided_types_mut().insert(hir_id, *c_ty);
if let ty::UserType::TypeOf(_, user_substs) = c_ty.value { if let ty::UserType::TypeOf(_, user_substs) = c_ty.value {
if self.rustc_dump_user_substs { if self.rustc_dump_user_substs {
@ -411,7 +411,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
); );
}; };
self.tables.user_provided_sigs.insert(def_id, c_sig.clone()); self.tables.user_provided_sigs.insert(def_id, *c_sig);
} }
} }
@ -562,7 +562,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
for (&local_id, fn_sig) in fcx_tables.liberated_fn_sigs().iter() { for (&local_id, fn_sig) in fcx_tables.liberated_fn_sigs().iter() {
let hir_id = hir::HirId { owner: common_hir_owner, local_id }; let hir_id = hir::HirId { owner: common_hir_owner, local_id };
let fn_sig = self.resolve(fn_sig, &hir_id); let fn_sig = self.resolve(fn_sig, &hir_id);
self.tables.liberated_fn_sigs_mut().insert(hir_id, fn_sig.clone()); self.tables.liberated_fn_sigs_mut().insert(hir_id, fn_sig);
} }
} }

View File

@ -509,7 +509,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
continue; continue;
} }
let mut for_generics = self.extract_for_generics(tcx, orig_p.clone()); let mut for_generics = self.extract_for_generics(tcx, orig_p);
assert!(bounds.len() == 1); assert!(bounds.len() == 1);
let mut b = bounds.pop().expect("bounds were empty"); let mut b = bounds.pop().expect("bounds were empty");

View File

@ -47,7 +47,7 @@ pub fn try_inline(
} }
let mut ret = Vec::new(); let mut ret = Vec::new();
let attrs_clone = attrs.clone(); let attrs_clone = attrs;
let inner = match res { let inner = match res {
Res::Def(DefKind::Trait, did) => { Res::Def(DefKind::Trait, did) => {
@ -292,7 +292,7 @@ pub fn build_impls(cx: &DocContext<'_>, did: DefId, attrs: Option<Attrs<'_>>) ->
let mut impls = Vec::new(); let mut impls = Vec::new();
for &did in tcx.inherent_impls(did).iter() { for &did in tcx.inherent_impls(did).iter() {
build_impl(cx, did, attrs.clone(), &mut impls); build_impl(cx, did, attrs, &mut impls);
} }
impls impls

View File

@ -16,12 +16,12 @@ use std::sync::mpsc::{channel, Receiver, Sender};
use std::sync::Arc; use std::sync::Arc;
macro_rules! try_err { macro_rules! try_err {
($e:expr, $file:expr) => {{ ($e:expr, $file:expr) => {
match $e { match $e {
Ok(e) => e, Ok(e) => e,
Err(e) => return Err(E::new(e, $file)), Err(e) => return Err(E::new(e, $file)),
} }
}}; };
} }
pub trait PathError { pub trait PathError {

View File

@ -683,7 +683,7 @@ impl Tester for Collector {
let name = self.generate_name(line, &filename); let name = self.generate_name(line, &filename);
let cratename = self.cratename.to_string(); let cratename = self.cratename.to_string();
let opts = self.opts.clone(); let opts = self.opts.clone();
let edition = config.edition.unwrap_or(self.options.edition.clone()); let edition = config.edition.unwrap_or(self.options.edition);
let options = self.options.clone(); let options = self.options.clone();
let runtool = self.options.runtool.clone(); let runtool = self.options.runtool.clone();
let runtool_args = self.options.runtool_args.clone(); let runtool_args = self.options.runtool_args.clone();

View File

@ -1,146 +1,152 @@
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:22:13 --> $DIR/lint-exceeding-bitshifts.rs:18:20
| |
LL | let _ = x << 42; LL | const N: i32 = T::N << 42;
| ^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
| |
note: the lint level is defined here note: the lint level is defined here
--> $DIR/lint-exceeding-bitshifts.rs:9:9 --> $DIR/lint-exceeding-bitshifts.rs:9:9
| |
LL | #![deny(arithmetic_overflow, const_err)] LL | #![warn(arithmetic_overflow, const_err)]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:22:13
|
LL | let _ = x << 42;
| ^^^^^^^ attempt to shift left with overflow
warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:27:15 --> $DIR/lint-exceeding-bitshifts.rs:27:15
| |
LL | let n = 1u8 << 8; LL | let n = 1u8 << 8;
| ^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:29:15 --> $DIR/lint-exceeding-bitshifts.rs:29:15
| |
LL | let n = 1u16 << 16; LL | let n = 1u16 << 16;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:31:15 --> $DIR/lint-exceeding-bitshifts.rs:31:15
| |
LL | let n = 1u32 << 32; LL | let n = 1u32 << 32;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:33:15 --> $DIR/lint-exceeding-bitshifts.rs:33:15
| |
LL | let n = 1u64 << 64; LL | let n = 1u64 << 64;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:35:15 --> $DIR/lint-exceeding-bitshifts.rs:35:15
| |
LL | let n = 1i8 << 8; LL | let n = 1i8 << 8;
| ^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:37:15 --> $DIR/lint-exceeding-bitshifts.rs:37:15
| |
LL | let n = 1i16 << 16; LL | let n = 1i16 << 16;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:39:15 --> $DIR/lint-exceeding-bitshifts.rs:39:15
| |
LL | let n = 1i32 << 32; LL | let n = 1i32 << 32;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:41:15 --> $DIR/lint-exceeding-bitshifts.rs:41:15
| |
LL | let n = 1i64 << 64; LL | let n = 1i64 << 64;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:44:15 --> $DIR/lint-exceeding-bitshifts.rs:44:15
| |
LL | let n = 1u8 >> 8; LL | let n = 1u8 >> 8;
| ^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:46:15 --> $DIR/lint-exceeding-bitshifts.rs:46:15
| |
LL | let n = 1u16 >> 16; LL | let n = 1u16 >> 16;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:48:15 --> $DIR/lint-exceeding-bitshifts.rs:48:15
| |
LL | let n = 1u32 >> 32; LL | let n = 1u32 >> 32;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:50:15 --> $DIR/lint-exceeding-bitshifts.rs:50:15
| |
LL | let n = 1u64 >> 64; LL | let n = 1u64 >> 64;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:52:15 --> $DIR/lint-exceeding-bitshifts.rs:52:15
| |
LL | let n = 1i8 >> 8; LL | let n = 1i8 >> 8;
| ^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:54:15 --> $DIR/lint-exceeding-bitshifts.rs:54:15
| |
LL | let n = 1i16 >> 16; LL | let n = 1i16 >> 16;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:56:15 --> $DIR/lint-exceeding-bitshifts.rs:56:15
| |
LL | let n = 1i32 >> 32; LL | let n = 1i32 >> 32;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:58:15 --> $DIR/lint-exceeding-bitshifts.rs:58:15
| |
LL | let n = 1i64 >> 64; LL | let n = 1i64 >> 64;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:62:15 --> $DIR/lint-exceeding-bitshifts.rs:62:15
| |
LL | let n = n << 8; LL | let n = n << 8;
| ^^^^^^ attempt to shift left with overflow | ^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:64:15 --> $DIR/lint-exceeding-bitshifts.rs:64:15
| |
LL | let n = 1u8 << -8; LL | let n = 1u8 << -8;
| ^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:69:15 --> $DIR/lint-exceeding-bitshifts.rs:69:15
| |
LL | let n = 1u8 << (4+4); LL | let n = 1u8 << (4+4);
| ^^^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:71:15 --> $DIR/lint-exceeding-bitshifts.rs:71:15
| |
LL | let n = 1i64 >> [64][0]; LL | let n = 1i64 >> [64][0];
| ^^^^^^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:77:15 --> $DIR/lint-exceeding-bitshifts.rs:77:15
| |
LL | let n = 1_isize << BITS; LL | let n = 1_isize << BITS;
| ^^^^^^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:78:15 --> $DIR/lint-exceeding-bitshifts.rs:78:15
| |
LL | let n = 1_usize << BITS; LL | let n = 1_usize << BITS;
| ^^^^^^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^^^^^^ attempt to shift left with overflow
error: aborting due to 23 previous errors warning: 24 warnings emitted

View File

@ -1,146 +1,152 @@
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:22:13 --> $DIR/lint-exceeding-bitshifts.rs:18:20
| |
LL | let _ = x << 42; LL | const N: i32 = T::N << 42;
| ^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
| |
note: the lint level is defined here note: the lint level is defined here
--> $DIR/lint-exceeding-bitshifts.rs:9:9 --> $DIR/lint-exceeding-bitshifts.rs:9:9
| |
LL | #![deny(arithmetic_overflow, const_err)] LL | #![warn(arithmetic_overflow, const_err)]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:22:13
|
LL | let _ = x << 42;
| ^^^^^^^ attempt to shift left with overflow
warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:27:15 --> $DIR/lint-exceeding-bitshifts.rs:27:15
| |
LL | let n = 1u8 << 8; LL | let n = 1u8 << 8;
| ^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:29:15 --> $DIR/lint-exceeding-bitshifts.rs:29:15
| |
LL | let n = 1u16 << 16; LL | let n = 1u16 << 16;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:31:15 --> $DIR/lint-exceeding-bitshifts.rs:31:15
| |
LL | let n = 1u32 << 32; LL | let n = 1u32 << 32;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:33:15 --> $DIR/lint-exceeding-bitshifts.rs:33:15
| |
LL | let n = 1u64 << 64; LL | let n = 1u64 << 64;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:35:15 --> $DIR/lint-exceeding-bitshifts.rs:35:15
| |
LL | let n = 1i8 << 8; LL | let n = 1i8 << 8;
| ^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:37:15 --> $DIR/lint-exceeding-bitshifts.rs:37:15
| |
LL | let n = 1i16 << 16; LL | let n = 1i16 << 16;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:39:15 --> $DIR/lint-exceeding-bitshifts.rs:39:15
| |
LL | let n = 1i32 << 32; LL | let n = 1i32 << 32;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:41:15 --> $DIR/lint-exceeding-bitshifts.rs:41:15
| |
LL | let n = 1i64 << 64; LL | let n = 1i64 << 64;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:44:15 --> $DIR/lint-exceeding-bitshifts.rs:44:15
| |
LL | let n = 1u8 >> 8; LL | let n = 1u8 >> 8;
| ^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:46:15 --> $DIR/lint-exceeding-bitshifts.rs:46:15
| |
LL | let n = 1u16 >> 16; LL | let n = 1u16 >> 16;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:48:15 --> $DIR/lint-exceeding-bitshifts.rs:48:15
| |
LL | let n = 1u32 >> 32; LL | let n = 1u32 >> 32;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:50:15 --> $DIR/lint-exceeding-bitshifts.rs:50:15
| |
LL | let n = 1u64 >> 64; LL | let n = 1u64 >> 64;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:52:15 --> $DIR/lint-exceeding-bitshifts.rs:52:15
| |
LL | let n = 1i8 >> 8; LL | let n = 1i8 >> 8;
| ^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:54:15 --> $DIR/lint-exceeding-bitshifts.rs:54:15
| |
LL | let n = 1i16 >> 16; LL | let n = 1i16 >> 16;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:56:15 --> $DIR/lint-exceeding-bitshifts.rs:56:15
| |
LL | let n = 1i32 >> 32; LL | let n = 1i32 >> 32;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:58:15 --> $DIR/lint-exceeding-bitshifts.rs:58:15
| |
LL | let n = 1i64 >> 64; LL | let n = 1i64 >> 64;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:62:15 --> $DIR/lint-exceeding-bitshifts.rs:62:15
| |
LL | let n = n << 8; LL | let n = n << 8;
| ^^^^^^ attempt to shift left with overflow | ^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:64:15 --> $DIR/lint-exceeding-bitshifts.rs:64:15
| |
LL | let n = 1u8 << -8; LL | let n = 1u8 << -8;
| ^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:69:15 --> $DIR/lint-exceeding-bitshifts.rs:69:15
| |
LL | let n = 1u8 << (4+4); LL | let n = 1u8 << (4+4);
| ^^^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:71:15 --> $DIR/lint-exceeding-bitshifts.rs:71:15
| |
LL | let n = 1i64 >> [64][0]; LL | let n = 1i64 >> [64][0];
| ^^^^^^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:77:15 --> $DIR/lint-exceeding-bitshifts.rs:77:15
| |
LL | let n = 1_isize << BITS; LL | let n = 1_isize << BITS;
| ^^^^^^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:78:15 --> $DIR/lint-exceeding-bitshifts.rs:78:15
| |
LL | let n = 1_usize << BITS; LL | let n = 1_usize << BITS;
| ^^^^^^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^^^^^^ attempt to shift left with overflow
error: aborting due to 23 previous errors warning: 24 warnings emitted

View File

@ -1,146 +1,152 @@
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:22:13 --> $DIR/lint-exceeding-bitshifts.rs:18:20
| |
LL | let _ = x << 42; LL | const N: i32 = T::N << 42;
| ^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
| |
note: the lint level is defined here note: the lint level is defined here
--> $DIR/lint-exceeding-bitshifts.rs:9:9 --> $DIR/lint-exceeding-bitshifts.rs:9:9
| |
LL | #![deny(arithmetic_overflow, const_err)] LL | #![warn(arithmetic_overflow, const_err)]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:22:13
|
LL | let _ = x << 42;
| ^^^^^^^ attempt to shift left with overflow
warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:27:15 --> $DIR/lint-exceeding-bitshifts.rs:27:15
| |
LL | let n = 1u8 << 8; LL | let n = 1u8 << 8;
| ^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:29:15 --> $DIR/lint-exceeding-bitshifts.rs:29:15
| |
LL | let n = 1u16 << 16; LL | let n = 1u16 << 16;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:31:15 --> $DIR/lint-exceeding-bitshifts.rs:31:15
| |
LL | let n = 1u32 << 32; LL | let n = 1u32 << 32;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:33:15 --> $DIR/lint-exceeding-bitshifts.rs:33:15
| |
LL | let n = 1u64 << 64; LL | let n = 1u64 << 64;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:35:15 --> $DIR/lint-exceeding-bitshifts.rs:35:15
| |
LL | let n = 1i8 << 8; LL | let n = 1i8 << 8;
| ^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:37:15 --> $DIR/lint-exceeding-bitshifts.rs:37:15
| |
LL | let n = 1i16 << 16; LL | let n = 1i16 << 16;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:39:15 --> $DIR/lint-exceeding-bitshifts.rs:39:15
| |
LL | let n = 1i32 << 32; LL | let n = 1i32 << 32;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:41:15 --> $DIR/lint-exceeding-bitshifts.rs:41:15
| |
LL | let n = 1i64 << 64; LL | let n = 1i64 << 64;
| ^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:44:15 --> $DIR/lint-exceeding-bitshifts.rs:44:15
| |
LL | let n = 1u8 >> 8; LL | let n = 1u8 >> 8;
| ^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:46:15 --> $DIR/lint-exceeding-bitshifts.rs:46:15
| |
LL | let n = 1u16 >> 16; LL | let n = 1u16 >> 16;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:48:15 --> $DIR/lint-exceeding-bitshifts.rs:48:15
| |
LL | let n = 1u32 >> 32; LL | let n = 1u32 >> 32;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:50:15 --> $DIR/lint-exceeding-bitshifts.rs:50:15
| |
LL | let n = 1u64 >> 64; LL | let n = 1u64 >> 64;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:52:15 --> $DIR/lint-exceeding-bitshifts.rs:52:15
| |
LL | let n = 1i8 >> 8; LL | let n = 1i8 >> 8;
| ^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:54:15 --> $DIR/lint-exceeding-bitshifts.rs:54:15
| |
LL | let n = 1i16 >> 16; LL | let n = 1i16 >> 16;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:56:15 --> $DIR/lint-exceeding-bitshifts.rs:56:15
| |
LL | let n = 1i32 >> 32; LL | let n = 1i32 >> 32;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:58:15 --> $DIR/lint-exceeding-bitshifts.rs:58:15
| |
LL | let n = 1i64 >> 64; LL | let n = 1i64 >> 64;
| ^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:62:15 --> $DIR/lint-exceeding-bitshifts.rs:62:15
| |
LL | let n = n << 8; LL | let n = n << 8;
| ^^^^^^ attempt to shift left with overflow | ^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:64:15 --> $DIR/lint-exceeding-bitshifts.rs:64:15
| |
LL | let n = 1u8 << -8; LL | let n = 1u8 << -8;
| ^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:69:15 --> $DIR/lint-exceeding-bitshifts.rs:69:15
| |
LL | let n = 1u8 << (4+4); LL | let n = 1u8 << (4+4);
| ^^^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:71:15 --> $DIR/lint-exceeding-bitshifts.rs:71:15
| |
LL | let n = 1i64 >> [64][0]; LL | let n = 1i64 >> [64][0];
| ^^^^^^^^^^^^^^^ attempt to shift right with overflow | ^^^^^^^^^^^^^^^ attempt to shift right with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:77:15 --> $DIR/lint-exceeding-bitshifts.rs:77:15
| |
LL | let n = 1_isize << BITS; LL | let n = 1_isize << BITS;
| ^^^^^^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^^^^^^ attempt to shift left with overflow
error: this arithmetic operation will overflow warning: this arithmetic operation will overflow
--> $DIR/lint-exceeding-bitshifts.rs:78:15 --> $DIR/lint-exceeding-bitshifts.rs:78:15
| |
LL | let n = 1_usize << BITS; LL | let n = 1_usize << BITS;
| ^^^^^^^^^^^^^^^ attempt to shift left with overflow | ^^^^^^^^^^^^^^^ attempt to shift left with overflow
error: aborting due to 23 previous errors warning: 24 warnings emitted

View File

@ -3,10 +3,10 @@
//[opt]compile-flags: -O //[opt]compile-flags: -O
//[opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O //[opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O
// build-fail // build-pass
#![crate_type="lib"] #![crate_type="lib"]
#![deny(arithmetic_overflow, const_err)] #![warn(arithmetic_overflow, const_err)]
#![allow(unused_variables)] #![allow(unused_variables)]
#![allow(dead_code)] #![allow(dead_code)]
@ -15,65 +15,65 @@ pub trait Foo {
} }
impl<T: Foo> Foo for Vec<T> { impl<T: Foo> Foo for Vec<T> {
const N: i32 = T::N << 42; // FIXME this should warn const N: i32 = T::N << 42; //~ WARN: arithmetic operation will overflow
} }
pub fn foo(x: i32) { pub fn foo(x: i32) {
let _ = x << 42; //~ ERROR: arithmetic operation will overflow let _ = x << 42; //~ WARN: arithmetic operation will overflow
} }
pub fn main() { pub fn main() {
let n = 1u8 << 7; let n = 1u8 << 7;
let n = 1u8 << 8; //~ ERROR: arithmetic operation will overflow let n = 1u8 << 8; //~ WARN: arithmetic operation will overflow
let n = 1u16 << 15; let n = 1u16 << 15;
let n = 1u16 << 16; //~ ERROR: arithmetic operation will overflow let n = 1u16 << 16; //~ WARN: arithmetic operation will overflow
let n = 1u32 << 31; let n = 1u32 << 31;
let n = 1u32 << 32; //~ ERROR: arithmetic operation will overflow let n = 1u32 << 32; //~ WARN: arithmetic operation will overflow
let n = 1u64 << 63; let n = 1u64 << 63;
let n = 1u64 << 64; //~ ERROR: arithmetic operation will overflow let n = 1u64 << 64; //~ WARN: arithmetic operation will overflow
let n = 1i8 << 7; let n = 1i8 << 7;
let n = 1i8 << 8; //~ ERROR: arithmetic operation will overflow let n = 1i8 << 8; //~ WARN: arithmetic operation will overflow
let n = 1i16 << 15; let n = 1i16 << 15;
let n = 1i16 << 16; //~ ERROR: arithmetic operation will overflow let n = 1i16 << 16; //~ WARN: arithmetic operation will overflow
let n = 1i32 << 31; let n = 1i32 << 31;
let n = 1i32 << 32; //~ ERROR: arithmetic operation will overflow let n = 1i32 << 32; //~ WARN: arithmetic operation will overflow
let n = 1i64 << 63; let n = 1i64 << 63;
let n = 1i64 << 64; //~ ERROR: arithmetic operation will overflow let n = 1i64 << 64; //~ WARN: arithmetic operation will overflow
let n = 1u8 >> 7; let n = 1u8 >> 7;
let n = 1u8 >> 8; //~ ERROR: arithmetic operation will overflow let n = 1u8 >> 8; //~ WARN: arithmetic operation will overflow
let n = 1u16 >> 15; let n = 1u16 >> 15;
let n = 1u16 >> 16; //~ ERROR: arithmetic operation will overflow let n = 1u16 >> 16; //~ WARN: arithmetic operation will overflow
let n = 1u32 >> 31; let n = 1u32 >> 31;
let n = 1u32 >> 32; //~ ERROR: arithmetic operation will overflow let n = 1u32 >> 32; //~ WARN: arithmetic operation will overflow
let n = 1u64 >> 63; let n = 1u64 >> 63;
let n = 1u64 >> 64; //~ ERROR: arithmetic operation will overflow let n = 1u64 >> 64; //~ WARN: arithmetic operation will overflow
let n = 1i8 >> 7; let n = 1i8 >> 7;
let n = 1i8 >> 8; //~ ERROR: arithmetic operation will overflow let n = 1i8 >> 8; //~ WARN: arithmetic operation will overflow
let n = 1i16 >> 15; let n = 1i16 >> 15;
let n = 1i16 >> 16; //~ ERROR: arithmetic operation will overflow let n = 1i16 >> 16; //~ WARN: arithmetic operation will overflow
let n = 1i32 >> 31; let n = 1i32 >> 31;
let n = 1i32 >> 32; //~ ERROR: arithmetic operation will overflow let n = 1i32 >> 32; //~ WARN: arithmetic operation will overflow
let n = 1i64 >> 63; let n = 1i64 >> 63;
let n = 1i64 >> 64; //~ ERROR: arithmetic operation will overflow let n = 1i64 >> 64; //~ WARN: arithmetic operation will overflow
let n = 1u8; let n = 1u8;
let n = n << 7; let n = n << 7;
let n = n << 8; //~ ERROR: arithmetic operation will overflow let n = n << 8; //~ WARN: arithmetic operation will overflow
let n = 1u8 << -8; //~ ERROR: arithmetic operation will overflow let n = 1u8 << -8; //~ WARN: arithmetic operation will overflow
let n = 1i8<<(1isize+-1); let n = 1i8<<(1isize+-1);
let n = 1u8 << (4+3); let n = 1u8 << (4+3);
let n = 1u8 << (4+4); //~ ERROR: arithmetic operation will overflow let n = 1u8 << (4+4); //~ WARN: arithmetic operation will overflow
let n = 1i64 >> [63][0]; let n = 1i64 >> [63][0];
let n = 1i64 >> [64][0]; //~ ERROR: arithmetic operation will overflow let n = 1i64 >> [64][0]; //~ WARN: arithmetic operation will overflow
#[cfg(target_pointer_width = "32")] #[cfg(target_pointer_width = "32")]
const BITS: usize = 32; const BITS: usize = 32;
#[cfg(target_pointer_width = "64")] #[cfg(target_pointer_width = "64")]
const BITS: usize = 64; const BITS: usize = 64;
let n = 1_isize << BITS; //~ ERROR: arithmetic operation will overflow let n = 1_isize << BITS; //~ WARN: arithmetic operation will overflow
let n = 1_usize << BITS; //~ ERROR: arithmetic operation will overflow let n = 1_usize << BITS; //~ WARN: arithmetic operation will overflow
} }

View File

@ -0,0 +1,13 @@
fn main(){ }
fn test_result() -> Result<(),()> {
let a:Option<()> = Some(());
a?;//~ ERROR `?` couldn't convert the error
Ok(())
}
fn test_option() -> Option<i32>{
let a:Result<i32, i32> = Ok(5);
a?;//~ ERROR `?` couldn't convert the error
Some(5)
}

View File

@ -0,0 +1,29 @@
error[E0277]: `?` couldn't convert the error to `()`
--> $DIR/option-to-result.rs:5:6
|
LL | a?;
| ^ the trait `std::convert::From<std::option::NoneError>` is not implemented for `()`
|
= note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
= note: required by `std::convert::From::from`
help: consider converting the `Option<T>` into a `Result<T, _>` using `Option::ok_or` or `Option::ok_or_else`
|
LL | a.ok_or_else(|| /* error value */)?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0277]: `?` couldn't convert the error to `std::option::NoneError`
--> $DIR/option-to-result.rs:11:6
|
LL | a?;
| ^ the trait `std::convert::From<i32>` is not implemented for `std::option::NoneError`
|
= note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
= note: required by `std::convert::From::from`
help: consider converting the `Result<T, _>` into an `Option<T>` using `Result::ok`
|
LL | a.ok()?;
| ^^^^^
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0277`.

View File

@ -6,6 +6,10 @@ LL | x?;
| |
= note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
= note: required by `std::convert::From::from` = note: required by `std::convert::From::from`
help: consider converting the `Option<T>` into a `Result<T, _>` using `Option::ok_or` or `Option::ok_or_else`
|
LL | x.ok_or_else(|| /* error value */)?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`)
--> $DIR/try-on-option.rs:13:5 --> $DIR/try-on-option.rs:13:5