Auto merge of #74117 - Manishearth:rollup-ds7z0kx, r=Manishearth
Rollup of 14 pull requests Successful merges: - #70563 ([rustdoc] Page hash handling) - #73856 (Edit librustc_lexer top-level docs) - #73870 (typeck: adding type information to projection) - #73953 (Audit hidden/short code suggestions) - #73962 (libstd/net/tcp.rs: #![deny(unsafe_op_in_unsafe_fn)]) - #73969 (mir: mark mir construction temporaries as internal) - #73974 (Move A|Rc::as_ptr from feature(weak_into_raw) to feature(rc_as_ptr)) - #74067 (rustdoc: Restore underline text decoration on hover for FQN in header) - #74074 (Fix the return type of Windows' `OpenOptionsExt::security_qos_flags`.) - #74078 (Always resolve type@primitive as a primitive, not a module) - #74089 (Add rust-analyzer to the build manifest) - #74090 (Remove unused RUSTC_DEBUG_ASSERTIONS) - #74102 (Fix const prop ICE) - #74112 (Expand abbreviation in core::ffi description) Failed merges: r? @ghost
This commit is contained in:
commit
70f9d23b91
193 changed files with 2048 additions and 542 deletions
|
@ -13,7 +13,6 @@ fn main() {
|
|||
let libdir = env::var_os("RUSTDOC_LIBDIR").expect("RUSTDOC_LIBDIR was not set");
|
||||
let stage = env::var("RUSTC_STAGE").expect("RUSTC_STAGE was not set");
|
||||
let sysroot = env::var_os("RUSTC_SYSROOT").expect("RUSTC_SYSROOT was not set");
|
||||
let mut has_unstable = false;
|
||||
|
||||
use std::str::FromStr;
|
||||
|
||||
|
@ -55,22 +54,10 @@ fn main() {
|
|||
cmd.arg("--crate-version").arg(version);
|
||||
}
|
||||
|
||||
// Needed to be able to run all rustdoc tests.
|
||||
if env::var_os("RUSTDOC_GENERATE_REDIRECT_PAGES").is_some() {
|
||||
// This "unstable-options" can be removed when `--generate-redirect-pages` is stabilized
|
||||
if !has_unstable {
|
||||
cmd.arg("-Z").arg("unstable-options");
|
||||
}
|
||||
cmd.arg("--generate-redirect-pages");
|
||||
has_unstable = true;
|
||||
}
|
||||
|
||||
// Needed to be able to run all rustdoc tests.
|
||||
if let Some(ref x) = env::var_os("RUSTDOC_RESOURCE_SUFFIX") {
|
||||
// This "unstable-options" can be removed when `--resource-suffix` is stabilized
|
||||
if !has_unstable {
|
||||
cmd.arg("-Z").arg("unstable-options");
|
||||
}
|
||||
cmd.arg("-Z").arg("unstable-options");
|
||||
cmd.arg("--resource-suffix").arg(x);
|
||||
}
|
||||
|
||||
|
|
|
@ -451,7 +451,6 @@ impl Step for Std {
|
|||
.arg("--markdown-css")
|
||||
.arg("rust.css")
|
||||
.arg("--markdown-no-toc")
|
||||
.arg("--generate-redirect-pages")
|
||||
.arg("-Z")
|
||||
.arg("unstable-options")
|
||||
.arg("--resource-suffix")
|
||||
|
|
|
@ -397,8 +397,6 @@ impl Step for Miri {
|
|||
cargo.env("MIRI", &miri);
|
||||
// Debug things.
|
||||
cargo.env("RUST_BACKTRACE", "1");
|
||||
// Overwrite bootstrap's `rustc` wrapper overwriting our flags.
|
||||
cargo.env("RUSTC_DEBUG_ASSERTIONS", "true");
|
||||
// Let cargo-miri know where xargo ended up.
|
||||
cargo.env("XARGO_CHECK", builder.out.join("bin").join("xargo-check"));
|
||||
|
||||
|
|
|
@ -1701,7 +1701,7 @@ impl<T> Weak<T> {
|
|||
/// ```
|
||||
///
|
||||
/// [`null`]: ../../std/ptr/fn.null.html
|
||||
#[stable(feature = "weak_into_raw", since = "1.45.0")]
|
||||
#[stable(feature = "rc_as_ptr", since = "1.45.0")]
|
||||
pub fn as_ptr(&self) -> *const T {
|
||||
let ptr: *mut RcBox<T> = NonNull::as_ptr(self.ptr);
|
||||
|
||||
|
|
|
@ -587,7 +587,7 @@ impl<T: ?Sized> Arc<T> {
|
|||
/// assert_eq!(x_ptr, Arc::as_ptr(&y));
|
||||
/// assert_eq!(unsafe { &*x_ptr }, "hello");
|
||||
/// ```
|
||||
#[stable(feature = "weak_into_raw", since = "1.45.0")]
|
||||
#[stable(feature = "rc_as_ptr", since = "1.45.0")]
|
||||
pub fn as_ptr(this: &Self) -> *const T {
|
||||
let ptr: *mut ArcInner<T> = NonNull::as_ptr(this.ptr);
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#![stable(feature = "", since = "1.30.0")]
|
||||
#![allow(non_camel_case_types)]
|
||||
|
||||
//! Utilities related to FFI bindings.
|
||||
//! Utilities related to foreign function interface (FFI) bindings.
|
||||
|
||||
use crate::fmt;
|
||||
use crate::marker::PhantomData;
|
||||
|
|
|
@ -280,6 +280,8 @@ impl<'a, 'b> Context<'a, 'b> {
|
|||
("x", "LowerHex"),
|
||||
("X", "UpperHex"),
|
||||
] {
|
||||
// FIXME: rustfix (`run-rustfix`) fails to apply suggestions.
|
||||
// > "Cannot replace slice of data that was already replaced"
|
||||
err.tool_only_span_suggestion(
|
||||
sp,
|
||||
&format!("use the `{}` trait", name),
|
||||
|
|
|
@ -6,17 +6,18 @@
|
|||
//! produces simple tokens which are a pair of type-tag and a bit of original text,
|
||||
//! and does not report errors, instead storing them as flags on the token.
|
||||
//!
|
||||
//! Tokens produced by this lexer are not yet ready for parsing the Rust syntax,
|
||||
//! for that see `librustc_parse::lexer`, which converts this basic token stream
|
||||
//! Tokens produced by this lexer are not yet ready for parsing the Rust syntax.
|
||||
//! For that see [`librustc_parse::lexer`], which converts this basic token stream
|
||||
//! into wide tokens used by actual parser.
|
||||
//!
|
||||
//! The purpose of this crate is to convert raw sources into a labeled sequence
|
||||
//! of well-known token types, so building an actual Rust token stream will
|
||||
//! be easier.
|
||||
//!
|
||||
//! Main entity of this crate is [`TokenKind`] enum which represents common
|
||||
//! The main entity of this crate is the [`TokenKind`] enum which represents common
|
||||
//! lexeme types.
|
||||
|
||||
//!
|
||||
//! [`librustc_parse::lexer`]: ../rustc_parse/lexer/index.html
|
||||
// We want to be able to build this crate with a stable compiler, so no
|
||||
// `#![feature]` attributes should be added.
|
||||
|
||||
|
|
|
@ -1004,14 +1004,6 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> {
|
|||
let expected = ScalarMaybeUninit::from(Scalar::from_bool(*expected));
|
||||
let value_const = self.ecx.read_scalar(value).unwrap();
|
||||
if expected != value_const {
|
||||
// Poison all places this operand references so that further code
|
||||
// doesn't use the invalid value
|
||||
match cond {
|
||||
Operand::Move(ref place) | Operand::Copy(ref place) => {
|
||||
Self::remove_const(&mut self.ecx, place.local);
|
||||
}
|
||||
Operand::Constant(_) => {}
|
||||
}
|
||||
let mut eval_to_int = |op| {
|
||||
let op = self
|
||||
.eval_operand(op, source_info)
|
||||
|
@ -1020,27 +1012,37 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> {
|
|||
};
|
||||
let msg = match msg {
|
||||
AssertKind::DivisionByZero(op) => {
|
||||
AssertKind::DivisionByZero(eval_to_int(op))
|
||||
Some(AssertKind::DivisionByZero(eval_to_int(op)))
|
||||
}
|
||||
AssertKind::RemainderByZero(op) => {
|
||||
AssertKind::RemainderByZero(eval_to_int(op))
|
||||
Some(AssertKind::RemainderByZero(eval_to_int(op)))
|
||||
}
|
||||
AssertKind::BoundsCheck { ref len, ref index } => {
|
||||
let len = eval_to_int(len);
|
||||
let index = eval_to_int(index);
|
||||
AssertKind::BoundsCheck { len, index }
|
||||
Some(AssertKind::BoundsCheck { len, index })
|
||||
}
|
||||
// Overflow is are already covered by checks on the binary operators.
|
||||
AssertKind::Overflow(..) | AssertKind::OverflowNeg(_) => return,
|
||||
AssertKind::Overflow(..) | AssertKind::OverflowNeg(_) => None,
|
||||
// Need proper const propagator for these.
|
||||
_ => return,
|
||||
_ => None,
|
||||
};
|
||||
self.report_assert_as_lint(
|
||||
lint::builtin::UNCONDITIONAL_PANIC,
|
||||
source_info,
|
||||
"this operation will panic at runtime",
|
||||
msg,
|
||||
);
|
||||
// Poison all places this operand references so that further code
|
||||
// doesn't use the invalid value
|
||||
match cond {
|
||||
Operand::Move(ref place) | Operand::Copy(ref place) => {
|
||||
Self::remove_const(&mut self.ecx, place.local);
|
||||
}
|
||||
Operand::Constant(_) => {}
|
||||
}
|
||||
if let Some(msg) = msg {
|
||||
self.report_assert_as_lint(
|
||||
lint::builtin::UNCONDITIONAL_PANIC,
|
||||
source_info,
|
||||
"this operation will panic at runtime",
|
||||
msg,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if self.should_const_prop(value) {
|
||||
if let ScalarMaybeUninit::Scalar(scalar) = value_const {
|
||||
|
|
|
@ -15,7 +15,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
/// N.B., **No cleanup is scheduled for this temporary.** You should
|
||||
/// call `schedule_drop` once the temporary is initialized.
|
||||
crate fn temp(&mut self, ty: Ty<'tcx>, span: Span) -> Place<'tcx> {
|
||||
let temp = self.local_decls.push(LocalDecl::new(ty, span));
|
||||
// Mark this local as internal to avoid temporaries with types not present in the
|
||||
// user's code resulting in ICEs from the generator transform.
|
||||
let temp = self.local_decls.push(LocalDecl::new(ty, span).internal());
|
||||
let place = Place::from(temp);
|
||||
debug!("temp: created temp {:?} with type {:?}", place, self.local_decls[temp].ty);
|
||||
place
|
||||
|
|
|
@ -1228,10 +1228,13 @@ impl<'a> Parser<'a> {
|
|||
if let Some(sp) = unmatched.unclosed_span {
|
||||
err.span_label(sp, "unclosed delimiter");
|
||||
}
|
||||
// Backticks should be removed to apply suggestions.
|
||||
let mut delim = delim.to_string();
|
||||
delim.retain(|c| c != '`');
|
||||
err.span_suggestion_short(
|
||||
self.prev_token.span.shrink_to_hi(),
|
||||
&format!("{} may belong here", delim.to_string()),
|
||||
delim.to_string(),
|
||||
&format!("`{}` may belong here", delim),
|
||||
delim,
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
if unmatched.found_delim.is_none() {
|
||||
|
|
|
@ -699,7 +699,7 @@ impl<'a> Parser<'a> {
|
|||
// misses a separator.
|
||||
expect_err
|
||||
.span_suggestion_short(
|
||||
sp,
|
||||
self.sess.source_map().next_point(sp),
|
||||
&format!("missing `{}`", token_str),
|
||||
token_str,
|
||||
Applicability::MaybeIncorrect,
|
||||
|
|
|
@ -488,7 +488,7 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
|
|||
) {
|
||||
if let mc::PlaceBase::Rvalue = place_with_id.place.base {
|
||||
if place_with_id.place.projections.is_empty() {
|
||||
let typ = self.resolve_type(place_with_id.place.ty);
|
||||
let typ = self.resolve_type(place_with_id.place.ty());
|
||||
let body_id = self.body_id;
|
||||
let _ = dropck::check_drop_obligations(self, typ, span, body_id);
|
||||
}
|
||||
|
@ -640,8 +640,8 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
|
|||
borrow_kind: ty::BorrowKind,
|
||||
borrow_place: &mc::PlaceWithHirId<'tcx>,
|
||||
) {
|
||||
let origin = infer::DataBorrowed(borrow_place.place.ty, span);
|
||||
self.type_must_outlive(origin, borrow_place.place.ty, borrow_region);
|
||||
let origin = infer::DataBorrowed(borrow_place.place.ty(), span);
|
||||
self.type_must_outlive(origin, borrow_place.place.ty(), borrow_region);
|
||||
|
||||
for pointer_ty in borrow_place.place.deref_tys() {
|
||||
debug!(
|
||||
|
|
|
@ -384,7 +384,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
|
|||
|
||||
// Select just those fields of the `with`
|
||||
// expression that will actually be used
|
||||
match with_place.place.ty.kind {
|
||||
match with_place.place.ty().kind {
|
||||
ty::Adt(adt, substs) if adt.is_struct() => {
|
||||
// Consume those fields of the with expression that are needed.
|
||||
for (f_index, with_field) in adt.non_enum_variant().fields.iter().enumerate() {
|
||||
|
@ -583,7 +583,7 @@ fn copy_or_move<'a, 'tcx>(
|
|||
place_with_id: &PlaceWithHirId<'tcx>,
|
||||
) -> ConsumeMode {
|
||||
if !mc.type_is_copy_modulo_regions(
|
||||
place_with_id.place.ty,
|
||||
place_with_id.place.ty(),
|
||||
mc.tcx().hir().span(place_with_id.hir_id),
|
||||
) {
|
||||
Move
|
||||
|
|
|
@ -73,18 +73,21 @@ pub enum PlaceBase {
|
|||
Upvar(ty::UpvarId),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum ProjectionKind<'tcx> {
|
||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||
pub enum ProjectionKind {
|
||||
/// A dereference of a pointer, reference or `Box<T>` of the given type
|
||||
Deref(Ty<'tcx>),
|
||||
Deref,
|
||||
/// An index or a field
|
||||
Other,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Projection<'tcx> {
|
||||
// Type after the projection is being applied.
|
||||
ty: Ty<'tcx>,
|
||||
|
||||
/// Defines the type of access
|
||||
kind: ProjectionKind<'tcx>,
|
||||
kind: ProjectionKind,
|
||||
}
|
||||
|
||||
/// A `Place` represents how a value is located in memory.
|
||||
|
@ -92,8 +95,8 @@ pub struct Projection<'tcx> {
|
|||
/// This is an HIR version of `mir::Place`
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Place<'tcx> {
|
||||
/// The type of the `Place`
|
||||
pub ty: Ty<'tcx>,
|
||||
/// The type of the `PlaceBase`
|
||||
pub base_ty: Ty<'tcx>,
|
||||
/// The "outermost" place that holds this value.
|
||||
pub base: PlaceBase,
|
||||
/// How this place is derived from the base place.
|
||||
|
@ -115,13 +118,13 @@ pub struct PlaceWithHirId<'tcx> {
|
|||
impl<'tcx> PlaceWithHirId<'tcx> {
|
||||
crate fn new(
|
||||
hir_id: hir::HirId,
|
||||
ty: Ty<'tcx>,
|
||||
base_ty: Ty<'tcx>,
|
||||
base: PlaceBase,
|
||||
projections: Vec<Projection<'tcx>>,
|
||||
) -> PlaceWithHirId<'tcx> {
|
||||
PlaceWithHirId {
|
||||
hir_id: hir_id,
|
||||
place: Place { ty: ty, base: base, projections: projections },
|
||||
place: Place { base_ty: base_ty, base: base, projections: projections },
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -134,10 +137,26 @@ impl<'tcx> Place<'tcx> {
|
|||
/// `x: &*const u32` and the `Place` is `**x`, then the types returned are
|
||||
///`*const u32` then `&*const u32`.
|
||||
crate fn deref_tys(&self) -> impl Iterator<Item = Ty<'tcx>> + '_ {
|
||||
self.projections.iter().rev().filter_map(|proj| {
|
||||
if let ProjectionKind::Deref(deref_ty) = proj.kind { Some(deref_ty) } else { None }
|
||||
self.projections.iter().enumerate().rev().filter_map(move |(index, proj)| {
|
||||
if ProjectionKind::Deref == proj.kind {
|
||||
Some(self.ty_before_projection(index))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Returns the type of this `Place` after all projections have been applied.
|
||||
pub fn ty(&self) -> Ty<'tcx> {
|
||||
self.projections.last().map_or_else(|| self.base_ty, |proj| proj.ty)
|
||||
}
|
||||
|
||||
// Returns the type of this `Place` immediately before `projection_index`th projection
|
||||
// is applied.
|
||||
crate fn ty_before_projection(&self, projection_index: usize) -> Ty<'tcx> {
|
||||
assert!(projection_index < self.projections.len());
|
||||
if projection_index == 0 { self.base_ty } else { self.projections[projection_index - 1].ty }
|
||||
}
|
||||
}
|
||||
|
||||
crate trait HirNode {
|
||||
|
@ -516,8 +535,13 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
|
|||
ty: Ty<'tcx>,
|
||||
) -> PlaceWithHirId<'tcx> {
|
||||
let mut projections = base_place.place.projections;
|
||||
projections.push(Projection { kind: ProjectionKind::Other });
|
||||
let ret = PlaceWithHirId::new(node.hir_id(), ty, base_place.place.base, projections);
|
||||
projections.push(Projection { kind: ProjectionKind::Other, ty: ty });
|
||||
let ret = PlaceWithHirId::new(
|
||||
node.hir_id(),
|
||||
base_place.place.base_ty,
|
||||
base_place.place.base,
|
||||
projections,
|
||||
);
|
||||
debug!("cat_field ret {:?}", ret);
|
||||
ret
|
||||
}
|
||||
|
@ -552,18 +576,23 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
|
|||
) -> McResult<PlaceWithHirId<'tcx>> {
|
||||
debug!("cat_deref: base_place={:?}", base_place);
|
||||
|
||||
let base_ty = base_place.place.ty;
|
||||
let deref_ty = match base_ty.builtin_deref(true) {
|
||||
let base_curr_ty = base_place.place.ty();
|
||||
let deref_ty = match base_curr_ty.builtin_deref(true) {
|
||||
Some(mt) => mt.ty,
|
||||
None => {
|
||||
debug!("explicit deref of non-derefable type: {:?}", base_ty);
|
||||
debug!("explicit deref of non-derefable type: {:?}", base_curr_ty);
|
||||
return Err(());
|
||||
}
|
||||
};
|
||||
let mut projections = base_place.place.projections;
|
||||
projections.push(Projection { kind: ProjectionKind::Deref(base_ty) });
|
||||
projections.push(Projection { kind: ProjectionKind::Deref, ty: deref_ty });
|
||||
|
||||
let ret = PlaceWithHirId::new(node.hir_id(), deref_ty, base_place.place.base, projections);
|
||||
let ret = PlaceWithHirId::new(
|
||||
node.hir_id(),
|
||||
base_place.place.base_ty,
|
||||
base_place.place.base,
|
||||
projections,
|
||||
);
|
||||
debug!("cat_deref ret {:?}", ret);
|
||||
Ok(ret)
|
||||
}
|
||||
|
@ -687,7 +716,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
|
|||
}
|
||||
|
||||
PatKind::Slice(before, ref slice, after) => {
|
||||
let element_ty = match place_with_id.place.ty.builtin_index() {
|
||||
let element_ty = match place_with_id.place.ty().builtin_index() {
|
||||
Some(ty) => ty,
|
||||
None => {
|
||||
debug!("explicit index of non-indexable type {:?}", place_with_id);
|
||||
|
|
|
@ -242,8 +242,6 @@ pub struct RenderOptions {
|
|||
/// If false, the `select` element to have search filtering by crates on rendered docs
|
||||
/// won't be generated.
|
||||
pub generate_search_filter: bool,
|
||||
/// Option (disabled by default) to generate files used by RLS and some other tools.
|
||||
pub generate_redirect_pages: bool,
|
||||
/// Document items that have lower than `pub` visibility.
|
||||
pub document_private: bool,
|
||||
/// Document items that have `doc(hidden)`.
|
||||
|
@ -528,7 +526,6 @@ impl Options {
|
|||
let static_root_path = matches.opt_str("static-root-path");
|
||||
let generate_search_filter = !matches.opt_present("disable-per-crate-search");
|
||||
let persist_doctests = matches.opt_str("persist-doctests").map(PathBuf::from);
|
||||
let generate_redirect_pages = matches.opt_present("generate-redirect-pages");
|
||||
let test_builder = matches.opt_str("test-builder").map(PathBuf::from);
|
||||
let codegen_options_strs = matches.opt_strs("C");
|
||||
let debugging_options_strs = matches.opt_strs("Z");
|
||||
|
@ -592,7 +589,6 @@ impl Options {
|
|||
markdown_css,
|
||||
markdown_playground_url,
|
||||
generate_search_filter,
|
||||
generate_redirect_pages,
|
||||
document_private,
|
||||
document_hidden,
|
||||
},
|
||||
|
|
|
@ -154,38 +154,6 @@ impl ItemType {
|
|||
ItemType::TraitAlias => "traitalias",
|
||||
}
|
||||
}
|
||||
|
||||
pub fn name_space(&self) -> &'static str {
|
||||
match *self {
|
||||
ItemType::Struct
|
||||
| ItemType::Union
|
||||
| ItemType::Enum
|
||||
| ItemType::Module
|
||||
| ItemType::Typedef
|
||||
| ItemType::Trait
|
||||
| ItemType::Primitive
|
||||
| ItemType::AssocType
|
||||
| ItemType::OpaqueTy
|
||||
| ItemType::TraitAlias
|
||||
| ItemType::ForeignType => NAMESPACE_TYPE,
|
||||
|
||||
ItemType::ExternCrate
|
||||
| ItemType::Import
|
||||
| ItemType::Function
|
||||
| ItemType::Static
|
||||
| ItemType::Impl
|
||||
| ItemType::TyMethod
|
||||
| ItemType::Method
|
||||
| ItemType::StructField
|
||||
| ItemType::Variant
|
||||
| ItemType::Constant
|
||||
| ItemType::AssocConst => NAMESPACE_VALUE,
|
||||
|
||||
ItemType::Macro | ItemType::ProcAttribute | ItemType::ProcDerive => NAMESPACE_MACRO,
|
||||
|
||||
ItemType::Keyword => NAMESPACE_KEYWORD,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for ItemType {
|
||||
|
@ -193,8 +161,3 @@ impl fmt::Display for ItemType {
|
|||
write!(f, "{}", self.as_str())
|
||||
}
|
||||
}
|
||||
|
||||
pub const NAMESPACE_TYPE: &str = "t";
|
||||
pub const NAMESPACE_VALUE: &str = "v";
|
||||
pub const NAMESPACE_MACRO: &str = "m";
|
||||
pub const NAMESPACE_KEYWORD: &str = "k";
|
||||
|
|
|
@ -195,8 +195,6 @@ crate struct SharedContext {
|
|||
/// Optional path string to be used to load static files on output pages. If not set, uses
|
||||
/// combinations of `../` to reach the documentation root.
|
||||
pub static_root_path: Option<String>,
|
||||
/// Option disabled by default to generate files used by RLS and some other tools.
|
||||
pub generate_redirect_pages: bool,
|
||||
/// The fs handle we are working with.
|
||||
pub fs: DocFS,
|
||||
/// The default edition used to parse doctests.
|
||||
|
@ -468,7 +466,6 @@ pub fn run(
|
|||
resource_suffix,
|
||||
static_root_path,
|
||||
generate_search_filter,
|
||||
generate_redirect_pages,
|
||||
document_private,
|
||||
..
|
||||
} = options;
|
||||
|
@ -536,7 +533,6 @@ pub fn run(
|
|||
themes,
|
||||
resource_suffix,
|
||||
static_root_path,
|
||||
generate_redirect_pages,
|
||||
fs: DocFS::new(&errors),
|
||||
edition,
|
||||
codes: ErrorCodes::from(UnstableFeatures::from_environment().is_nightly_build()),
|
||||
|
@ -1556,14 +1552,6 @@ impl Context {
|
|||
if !self.render_redirect_pages {
|
||||
all.append(full_path(self, &item), &item_type);
|
||||
}
|
||||
if self.shared.generate_redirect_pages {
|
||||
// Redirect from a sane URL using the namespace to Rustdoc's
|
||||
// URL for the page.
|
||||
let redir_name = format!("{}.{}.html", name, item_type.name_space());
|
||||
let redir_dst = self.dst.join(redir_name);
|
||||
let v = layout::redirect(file_name);
|
||||
self.shared.fs.write(&redir_dst, v.as_bytes())?;
|
||||
}
|
||||
// If the item is a macro, redirect from the old macro URL (with !)
|
||||
// to the new one (without).
|
||||
if item_type == ItemType::Macro {
|
||||
|
@ -2586,8 +2574,7 @@ fn item_trait(w: &mut Buffer, cx: &Context, it: &clean::Item, t: &clean::Trait)
|
|||
let name = m.name.as_ref().unwrap();
|
||||
let item_type = m.type_();
|
||||
let id = cx.derive_id(format!("{}.{}", item_type, name));
|
||||
let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space()));
|
||||
write!(w, "<h3 id='{id}' class='method'><code id='{ns_id}'>", id = id, ns_id = ns_id);
|
||||
write!(w, "<h3 id='{id}' class='method'><code>", id = id);
|
||||
render_assoc_item(w, m, AssocItemLink::Anchor(Some(&id)), ItemType::Impl);
|
||||
write!(w, "</code>");
|
||||
render_stability_since(w, m, t);
|
||||
|
@ -2972,20 +2959,14 @@ fn item_struct(w: &mut Buffer, cx: &Context, it: &clean::Item, s: &clean::Struct
|
|||
ItemType::StructField,
|
||||
field.name.as_ref().unwrap()
|
||||
));
|
||||
let ns_id = cx.derive_id(format!(
|
||||
"{}.{}",
|
||||
field.name.as_ref().unwrap(),
|
||||
ItemType::StructField.name_space()
|
||||
));
|
||||
write!(
|
||||
w,
|
||||
"<span id=\"{id}\" class=\"{item_type} small-section-header\">\
|
||||
<a href=\"#{id}\" class=\"anchor field\"></a>\
|
||||
<code id=\"{ns_id}\">{name}: {ty}</code>\
|
||||
<code>{name}: {ty}</code>\
|
||||
</span>",
|
||||
item_type = ItemType::StructField,
|
||||
id = id,
|
||||
ns_id = ns_id,
|
||||
name = field.name.as_ref().unwrap(),
|
||||
ty = ty.print()
|
||||
);
|
||||
|
@ -3103,18 +3084,12 @@ fn item_enum(w: &mut Buffer, cx: &Context, it: &clean::Item, e: &clean::Enum) {
|
|||
for variant in &e.variants {
|
||||
let id =
|
||||
cx.derive_id(format!("{}.{}", ItemType::Variant, variant.name.as_ref().unwrap()));
|
||||
let ns_id = cx.derive_id(format!(
|
||||
"{}.{}",
|
||||
variant.name.as_ref().unwrap(),
|
||||
ItemType::Variant.name_space()
|
||||
));
|
||||
write!(
|
||||
w,
|
||||
"<div id=\"{id}\" class=\"variant small-section-header\">\
|
||||
<a href=\"#{id}\" class=\"anchor field\"></a>\
|
||||
<code id='{ns_id}'>{name}",
|
||||
<a href=\"#{id}\" class=\"anchor field\"></a>\
|
||||
<code>{name}",
|
||||
id = id,
|
||||
ns_id = ns_id,
|
||||
name = variant.name.as_ref().unwrap()
|
||||
);
|
||||
if let clean::VariantItem(ref var) = variant.inner {
|
||||
|
@ -3155,21 +3130,13 @@ fn item_enum(w: &mut Buffer, cx: &Context, it: &clean::Item, e: &clean::Enum) {
|
|||
variant.name.as_ref().unwrap(),
|
||||
field.name.as_ref().unwrap()
|
||||
));
|
||||
let ns_id = cx.derive_id(format!(
|
||||
"{}.{}.{}.{}",
|
||||
variant.name.as_ref().unwrap(),
|
||||
ItemType::Variant.name_space(),
|
||||
field.name.as_ref().unwrap(),
|
||||
ItemType::StructField.name_space()
|
||||
));
|
||||
write!(
|
||||
w,
|
||||
"<span id=\"{id}\" class=\"variant small-section-header\">\
|
||||
<a href=\"#{id}\" class=\"anchor field\"></a>\
|
||||
<code id='{ns_id}'>{f}: {t}\
|
||||
<code>{f}: {t}\
|
||||
</code></span>",
|
||||
id = id,
|
||||
ns_id = ns_id,
|
||||
f = field.name.as_ref().unwrap(),
|
||||
t = ty.print()
|
||||
);
|
||||
|
@ -3661,9 +3628,7 @@ fn render_impl(
|
|||
// Only render when the method is not static or we allow static methods
|
||||
if render_method_item {
|
||||
let id = cx.derive_id(format!("{}.{}", item_type, name));
|
||||
let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space()));
|
||||
write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class);
|
||||
write!(w, "<code id='{}'>", ns_id);
|
||||
write!(w, "<h4 id='{}' class=\"{}{}\"><code>", id, item_type, extra_class);
|
||||
render_assoc_item(w, item, link.anchor(&id), ItemType::Impl);
|
||||
write!(w, "</code>");
|
||||
render_stability_since_raw(w, item.stable_since(), outer_version);
|
||||
|
@ -3679,17 +3644,13 @@ fn render_impl(
|
|||
}
|
||||
clean::TypedefItem(ref tydef, _) => {
|
||||
let id = cx.derive_id(format!("{}.{}", ItemType::AssocType, name));
|
||||
let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space()));
|
||||
write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class);
|
||||
write!(w, "<code id='{}'>", ns_id);
|
||||
write!(w, "<h4 id='{}' class=\"{}{}\"><code>", id, item_type, extra_class);
|
||||
assoc_type(w, item, &Vec::new(), Some(&tydef.type_), link.anchor(&id), "");
|
||||
write!(w, "</code></h4>");
|
||||
}
|
||||
clean::AssocConstItem(ref ty, ref default) => {
|
||||
let id = cx.derive_id(format!("{}.{}", item_type, name));
|
||||
let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space()));
|
||||
write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class);
|
||||
write!(w, "<code id='{}'>", ns_id);
|
||||
write!(w, "<h4 id='{}' class=\"{}{}\"><code>", id, item_type, extra_class);
|
||||
assoc_const(w, item, ty, default.as_ref(), link.anchor(&id), "");
|
||||
write!(w, "</code>");
|
||||
render_stability_since_raw(w, item.stable_since(), outer_version);
|
||||
|
@ -3704,9 +3665,7 @@ fn render_impl(
|
|||
}
|
||||
clean::AssocTypeItem(ref bounds, ref default) => {
|
||||
let id = cx.derive_id(format!("{}.{}", item_type, name));
|
||||
let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space()));
|
||||
write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class);
|
||||
write!(w, "<code id='{}'>", ns_id);
|
||||
write!(w, "<h4 id='{}' class=\"{}{}\"><code>", id, item_type, extra_class);
|
||||
assoc_type(w, item, bounds, default.as_ref(), link.anchor(&id), "");
|
||||
write!(w, "</code></h4>");
|
||||
}
|
||||
|
|
|
@ -112,9 +112,11 @@ function defocusSearchBar() {
|
|||
}
|
||||
|
||||
function getPageId() {
|
||||
var id = document.location.href.split("#")[1];
|
||||
if (id) {
|
||||
return id.split("?")[0].split("&")[0];
|
||||
if (window.location.hash) {
|
||||
var tmp = window.location.hash.replace(/^#/, "");
|
||||
if (tmp.length > 0) {
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -2551,6 +2553,13 @@ function defocusSearchBar() {
|
|||
|
||||
onEachLazy(document.getElementsByClassName("docblock"), buildToggleWrapper);
|
||||
onEachLazy(document.getElementsByClassName("sub-variant"), buildToggleWrapper);
|
||||
var pageId = getPageId();
|
||||
|
||||
autoCollapse(pageId, getCurrentValue("rustdoc-collapse") === "true");
|
||||
|
||||
if (pageId !== null) {
|
||||
expandSection(pageId);
|
||||
}
|
||||
}());
|
||||
|
||||
function createToggleWrapper(tog) {
|
||||
|
@ -2686,12 +2695,6 @@ function defocusSearchBar() {
|
|||
hideSidebar();
|
||||
};
|
||||
|
||||
autoCollapse(getPageId(), getCurrentValue("rustdoc-collapse") === "true");
|
||||
|
||||
if (window.location.hash && window.location.hash.length > 0) {
|
||||
expandSection(window.location.hash.replace(/^#/, ""));
|
||||
}
|
||||
|
||||
if (main) {
|
||||
onEachLazy(main.getElementsByClassName("loading-content"), function(e) {
|
||||
e.remove();
|
||||
|
|
|
@ -100,6 +100,9 @@ h1.fqn {
|
|||
border-bottom: 1px dashed;
|
||||
margin-top: 0;
|
||||
}
|
||||
h1.fqn > .in-band > a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
h2, h3:not(.impl):not(.method):not(.type):not(.tymethod), h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant) {
|
||||
border-bottom: 1px solid;
|
||||
}
|
||||
|
|
|
@ -374,13 +374,6 @@ fn opts() -> Vec<RustcOptGroup> {
|
|||
"PATH",
|
||||
)
|
||||
}),
|
||||
unstable("generate-redirect-pages", |o| {
|
||||
o.optflag(
|
||||
"",
|
||||
"generate-redirect-pages",
|
||||
"Generate extra pages to support legacy URLs and tool links",
|
||||
)
|
||||
}),
|
||||
unstable("show-coverage", |o| {
|
||||
o.optflag(
|
||||
"",
|
||||
|
|
|
@ -164,6 +164,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
|
|||
fn resolve(
|
||||
&self,
|
||||
path_str: &str,
|
||||
disambiguator: Option<&str>,
|
||||
ns: Namespace,
|
||||
current_item: &Option<String>,
|
||||
parent_id: Option<hir::HirId>,
|
||||
|
@ -203,11 +204,22 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
|
|||
}
|
||||
return Ok((res, Some(path_str.to_owned())));
|
||||
}
|
||||
other => {
|
||||
debug!(
|
||||
"failed to resolve {} in namespace {:?} (got {:?})",
|
||||
path_str, ns, other
|
||||
);
|
||||
Res::Def(DefKind::Mod, _) => {
|
||||
// This resolved to a module, but if we were passed `type@`,
|
||||
// we want primitive types to take precedence instead.
|
||||
if disambiguator == Some("type") {
|
||||
if let Some(prim) = is_primitive(path_str, ns) {
|
||||
if extra_fragment.is_some() {
|
||||
return Err(ErrorKind::AnchorFailure(
|
||||
"primitive types cannot be followed by anchors",
|
||||
));
|
||||
}
|
||||
return Ok((prim, Some(path_str.to_owned())));
|
||||
}
|
||||
}
|
||||
return Ok((res, extra_fragment.clone()));
|
||||
}
|
||||
_ => {
|
||||
return Ok((res, extra_fragment.clone()));
|
||||
}
|
||||
};
|
||||
|
@ -566,11 +578,13 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
|||
let mut path_str;
|
||||
let (res, fragment) = {
|
||||
let mut kind = None;
|
||||
let mut disambiguator = None;
|
||||
path_str = if let Some(prefix) = ["struct@", "enum@", "type@", "trait@", "union@"]
|
||||
.iter()
|
||||
.find(|p| link.starts_with(**p))
|
||||
{
|
||||
kind = Some(TypeNS);
|
||||
disambiguator = Some(&prefix[..prefix.len() - 1]);
|
||||
link.trim_start_matches(prefix)
|
||||
} else if let Some(prefix) = [
|
||||
"const@",
|
||||
|
@ -586,18 +600,23 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
|||
.find(|p| link.starts_with(**p))
|
||||
{
|
||||
kind = Some(ValueNS);
|
||||
disambiguator = Some(&prefix[..prefix.len() - 1]);
|
||||
link.trim_start_matches(prefix)
|
||||
} else if link.ends_with("()") {
|
||||
kind = Some(ValueNS);
|
||||
disambiguator = Some("fn");
|
||||
link.trim_end_matches("()")
|
||||
} else if link.starts_with("macro@") {
|
||||
kind = Some(MacroNS);
|
||||
disambiguator = Some("macro");
|
||||
link.trim_start_matches("macro@")
|
||||
} else if link.starts_with("derive@") {
|
||||
kind = Some(MacroNS);
|
||||
disambiguator = Some("derive");
|
||||
link.trim_start_matches("derive@")
|
||||
} else if link.ends_with('!') {
|
||||
kind = Some(MacroNS);
|
||||
disambiguator = Some("macro");
|
||||
link.trim_end_matches('!')
|
||||
} else {
|
||||
&link[..]
|
||||
|
@ -634,6 +653,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
|||
Some(ns @ ValueNS) => {
|
||||
match self.resolve(
|
||||
path_str,
|
||||
disambiguator,
|
||||
ns,
|
||||
¤t_item,
|
||||
base_node,
|
||||
|
@ -657,6 +677,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
|||
Some(ns @ TypeNS) => {
|
||||
match self.resolve(
|
||||
path_str,
|
||||
disambiguator,
|
||||
ns,
|
||||
¤t_item,
|
||||
base_node,
|
||||
|
@ -683,6 +704,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
|||
.map(|res| (res, extra_fragment.clone())),
|
||||
type_ns: match self.resolve(
|
||||
path_str,
|
||||
disambiguator,
|
||||
TypeNS,
|
||||
¤t_item,
|
||||
base_node,
|
||||
|
@ -697,6 +719,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
|||
},
|
||||
value_ns: match self.resolve(
|
||||
path_str,
|
||||
disambiguator,
|
||||
ValueNS,
|
||||
¤t_item,
|
||||
base_node,
|
||||
|
@ -1069,7 +1092,7 @@ fn handle_variant(
|
|||
};
|
||||
let parent_def = Res::Def(DefKind::Enum, parent);
|
||||
let variant = cx.tcx.expect_variant_res(res);
|
||||
Ok((parent_def, Some(format!("{}.v", variant.ident.name))))
|
||||
Ok((parent_def, Some(format!("variant.{}", variant.ident.name))))
|
||||
}
|
||||
|
||||
const PRIMITIVES: &[(&str, Res)] = &[
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#![deny(unsafe_op_in_unsafe_fn)]
|
||||
use crate::io::prelude::*;
|
||||
|
||||
use crate::fmt;
|
||||
|
@ -583,7 +584,8 @@ impl Read for TcpStream {
|
|||
|
||||
#[inline]
|
||||
unsafe fn initializer(&self) -> Initializer {
|
||||
Initializer::nop()
|
||||
// SAFETY: Read is guaranteed to work on uninitialized memory
|
||||
unsafe { Initializer::nop() }
|
||||
}
|
||||
}
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
@ -622,7 +624,8 @@ impl Read for &TcpStream {
|
|||
|
||||
#[inline]
|
||||
unsafe fn initializer(&self) -> Initializer {
|
||||
Initializer::nop()
|
||||
// SAFETY: Read is guaranteed to work on uninitialized memory
|
||||
unsafe { Initializer::nop() }
|
||||
}
|
||||
}
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
|
|
@ -133,7 +133,7 @@ pub trait FileExt {
|
|||
/// Note that similar to [`File::write`], it is not an error to return a
|
||||
/// short write.
|
||||
///
|
||||
/// [`File::write`]: ../../../../std/fs/struct.File.html#write.v
|
||||
/// [`File::write`]: ../../../../std/fs/struct.File.html#method.write
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
|
|
@ -132,7 +132,7 @@ pub trait FileExt {
|
|||
/// Note that similar to [`File::write`], it is not an error to return a
|
||||
/// short write.
|
||||
///
|
||||
/// [`File::write`]: ../../../../std/fs/struct.File.html#write.v
|
||||
/// [`File::write`]: ../../../../std/fs/struct.File.html#method.write
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
|
|
@ -259,7 +259,7 @@ pub trait OpenOptionsExt {
|
|||
/// [Impersonation Levels]:
|
||||
/// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ne-winnt-security_impersonation_level
|
||||
#[stable(feature = "open_options_ext", since = "1.10.0")]
|
||||
fn security_qos_flags(&mut self, flags: u32) -> &mut OpenOptions;
|
||||
fn security_qos_flags(&mut self, flags: u32) -> &mut Self;
|
||||
}
|
||||
|
||||
#[stable(feature = "open_options_ext", since = "1.10.0")]
|
||||
|
|
|
@ -5,9 +5,7 @@
|
|||
// @has assoc_types/trait.Index.html
|
||||
pub trait Index<I: ?Sized> {
|
||||
// @has - '//*[@id="associatedtype.Output"]//code' 'type Output: ?Sized'
|
||||
// @has - '//code[@id="Output.t"]' 'type Output: ?Sized'
|
||||
type Output: ?Sized;
|
||||
// @has - '//code[@id="index.v"]' 'fn index'
|
||||
// @has - '//*[@id="tymethod.index"]//code' \
|
||||
// "fn index<'a>(&'a self, index: I) -> &'a Self::Output"
|
||||
// @has - '//*[@id="tymethod.index"]//code//a[@href="../assoc_types/trait.Index.html#associatedtype.Output"]' \
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
pub struct Foo;
|
||||
|
||||
impl Foo {
|
||||
// @has const/struct.Foo.html '//code[@id="new.v"]' 'const unsafe fn new'
|
||||
// @has const/struct.Foo.html '//*[@id="method.new"]//code' 'const unsafe fn new'
|
||||
pub const unsafe fn new() -> Foo {
|
||||
Foo
|
||||
}
|
||||
|
|
|
@ -31,8 +31,8 @@ pub use impl_trait_aux::func4;
|
|||
pub use impl_trait_aux::async_fn;
|
||||
|
||||
// @has impl_trait/struct.Foo.html
|
||||
// @has - '//code[@id="method.v"]' "pub fn method<'a>(_x: impl Clone + Into<Vec<u8>> + 'a)"
|
||||
// @!has - '//code[@id="method.v"]' 'where'
|
||||
// @has - '//*[@id="method.method"]//code' "pub fn method<'a>(_x: impl Clone + Into<Vec<u8>> + 'a)"
|
||||
// @!has - '//*[@id="method.method"]//code' 'where'
|
||||
pub use impl_trait_aux::Foo;
|
||||
|
||||
// @has impl_trait/struct.Bar.html
|
||||
|
|
12
src/test/rustdoc/intra-link-prim-precedence.rs
Normal file
12
src/test/rustdoc/intra-link-prim-precedence.rs
Normal file
|
@ -0,0 +1,12 @@
|
|||
// ignore-tidy-linelength
|
||||
#![deny(intra_doc_resolution_failure)]
|
||||
|
||||
pub mod char {}
|
||||
|
||||
/// See also [type@char]
|
||||
// @has intra_link_prim_precedence/struct.MyString.html '//a/@href' 'https://doc.rust-lang.org/nightly/std/primitive.char.html'
|
||||
pub struct MyString;
|
||||
|
||||
/// See also [char]
|
||||
// @has intra_link_prim_precedence/struct.MyString2.html '//a/@href' 'intra_link_prim_precedence/char/index.html'
|
||||
pub struct MyString2;
|
|
@ -40,7 +40,7 @@ pub struct MyStruct {
|
|||
}
|
||||
|
||||
pub enum MyEnum {
|
||||
// @has foo/enum.MyEnum.html '//a/@href' '../foo/enum.MyEnum.html#EnumVariant.v'
|
||||
// @has foo/enum.MyEnum.html '//a/@href' '../foo/enum.MyEnum.html#variant.EnumVariant'
|
||||
|
||||
/// [`EnumVariant`]
|
||||
///
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
// @has - '//a/@href' '../intra_links/struct.ThisType.html'
|
||||
// @has - '//a/@href' '../intra_links/struct.ThisType.html#method.this_method'
|
||||
// @has - '//a/@href' '../intra_links/enum.ThisEnum.html'
|
||||
// @has - '//a/@href' '../intra_links/enum.ThisEnum.html#ThisVariant.v'
|
||||
// @has - '//a/@href' '../intra_links/enum.ThisEnum.html#variant.ThisVariant'
|
||||
// @has - '//a/@href' '../intra_links/trait.ThisTrait.html'
|
||||
// @has - '//a/@href' '../intra_links/trait.ThisTrait.html#tymethod.this_associated_method'
|
||||
// @has - '//a/@href' '../intra_links/trait.ThisTrait.html#associatedtype.ThisAssociatedType'
|
||||
|
@ -73,7 +73,7 @@ pub fn SoAmbiguous() {}
|
|||
// @has - '//a/@href' '../intra_links/struct.ThisType.html'
|
||||
// @has - '//a/@href' '../intra_links/struct.ThisType.html#method.this_method'
|
||||
// @has - '//a/@href' '../intra_links/enum.ThisEnum.html'
|
||||
// @has - '//a/@href' '../intra_links/enum.ThisEnum.html#ThisVariant.v'
|
||||
// @has - '//a/@href' '../intra_links/enum.ThisEnum.html#variant.ThisVariant'
|
||||
/// Shortcut links for:
|
||||
/// * [`ThisType`]
|
||||
/// * [`ThisType::this_method`]
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
// compile-flags:-Z unstable-options --generate-redirect-pages
|
||||
|
||||
use std::ops::Deref;
|
||||
|
||||
pub struct Foo;
|
||||
|
@ -15,9 +13,8 @@ impl Deref for Bar {
|
|||
fn deref(&self) -> &Foo { loop {} }
|
||||
}
|
||||
|
||||
// @has issue_19190/Bar.t.html
|
||||
// @has issue_19190/struct.Bar.html
|
||||
// @has - '//*[@id="foo.v"]' 'fn foo(&self)'
|
||||
// @has - '//*[@id="method.foo"]//code' 'fn foo(&self)'
|
||||
// @has - '//*[@id="method.foo"]' 'fn foo(&self)'
|
||||
// @!has - '//*[@id="static_foo.v"]' 'fn static_foo()'
|
||||
// @!has - '//*[@id="method.static_foo"]//code' 'fn static_foo()'
|
||||
// @!has - '//*[@id="method.static_foo"]' 'fn static_foo()'
|
||||
|
|
|
@ -9,17 +9,14 @@ pub trait Bar {
|
|||
|
||||
impl Foo<u8> {
|
||||
// @has - '//*[@id="method.pass"]//code' 'fn pass()'
|
||||
// @has - '//code[@id="pass.v"]' 'fn pass()'
|
||||
pub fn pass() {}
|
||||
}
|
||||
impl Foo<u16> {
|
||||
// @has - '//*[@id="method.pass-1"]//code' 'fn pass() -> usize'
|
||||
// @has - '//code[@id="pass.v-1"]' 'fn pass() -> usize'
|
||||
pub fn pass() -> usize { 42 }
|
||||
}
|
||||
impl Foo<u32> {
|
||||
// @has - '//*[@id="method.pass-2"]//code' 'fn pass() -> isize'
|
||||
// @has - '//code[@id="pass.v-2"]' 'fn pass() -> isize'
|
||||
pub fn pass() -> isize { 42 }
|
||||
}
|
||||
|
||||
|
|
|
@ -24,17 +24,17 @@ impl DerefMut for Bar {
|
|||
}
|
||||
|
||||
// @has issue_35169_2/struct.Bar.html
|
||||
// @has - '//*[@id="by_ref.v"]' 'fn by_ref(&self)'
|
||||
// @has - '//*[@id="method.by_ref"]//code' 'fn by_ref(&self)'
|
||||
// @has - '//*[@id="method.by_ref"]' 'fn by_ref(&self)'
|
||||
// @has - '//*[@id="by_explicit_ref.v"]' 'fn by_explicit_ref(self: &Foo)'
|
||||
// @has - '//*[@id="method.by_explicit_ref"]//code' 'fn by_explicit_ref(self: &Foo)'
|
||||
// @has - '//*[@id="method.by_explicit_ref"]' 'fn by_explicit_ref(self: &Foo)'
|
||||
// @has - '//*[@id="by_mut_ref.v"]' 'fn by_mut_ref(&mut self)'
|
||||
// @has - '//*[@id="method.by_mut_ref"]//code' 'fn by_mut_ref(&mut self)'
|
||||
// @has - '//*[@id="method.by_mut_ref"]' 'fn by_mut_ref(&mut self)'
|
||||
// @has - '//*[@id="by_explicit_mut_ref.v"]' 'fn by_explicit_mut_ref(self: &mut Foo)'
|
||||
// @has - '//*[@id="method.by_explicit_mut_ref"]//code' 'fn by_explicit_mut_ref(self: &mut Foo)'
|
||||
// @has - '//*[@id="method.by_explicit_mut_ref"]' 'fn by_explicit_mut_ref(self: &mut Foo)'
|
||||
// @!has - '//*[@id="by_explicit_box.v"]' 'fn by_explicit_box(self: Box<Foo>)'
|
||||
// @!has - '//*[@id="method.by_explicit_box"]//code' 'fn by_explicit_box(self: Box<Foo>)'
|
||||
// @!has - '//*[@id="method.by_explicit_box"]' 'fn by_explicit_box(self: Box<Foo>)'
|
||||
// @!has - '//*[@id="by_explicit_self_box.v"]' 'fn by_explicit_self_box(self: Box<Self>)'
|
||||
// @!has - '//*[@id="method.by_explicit_self_box"]//code' 'fn by_explicit_self_box(self: Box<Self>)'
|
||||
// @!has - '//*[@id="method.by_explicit_self_box"]' 'fn by_explicit_self_box(self: Box<Self>)'
|
||||
// @!has - '//*[@id="static_foo.v"]' 'fn static_foo()'
|
||||
// @!has - '//*[@id="method.static_foo"]//code' 'fn static_foo()'
|
||||
// @!has - '//*[@id="method.static_foo"]' 'fn static_foo()'
|
||||
|
|
|
@ -19,17 +19,17 @@ impl Deref for Bar {
|
|||
}
|
||||
|
||||
// @has issue_35169/struct.Bar.html
|
||||
// @has - '//*[@id="by_ref.v"]' 'fn by_ref(&self)'
|
||||
// @has - '//*[@id="method.by_ref"]//code' 'fn by_ref(&self)'
|
||||
// @has - '//*[@id="method.by_ref"]' 'fn by_ref(&self)'
|
||||
// @has - '//*[@id="by_explicit_ref.v"]' 'fn by_explicit_ref(self: &Foo)'
|
||||
// @has - '//*[@id="method.by_explicit_ref"]//code' 'fn by_explicit_ref(self: &Foo)'
|
||||
// @has - '//*[@id="method.by_explicit_ref"]' 'fn by_explicit_ref(self: &Foo)'
|
||||
// @!has - '//*[@id="by_mut_ref.v"]' 'fn by_mut_ref(&mut self)'
|
||||
// @!has - '//*[@id="method.by_mut_ref"]//code' 'fn by_mut_ref(&mut self)'
|
||||
// @!has - '//*[@id="method.by_mut_ref"]' 'fn by_mut_ref(&mut self)'
|
||||
// @!has - '//*[@id="by_explicit_mut_ref.v"]' 'fn by_explicit_mut_ref(self: &mut Foo)'
|
||||
// @!has - '//*[@id="method.by_explicit_mut_ref"]//code' 'fn by_explicit_mut_ref(self: &mut Foo)'
|
||||
// @!has - '//*[@id="method.by_explicit_mut_ref"]' 'fn by_explicit_mut_ref(self: &mut Foo)'
|
||||
// @!has - '//*[@id="by_explicit_box.v"]' 'fn by_explicit_box(self: Box<Foo>)'
|
||||
// @!has - '//*[@id="method.by_explicit_box"]//code' 'fn by_explicit_box(self: Box<Foo>)'
|
||||
// @!has - '//*[@id="method.by_explicit_box"]' 'fn by_explicit_box(self: Box<Foo>)'
|
||||
// @!has - '//*[@id="by_explicit_self_box.v"]' 'fn by_explicit_self_box(self: Box<Self>)'
|
||||
// @!has - '//*[@id="method.by_explicit_self_box"]//code' 'fn by_explicit_self_box(self: Box<Self>)'
|
||||
// @!has - '//*[@id="method.by_explicit_self_box"]' 'fn by_explicit_self_box(self: Box<Self>)'
|
||||
// @!has - '//*[@id="static_foo.v"]' 'fn static_foo()'
|
||||
// @!has - '//*[@id="method.static_foo"]//code' 'fn static_foo()'
|
||||
// @!has - '//*[@id="method.static_foo"]' 'fn static_foo()'
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
// @has foo/index.html '//*[@class="docblock"]/p/a[@href="../foo/struct.Foo.html#structfield.bar"]' 'Foo::bar'
|
||||
// @has foo/index.html '//*[@class="docblock"]/p/a[@href="../foo/union.Bar.html#structfield.foo"]' 'Bar::foo'
|
||||
// @has foo/index.html '//*[@class="docblock"]/p/a[@href="../foo/enum.Uniooon.html#X.v"]' 'Uniooon::X'
|
||||
// @has foo/index.html '//*[@class="docblock"]/p/a[@href="../foo/enum.Uniooon.html#variant.X"]' 'Uniooon::X'
|
||||
|
||||
//! Test with [Foo::bar], [Bar::foo], [Uniooon::X]
|
||||
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
// compile-flags:-Z unstable-options --generate-redirect-pages
|
||||
|
||||
// @has structfields/Foo.t.html
|
||||
// @has - struct.Foo.html
|
||||
// @has structfields/struct.Foo.html
|
||||
pub struct Foo {
|
||||
// @has - //pre "pub a: ()"
|
||||
|
@ -16,8 +12,6 @@ pub struct Foo {
|
|||
pub d: usize,
|
||||
}
|
||||
|
||||
// @has structfields/Bar.t.html
|
||||
// @has - struct.Bar.html
|
||||
// @has structfields/struct.Bar.html
|
||||
pub struct Bar {
|
||||
// @has - //pre "pub a: ()"
|
||||
|
@ -25,8 +19,6 @@ pub struct Bar {
|
|||
// @!has - //pre "// some fields omitted"
|
||||
}
|
||||
|
||||
// @has structfields/Qux.t.html
|
||||
// @has - enum.Qux.html
|
||||
// @has structfields/enum.Qux.html
|
||||
pub enum Qux {
|
||||
Quz {
|
||||
|
|
12
src/test/ui/block-expression-remove-semicolon.fixed
Normal file
12
src/test/ui/block-expression-remove-semicolon.fixed
Normal file
|
@ -0,0 +1,12 @@
|
|||
// run-rustfix
|
||||
|
||||
fn foo() -> i32 {
|
||||
0
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _x: i32 = {
|
||||
//~^ ERROR mismatched types
|
||||
foo() //~ HELP consider removing this semicolon
|
||||
};
|
||||
}
|
|
@ -1,9 +1,11 @@
|
|||
// run-rustfix
|
||||
|
||||
fn foo() -> i32 {
|
||||
0
|
||||
0
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let x: i32 = {
|
||||
let _x: i32 = {
|
||||
//~^ ERROR mismatched types
|
||||
foo(); //~ HELP consider removing this semicolon
|
||||
};
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/block-expression-remove-semicolon.rs:6:18
|
||||
--> $DIR/block-expression-remove-semicolon.rs:8:19
|
||||
|
|
||||
LL | let x: i32 = {
|
||||
| __________________^
|
||||
LL | let _x: i32 = {
|
||||
| ___________________^
|
||||
LL | |
|
||||
LL | | foo();
|
||||
| | - help: consider removing this semicolon
|
||||
|
|
13
src/test/ui/block-result/consider-removing-last-semi.fixed
Normal file
13
src/test/ui/block-result/consider-removing-last-semi.fixed
Normal file
|
@ -0,0 +1,13 @@
|
|||
// run-rustfix
|
||||
|
||||
pub fn f() -> String { //~ ERROR mismatched types
|
||||
0u8;
|
||||
"bla".to_string()
|
||||
}
|
||||
|
||||
pub fn g() -> String { //~ ERROR mismatched types
|
||||
"this won't work".to_string();
|
||||
"removeme".to_string()
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -1,9 +1,11 @@
|
|||
fn f() -> String { //~ ERROR mismatched types
|
||||
// run-rustfix
|
||||
|
||||
pub fn f() -> String { //~ ERROR mismatched types
|
||||
0u8;
|
||||
"bla".to_string();
|
||||
}
|
||||
|
||||
fn g() -> String { //~ ERROR mismatched types
|
||||
pub fn g() -> String { //~ ERROR mismatched types
|
||||
"this won't work".to_string();
|
||||
"removeme".to_string();
|
||||
}
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/consider-removing-last-semi.rs:1:11
|
||||
--> $DIR/consider-removing-last-semi.rs:3:15
|
||||
|
|
||||
LL | fn f() -> String {
|
||||
| - ^^^^^^ expected struct `std::string::String`, found `()`
|
||||
| |
|
||||
| implicitly returns `()` as its body has no tail or `return` expression
|
||||
LL | pub fn f() -> String {
|
||||
| - ^^^^^^ expected struct `std::string::String`, found `()`
|
||||
| |
|
||||
| implicitly returns `()` as its body has no tail or `return` expression
|
||||
LL | 0u8;
|
||||
LL | "bla".to_string();
|
||||
| - help: consider removing this semicolon
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/consider-removing-last-semi.rs:6:11
|
||||
--> $DIR/consider-removing-last-semi.rs:8:15
|
||||
|
|
||||
LL | fn g() -> String {
|
||||
| - ^^^^^^ expected struct `std::string::String`, found `()`
|
||||
| |
|
||||
| implicitly returns `()` as its body has no tail or `return` expression
|
||||
LL | pub fn g() -> String {
|
||||
| - ^^^^^^ expected struct `std::string::String`, found `()`
|
||||
| |
|
||||
| implicitly returns `()` as its body has no tail or `return` expression
|
||||
LL | "this won't work".to_string();
|
||||
LL | "removeme".to_string();
|
||||
| - help: consider removing this semicolon
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
// #41425 -- error message "mismatched types" has wrong types
|
||||
// run-rustfix
|
||||
|
||||
fn plus_one(x: i32) -> i32 { //~ ERROR mismatched types
|
||||
x + 1
|
||||
}
|
||||
|
||||
fn foo() -> Result<u8, u64> { //~ ERROR mismatched types
|
||||
Ok(1)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let x = plus_one(5);
|
||||
let _ = foo();
|
||||
println!("X = {}", x);
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
// #41425 -- error message "mismatched types" has wrong types
|
||||
// run-rustfix
|
||||
|
||||
fn plus_one(x: i32) -> i32 { //~ ERROR mismatched types
|
||||
x + 1;
|
||||
|
@ -10,5 +11,6 @@ fn foo() -> Result<u8, u64> { //~ ERROR mismatched types
|
|||
|
||||
fn main() {
|
||||
let x = plus_one(5);
|
||||
let _ = foo();
|
||||
println!("X = {}", x);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/coercion-missing-tail-expected-type.rs:3:24
|
||||
--> $DIR/coercion-missing-tail-expected-type.rs:4:24
|
||||
|
|
||||
LL | fn plus_one(x: i32) -> i32 {
|
||||
| -------- ^^^ expected `i32`, found `()`
|
||||
|
@ -9,7 +9,7 @@ LL | x + 1;
|
|||
| - help: consider removing this semicolon
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/coercion-missing-tail-expected-type.rs:7:13
|
||||
--> $DIR/coercion-missing-tail-expected-type.rs:8:13
|
||||
|
|
||||
LL | fn foo() -> Result<u8, u64> {
|
||||
| --- ^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found `()`
|
||||
|
|
15
src/test/ui/const-generics/unused_braces.fixed
Normal file
15
src/test/ui/const-generics/unused_braces.fixed
Normal file
|
@ -0,0 +1,15 @@
|
|||
// check-pass
|
||||
// run-rustfix
|
||||
|
||||
#![allow(incomplete_features)]
|
||||
#![warn(unused_braces)]
|
||||
|
||||
#![feature(const_generics)]
|
||||
|
||||
struct A<const N: usize>;
|
||||
|
||||
fn main() {
|
||||
let _: A<7>; // ok
|
||||
let _: A< 7 >; //~ WARN unnecessary braces
|
||||
let _: A<{ 3 + 5 }>; // ok
|
||||
}
|
|
@ -1,8 +1,10 @@
|
|||
// check-pass
|
||||
// run-rustfix
|
||||
|
||||
#![allow(incomplete_features)]
|
||||
#![warn(unused_braces)]
|
||||
|
||||
#![feature(const_generics)]
|
||||
//~^ WARN the feature `const_generics` is incomplete
|
||||
|
||||
struct A<const N: usize>;
|
||||
|
||||
|
|
|
@ -1,23 +1,14 @@
|
|||
warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/unused_braces.rs:4:12
|
||||
|
|
||||
LL | #![feature(const_generics)]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #44580 <https://github.com/rust-lang/rust/issues/44580> for more information
|
||||
|
||||
warning: unnecessary braces around const expression
|
||||
--> $DIR/unused_braces.rs:11:14
|
||||
--> $DIR/unused_braces.rs:13:14
|
||||
|
|
||||
LL | let _: A<{ 7 }>;
|
||||
| ^^^^^ help: remove these braces
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused_braces.rs:2:9
|
||||
--> $DIR/unused_braces.rs:5:9
|
||||
|
|
||||
LL | #![warn(unused_braces)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: 2 warnings emitted
|
||||
warning: 1 warning emitted
|
||||
|
||||
|
|
9
src/test/ui/const_prop/ice-assert-fail-div-by-zero.rs
Normal file
9
src/test/ui/const_prop/ice-assert-fail-div-by-zero.rs
Normal file
|
@ -0,0 +1,9 @@
|
|||
// check-pass
|
||||
|
||||
pub struct Fixed64(i64);
|
||||
|
||||
pub fn div(f: Fixed64) {
|
||||
f.0 / 0;
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -0,0 +1,5 @@
|
|||
// run-rustfix
|
||||
|
||||
fn main() {
|
||||
let _x = !1; //~ ERROR cannot be used as a unary operator
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
// run-rustfix
|
||||
|
||||
fn main() {
|
||||
let x = ~1; //~ ERROR cannot be used as a unary operator
|
||||
let _x = ~1; //~ ERROR cannot be used as a unary operator
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
error: `~` cannot be used as a unary operator
|
||||
--> $DIR/issue-41679-tilde-bitwise-negation-attempt.rs:2:13
|
||||
--> $DIR/issue-41679-tilde-bitwise-negation-attempt.rs:4:14
|
||||
|
|
||||
LL | let x = ~1;
|
||||
| ^ help: use `!` to perform bitwise not
|
||||
LL | let _x = ~1;
|
||||
| ^ help: use `!` to perform bitwise not
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
69
src/test/ui/did_you_mean/issue-54109-without-witness.fixed
Normal file
69
src/test/ui/did_you_mean/issue-54109-without-witness.fixed
Normal file
|
@ -0,0 +1,69 @@
|
|||
// run-rustfix
|
||||
|
||||
// This test is to check if suggestions can be applied automatically.
|
||||
|
||||
#![allow(dead_code, unused_parens)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn test_and() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
|
||||
let _ = a && b; //~ ERROR `and` is not a logical operator
|
||||
//~| ERROR `and` is not a logical operator
|
||||
|
||||
if a && b { //~ ERROR `and` is not a logical operator
|
||||
//~| ERROR `and` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
||||
|
||||
fn test_or() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
|
||||
let _ = a || b; //~ ERROR `or` is not a logical operator
|
||||
//~| ERROR `or` is not a logical operator
|
||||
|
||||
if a || b { //~ ERROR `or` is not a logical operator
|
||||
//~| ERROR `or` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
||||
|
||||
fn test_and_par() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
if (a && b) { //~ ERROR `and` is not a logical operator
|
||||
//~| ERROR `and` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
||||
|
||||
fn test_or_par() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
if (a || b) { //~ ERROR `or` is not a logical operator
|
||||
//~| ERROR `or` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
||||
|
||||
fn test_while_and() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
while a && b { //~ ERROR `and` is not a logical operator
|
||||
//~| ERROR `and` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
||||
|
||||
fn test_while_or() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
while a || b { //~ ERROR `or` is not a logical operator
|
||||
//~| ERROR `or` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
69
src/test/ui/did_you_mean/issue-54109-without-witness.rs
Normal file
69
src/test/ui/did_you_mean/issue-54109-without-witness.rs
Normal file
|
@ -0,0 +1,69 @@
|
|||
// run-rustfix
|
||||
|
||||
// This test is to check if suggestions can be applied automatically.
|
||||
|
||||
#![allow(dead_code, unused_parens)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn test_and() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
|
||||
let _ = a and b; //~ ERROR `and` is not a logical operator
|
||||
//~| ERROR `and` is not a logical operator
|
||||
|
||||
if a and b { //~ ERROR `and` is not a logical operator
|
||||
//~| ERROR `and` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
||||
|
||||
fn test_or() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
|
||||
let _ = a or b; //~ ERROR `or` is not a logical operator
|
||||
//~| ERROR `or` is not a logical operator
|
||||
|
||||
if a or b { //~ ERROR `or` is not a logical operator
|
||||
//~| ERROR `or` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
||||
|
||||
fn test_and_par() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
if (a and b) { //~ ERROR `and` is not a logical operator
|
||||
//~| ERROR `and` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
||||
|
||||
fn test_or_par() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
if (a or b) { //~ ERROR `or` is not a logical operator
|
||||
//~| ERROR `or` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
||||
|
||||
fn test_while_and() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
while a and b { //~ ERROR `and` is not a logical operator
|
||||
//~| ERROR `and` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
||||
|
||||
fn test_while_or() {
|
||||
let a = true;
|
||||
let b = false;
|
||||
while a or b { //~ ERROR `or` is not a logical operator
|
||||
//~| ERROR `or` is not a logical operator
|
||||
println!("both");
|
||||
}
|
||||
}
|
130
src/test/ui/did_you_mean/issue-54109-without-witness.stderr
Normal file
130
src/test/ui/did_you_mean/issue-54109-without-witness.stderr
Normal file
|
@ -0,0 +1,130 @@
|
|||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:13:15
|
||||
|
|
||||
LL | let _ = a and b;
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:13:15
|
||||
|
|
||||
LL | let _ = a and b;
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:16:10
|
||||
|
|
||||
LL | if a and b {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:16:10
|
||||
|
|
||||
LL | if a and b {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:26:15
|
||||
|
|
||||
LL | let _ = a or b;
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:26:15
|
||||
|
|
||||
LL | let _ = a or b;
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:29:10
|
||||
|
|
||||
LL | if a or b {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:29:10
|
||||
|
|
||||
LL | if a or b {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:38:11
|
||||
|
|
||||
LL | if (a and b) {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:38:11
|
||||
|
|
||||
LL | if (a and b) {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:47:11
|
||||
|
|
||||
LL | if (a or b) {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:47:11
|
||||
|
|
||||
LL | if (a or b) {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:56:13
|
||||
|
|
||||
LL | while a and b {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:56:13
|
||||
|
|
||||
LL | while a and b {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:65:13
|
||||
|
|
||||
LL | while a or b {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:65:13
|
||||
|
|
||||
LL | while a or b {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: aborting due to 16 previous errors
|
||||
|
20
src/test/ui/error-codes/E0642.fixed
Normal file
20
src/test/ui/error-codes/E0642.fixed
Normal file
|
@ -0,0 +1,20 @@
|
|||
// run-rustfix
|
||||
|
||||
#![allow(unused)] // for rustfix
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
struct S;
|
||||
|
||||
trait T {
|
||||
fn foo(_: (i32, i32)); //~ ERROR patterns aren't allowed in methods without bodies
|
||||
|
||||
fn bar(_: (i32, i32)) {} //~ ERROR patterns aren't allowed in methods without bodies
|
||||
|
||||
fn method(_: S) {} //~ ERROR patterns aren't allowed in methods without bodies
|
||||
|
||||
fn f(&ident: &S) {} // ok
|
||||
fn g(&&ident: &&S) {} // ok
|
||||
fn h(mut ident: S) {} // ok
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -1,3 +1,7 @@
|
|||
// run-rustfix
|
||||
|
||||
#![allow(unused)] // for rustfix
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
struct S;
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error[E0642]: patterns aren't allowed in methods without bodies
|
||||
--> $DIR/E0642.rs:5:12
|
||||
--> $DIR/E0642.rs:9:12
|
||||
|
|
||||
LL | fn foo((x, y): (i32, i32));
|
||||
| ^^^^^^
|
||||
|
@ -10,7 +10,7 @@ LL | fn foo(_: (i32, i32));
|
|||
| ^
|
||||
|
||||
error[E0642]: patterns aren't allowed in methods without bodies
|
||||
--> $DIR/E0642.rs:7:12
|
||||
--> $DIR/E0642.rs:11:12
|
||||
|
|
||||
LL | fn bar((x, y): (i32, i32)) {}
|
||||
| ^^^^^^
|
||||
|
@ -21,7 +21,7 @@ LL | fn bar(_: (i32, i32)) {}
|
|||
| ^
|
||||
|
||||
error[E0642]: patterns aren't allowed in methods without bodies
|
||||
--> $DIR/E0642.rs:9:15
|
||||
--> $DIR/E0642.rs:13:15
|
||||
|
|
||||
LL | fn method(S { .. }: S) {}
|
||||
| ^^^^^^^^
|
||||
|
|
17
src/test/ui/generic/generic-no-mangle.fixed
Normal file
17
src/test/ui/generic/generic-no-mangle.fixed
Normal file
|
@ -0,0 +1,17 @@
|
|||
// run-rustfix
|
||||
|
||||
#![deny(no_mangle_generic_items)]
|
||||
|
||||
|
||||
pub fn foo<T>() {} //~ ERROR functions generic over types or consts must be mangled
|
||||
|
||||
|
||||
pub extern fn bar<T>() {} //~ ERROR functions generic over types or consts must be mangled
|
||||
|
||||
#[no_mangle]
|
||||
pub fn baz(x: &i32) -> &i32 { x }
|
||||
|
||||
#[no_mangle]
|
||||
pub fn qux<'a>(x: &'a i32) -> &i32 { x }
|
||||
|
||||
fn main() {}
|
|
@ -1,3 +1,5 @@
|
|||
// run-rustfix
|
||||
|
||||
#![deny(no_mangle_generic_items)]
|
||||
|
||||
#[no_mangle]
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error: functions generic over types or consts must be mangled
|
||||
--> $DIR/generic-no-mangle.rs:4:1
|
||||
--> $DIR/generic-no-mangle.rs:6:1
|
||||
|
|
||||
LL | #[no_mangle]
|
||||
| ------------ help: remove this attribute
|
||||
|
@ -7,13 +7,13 @@ LL | pub fn foo<T>() {}
|
|||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/generic-no-mangle.rs:1:9
|
||||
--> $DIR/generic-no-mangle.rs:3:9
|
||||
|
|
||||
LL | #![deny(no_mangle_generic_items)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: functions generic over types or consts must be mangled
|
||||
--> $DIR/generic-no-mangle.rs:7:1
|
||||
--> $DIR/generic-no-mangle.rs:9:1
|
||||
|
|
||||
LL | #[no_mangle]
|
||||
| ------------ help: remove this attribute
|
||||
|
|
20
src/test/ui/impossible_range.fixed
Normal file
20
src/test/ui/impossible_range.fixed
Normal file
|
@ -0,0 +1,20 @@
|
|||
// run-rustfix
|
||||
// Make sure that invalid ranges generate an error during parsing, not an ICE
|
||||
|
||||
#![allow(path_statements)]
|
||||
|
||||
pub fn main() {
|
||||
..;
|
||||
0..;
|
||||
..1;
|
||||
0..1;
|
||||
..; //~ERROR inclusive range with no end
|
||||
//~^HELP use `..` instead
|
||||
}
|
||||
|
||||
fn _foo1() {
|
||||
..=1;
|
||||
0..=1;
|
||||
0..; //~ERROR inclusive range with no end
|
||||
//~^HELP use `..` instead
|
||||
}
|
|
@ -1,5 +1,8 @@
|
|||
// run-rustfix
|
||||
// Make sure that invalid ranges generate an error during parsing, not an ICE
|
||||
|
||||
#![allow(path_statements)]
|
||||
|
||||
pub fn main() {
|
||||
..;
|
||||
0..;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error[E0586]: inclusive range with no end
|
||||
--> $DIR/impossible_range.rs:8:5
|
||||
--> $DIR/impossible_range.rs:11:5
|
||||
|
|
||||
LL | ..=;
|
||||
| ^^^ help: use `..` instead
|
||||
|
@ -7,7 +7,7 @@ LL | ..=;
|
|||
= note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`)
|
||||
|
||||
error[E0586]: inclusive range with no end
|
||||
--> $DIR/impossible_range.rs:15:6
|
||||
--> $DIR/impossible_range.rs:18:6
|
||||
|
|
||||
LL | 0..=;
|
||||
| ^^^ help: use `..` instead
|
||||
|
|
30
src/test/ui/issue-73914.rs
Normal file
30
src/test/ui/issue-73914.rs
Normal file
|
@ -0,0 +1,30 @@
|
|||
// build-pass
|
||||
// compile-flags:-Copt-level=0
|
||||
// edition:2018
|
||||
|
||||
struct S<T>(std::marker::PhantomData<T>);
|
||||
|
||||
impl<T> std::ops::Deref for S<T> {
|
||||
type Target = T;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
impl<T> std::ops::DerefMut for S<T> {
|
||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
async fn new() -> S<u64> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
async fn crash() {
|
||||
*new().await = 1 + 1;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _ = crash();
|
||||
}
|
10
src/test/ui/issues/issue-1962.fixed
Normal file
10
src/test/ui/issues/issue-1962.fixed
Normal file
|
@ -0,0 +1,10 @@
|
|||
// compile-flags: -D while-true
|
||||
// run-rustfix
|
||||
|
||||
fn main() {
|
||||
let mut i = 0;
|
||||
loop { //~ ERROR denote infinite loops with `loop
|
||||
i += 1;
|
||||
if i == 5 { break; }
|
||||
}
|
||||
}
|
|
@ -1,8 +1,10 @@
|
|||
// compile-flags: -D while-true
|
||||
// run-rustfix
|
||||
|
||||
fn main() {
|
||||
let mut i = 0;
|
||||
while true { //~ ERROR denote infinite loops with `loop
|
||||
i += 1;
|
||||
if i == 5 { break; }
|
||||
}
|
||||
let mut i = 0;
|
||||
while true { //~ ERROR denote infinite loops with `loop
|
||||
i += 1;
|
||||
if i == 5 { break; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
error: denote infinite loops with `loop { ... }`
|
||||
--> $DIR/issue-1962.rs:4:3
|
||||
--> $DIR/issue-1962.rs:6:5
|
||||
|
|
||||
LL | while true {
|
||||
| ^^^^^^^^^^ help: use `loop`
|
||||
LL | while true {
|
||||
| ^^^^^^^^^^ help: use `loop`
|
||||
|
|
||||
= note: requested on the command line with `-D while-true`
|
||||
|
||||
|
|
6
src/test/ui/issues/issue-40782.fixed
Normal file
6
src/test/ui/issues/issue-40782.fixed
Normal file
|
@ -0,0 +1,6 @@
|
|||
// run-rustfix
|
||||
|
||||
fn main() {
|
||||
for _i in 0..2 { //~ ERROR missing `in`
|
||||
}
|
||||
}
|
|
@ -1,4 +1,6 @@
|
|||
// run-rustfix
|
||||
|
||||
fn main() {
|
||||
for i 0..2 { //~ ERROR missing `in`
|
||||
for _i 0..2 { //~ ERROR missing `in`
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
error: missing `in` in `for` loop
|
||||
--> $DIR/issue-40782.rs:2:10
|
||||
--> $DIR/issue-40782.rs:4:11
|
||||
|
|
||||
LL | for i 0..2 {
|
||||
| ^ help: try adding `in` here
|
||||
LL | for _i 0..2 {
|
||||
| ^ help: try adding `in` here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
8
src/test/ui/issues/issue-46186.fixed
Normal file
8
src/test/ui/issues/issue-46186.fixed
Normal file
|
@ -0,0 +1,8 @@
|
|||
// run-rustfix
|
||||
|
||||
pub struct Struct {
|
||||
pub a: usize,
|
||||
}
|
||||
//~^ ERROR expected item, found `;`
|
||||
|
||||
fn main() {}
|
|
@ -1,5 +1,7 @@
|
|||
struct Struct {
|
||||
a: usize,
|
||||
// run-rustfix
|
||||
|
||||
pub struct Struct {
|
||||
pub a: usize,
|
||||
};
|
||||
//~^ ERROR expected item, found `;`
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error: expected item, found `;`
|
||||
--> $DIR/issue-46186.rs:3:2
|
||||
--> $DIR/issue-46186.rs:5:2
|
||||
|
|
||||
LL | };
|
||||
| ^ help: remove this semicolon
|
||||
|
|
8
src/test/ui/issues/issue-50571.fixed
Normal file
8
src/test/ui/issues/issue-50571.fixed
Normal file
|
@ -0,0 +1,8 @@
|
|||
// run-rustfix
|
||||
|
||||
trait Foo {
|
||||
fn foo(_: [i32; 2]) {}
|
||||
//~^ ERROR: patterns aren't allowed in methods without bodies
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -1,3 +1,5 @@
|
|||
// run-rustfix
|
||||
|
||||
trait Foo {
|
||||
fn foo([a, b]: [i32; 2]) {}
|
||||
//~^ ERROR: patterns aren't allowed in methods without bodies
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error[E0642]: patterns aren't allowed in methods without bodies
|
||||
--> $DIR/issue-50571.rs:2:12
|
||||
--> $DIR/issue-50571.rs:4:12
|
||||
|
|
||||
LL | fn foo([a, b]: [i32; 2]) {}
|
||||
| ^^^^^^
|
||||
|
|
107
src/test/ui/lint/issue-54538-unused-parens-lint.fixed
Normal file
107
src/test/ui/lint/issue-54538-unused-parens-lint.fixed
Normal file
|
@ -0,0 +1,107 @@
|
|||
// run-rustfix
|
||||
|
||||
#![feature(box_patterns, stmt_expr_attributes)]
|
||||
#![feature(or_patterns)]
|
||||
|
||||
#![allow(
|
||||
dead_code,
|
||||
ellipsis_inclusive_range_patterns,
|
||||
irrefutable_let_patterns,
|
||||
unreachable_patterns,
|
||||
unused_mut,
|
||||
unused_variables
|
||||
)]
|
||||
#![deny(unused_parens)]
|
||||
|
||||
fn lint_on_top_level() {
|
||||
let a = 0; //~ ERROR unnecessary parentheses around pattern
|
||||
for a in 0..1 {} //~ ERROR unnecessary parentheses around pattern
|
||||
if let a = 0 {} //~ ERROR unnecessary parentheses around pattern
|
||||
while let a = 0 {} //~ ERROR unnecessary parentheses around pattern
|
||||
fn foo(a: u8) {} //~ ERROR unnecessary parentheses around pattern
|
||||
let _ = |a: u8| 0; //~ ERROR unnecessary parentheses around pattern
|
||||
}
|
||||
|
||||
fn _no_lint_attr() {
|
||||
let _x = #[allow(dead_code)] (1 + 2);
|
||||
}
|
||||
|
||||
// Don't lint in these cases (#64106).
|
||||
fn or_patterns_no_lint() {
|
||||
match Box::new(0) {
|
||||
box (0 | 1) => {} // Should not lint as `box 0 | 1` binds as `(box 0) | 1`.
|
||||
_ => {}
|
||||
}
|
||||
|
||||
match 0 {
|
||||
x @ (0 | 1) => {} // Should not lint as `x @ 0 | 1` binds as `(x @ 0) | 1`.
|
||||
_ => {}
|
||||
}
|
||||
|
||||
if let &(0 | 1) = &0 {} // Should also not lint.
|
||||
if let &mut (0 | 1) = &mut 0 {} // Same.
|
||||
|
||||
fn foo((Ok(a) | Err(a)): Result<u8, u8>) {} // Doesn't parse if we remove parens for now.
|
||||
|
||||
let _ = |(Ok(a) | Err(a)): Result<u8, u8>| 1; // `|Ok(a) | Err(a)| 1` parses as bit-or.
|
||||
}
|
||||
|
||||
fn or_patterns_will_lint() {
|
||||
if let 0 | 1 = 0 {} //~ ERROR unnecessary parentheses around pattern
|
||||
if let (0 | 1,) = (0,) {} //~ ERROR unnecessary parentheses around pattern
|
||||
if let [0 | 1] = [0] {} //~ ERROR unnecessary parentheses around pattern
|
||||
if let 0 | 1 | 2 = 0 {} //~ ERROR unnecessary parentheses around pattern
|
||||
struct TS(u8);
|
||||
if let TS(0 | 1) = TS(0) {} //~ ERROR unnecessary parentheses around pattern
|
||||
struct NS { f: u8 }
|
||||
if let NS { f: 0 | 1 } = (NS { f: 0 }) {} //~ ERROR unnecessary parentheses around pattern
|
||||
}
|
||||
|
||||
// Don't lint on `&(mut x)` because `&mut x` means something else (#55342).
|
||||
fn deref_mut_binding_no_lint() {
|
||||
let &(mut x) = &0;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
match 1 {
|
||||
_ => {} //~ ERROR unnecessary parentheses around pattern
|
||||
y => {} //~ ERROR unnecessary parentheses around pattern
|
||||
ref r => {} //~ ERROR unnecessary parentheses around pattern
|
||||
e @ 1...2 => {} //~ ERROR unnecessary parentheses around pattern
|
||||
(1...2) => {} // Non ambiguous range pattern should not warn
|
||||
e @ (3...4) => {} // Non ambiguous range pattern should not warn
|
||||
}
|
||||
|
||||
match &1 {
|
||||
e @ &(1...2) => {} //~ ERROR unnecessary parentheses around pattern
|
||||
&_ => {} //~ ERROR unnecessary parentheses around pattern
|
||||
e @ &(1...2) => {} // Ambiguous range pattern should not warn
|
||||
&(1...2) => {} // Ambiguous range pattern should not warn
|
||||
}
|
||||
|
||||
match &1 {
|
||||
e @ &(1...2) | e @ &(3...4) => {} // Complex ambiguous pattern should not warn
|
||||
&_ => {}
|
||||
}
|
||||
|
||||
match 1 {
|
||||
_ => {} //~ ERROR unnecessary parentheses around pattern
|
||||
y => {} //~ ERROR unnecessary parentheses around pattern
|
||||
ref r => {} //~ ERROR unnecessary parentheses around pattern
|
||||
e @ 1..=2 => {} //~ ERROR unnecessary parentheses around pattern
|
||||
(1..=2) => {} // Non ambiguous range pattern should not warn
|
||||
e @ (3..=4) => {} // Non ambiguous range pattern should not warn
|
||||
}
|
||||
|
||||
match &1 {
|
||||
e @ &(1..=2) => {} //~ ERROR unnecessary parentheses around pattern
|
||||
&_ => {} //~ ERROR unnecessary parentheses around pattern
|
||||
e @ &(1..=2) => {} // Ambiguous range pattern should not warn
|
||||
&(1..=2) => {} // Ambiguous range pattern should not warn
|
||||
}
|
||||
|
||||
match &1 {
|
||||
e @ &(1..=2) | e @ &(3..=4) => {} // Complex ambiguous pattern should not warn
|
||||
&_ => {}
|
||||
}
|
||||
}
|
|
@ -1,10 +1,16 @@
|
|||
#![feature(box_patterns, stmt_expr_attributes)]
|
||||
// run-rustfix
|
||||
|
||||
#![feature(box_patterns, stmt_expr_attributes)]
|
||||
#![feature(or_patterns)]
|
||||
|
||||
#![allow(ellipsis_inclusive_range_patterns)]
|
||||
#![allow(unreachable_patterns)]
|
||||
#![allow(unused_variables)]
|
||||
#![allow(
|
||||
dead_code,
|
||||
ellipsis_inclusive_range_patterns,
|
||||
irrefutable_let_patterns,
|
||||
unreachable_patterns,
|
||||
unused_mut,
|
||||
unused_variables
|
||||
)]
|
||||
#![deny(unused_parens)]
|
||||
|
||||
fn lint_on_top_level() {
|
||||
|
|
|
@ -1,149 +1,149 @@
|
|||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:11:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:17:9
|
||||
|
|
||||
LL | let (a) = 0;
|
||||
| ^^^ help: remove these parentheses
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:8:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:14:9
|
||||
|
|
||||
LL | #![deny(unused_parens)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:12:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:18:9
|
||||
|
|
||||
LL | for (a) in 0..1 {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:13:12
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:19:12
|
||||
|
|
||||
LL | if let (a) = 0 {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:14:15
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:20:15
|
||||
|
|
||||
LL | while let (a) = 0 {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:15:12
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:21:12
|
||||
|
|
||||
LL | fn foo((a): u8) {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:16:14
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:22:14
|
||||
|
|
||||
LL | let _ = |(a): u8| 0;
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:44:12
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:50:12
|
||||
|
|
||||
LL | if let (0 | 1) = 0 {}
|
||||
| ^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:45:13
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:51:13
|
||||
|
|
||||
LL | if let ((0 | 1),) = (0,) {}
|
||||
| ^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:46:13
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:52:13
|
||||
|
|
||||
LL | if let [(0 | 1)] = [0] {}
|
||||
| ^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:47:16
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:53:16
|
||||
|
|
||||
LL | if let 0 | (1 | 2) = 0 {}
|
||||
| ^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:49:15
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:55:15
|
||||
|
|
||||
LL | if let TS((0 | 1)) = TS(0) {}
|
||||
| ^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:51:20
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:57:20
|
||||
|
|
||||
LL | if let NS { f: (0 | 1) } = (NS { f: 0 }) {}
|
||||
| ^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:61:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:67:9
|
||||
|
|
||||
LL | (_) => {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:62:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:68:9
|
||||
|
|
||||
LL | (y) => {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:63:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:69:9
|
||||
|
|
||||
LL | (ref r) => {}
|
||||
| ^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:64:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:70:9
|
||||
|
|
||||
LL | (e @ 1...2) => {}
|
||||
| ^^^^^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:70:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:76:9
|
||||
|
|
||||
LL | (e @ &(1...2)) => {}
|
||||
| ^^^^^^^^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:71:10
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:77:10
|
||||
|
|
||||
LL | &(_) => {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:82:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:88:9
|
||||
|
|
||||
LL | (_) => {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:83:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:89:9
|
||||
|
|
||||
LL | (y) => {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:84:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:90:9
|
||||
|
|
||||
LL | (ref r) => {}
|
||||
| ^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:85:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:91:9
|
||||
|
|
||||
LL | (e @ 1..=2) => {}
|
||||
| ^^^^^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:91:9
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:97:9
|
||||
|
|
||||
LL | (e @ &(1..=2)) => {}
|
||||
| ^^^^^^^^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around pattern
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:92:10
|
||||
--> $DIR/issue-54538-unused-parens-lint.rs:98:10
|
||||
|
|
||||
LL | &(_) => {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
|
79
src/test/ui/lint/lint-unnecessary-parens.fixed
Normal file
79
src/test/ui/lint/lint-unnecessary-parens.fixed
Normal file
|
@ -0,0 +1,79 @@
|
|||
// run-rustfix
|
||||
|
||||
#![deny(unused_parens)]
|
||||
#![allow(while_true)] // for rustfix
|
||||
|
||||
#[derive(Eq, PartialEq)]
|
||||
struct X { y: bool }
|
||||
impl X {
|
||||
fn foo(&self, conjunct: bool) -> bool { self.y && conjunct }
|
||||
}
|
||||
|
||||
fn foo() -> isize {
|
||||
return 1; //~ ERROR unnecessary parentheses around `return` value
|
||||
}
|
||||
fn bar(y: bool) -> X {
|
||||
return X { y }; //~ ERROR unnecessary parentheses around `return` value
|
||||
}
|
||||
|
||||
pub fn unused_parens_around_return_type() -> u32 { //~ ERROR unnecessary parentheses around type
|
||||
panic!()
|
||||
}
|
||||
|
||||
pub fn unused_parens_around_block_return() -> u32 {
|
||||
let _foo = {
|
||||
5 //~ ERROR unnecessary parentheses around block return value
|
||||
};
|
||||
5 //~ ERROR unnecessary parentheses around block return value
|
||||
}
|
||||
|
||||
pub trait Trait {
|
||||
fn test(&self);
|
||||
}
|
||||
|
||||
pub fn passes_unused_parens_lint() -> &'static (dyn Trait) {
|
||||
panic!()
|
||||
}
|
||||
|
||||
macro_rules! baz {
|
||||
($($foo:expr),+) => {
|
||||
($($foo),*)
|
||||
}
|
||||
}
|
||||
|
||||
pub const CONST_ITEM: usize = 10; //~ ERROR unnecessary parentheses around assigned value
|
||||
pub static STATIC_ITEM: usize = 10; //~ ERROR unnecessary parentheses around assigned value
|
||||
|
||||
fn main() {
|
||||
foo();
|
||||
bar(true); //~ ERROR unnecessary parentheses around function argument
|
||||
|
||||
if true {} //~ ERROR unnecessary parentheses around `if` condition
|
||||
while true {} //~ ERROR unnecessary parentheses around `while` condition
|
||||
match true { //~ ERROR unnecessary parentheses around `match` scrutinee expression
|
||||
_ => {}
|
||||
}
|
||||
if let 1 = 1 {} //~ ERROR unnecessary parentheses around `let` scrutinee expression
|
||||
while let 1 = 2 {} //~ ERROR unnecessary parentheses around `let` scrutinee expression
|
||||
let v = X { y: false };
|
||||
// struct lits needs parens, so these shouldn't warn.
|
||||
if (v == X { y: true }) {}
|
||||
if (X { y: true } == v) {}
|
||||
if (X { y: false }.y) {}
|
||||
|
||||
while (X { y: false }.foo(true)) {}
|
||||
while (true | X { y: false }.y) {}
|
||||
|
||||
match (X { y: false }) {
|
||||
_ => {}
|
||||
}
|
||||
|
||||
X { y: false }.foo(true); //~ ERROR unnecessary parentheses around method argument
|
||||
|
||||
let mut _a = 0; //~ ERROR unnecessary parentheses around assigned value
|
||||
_a = 0; //~ ERROR unnecessary parentheses around assigned value
|
||||
_a += 1; //~ ERROR unnecessary parentheses around assigned value
|
||||
|
||||
let _a = baz!(3, 4);
|
||||
let _b = baz!(3);
|
||||
}
|
|
@ -1,4 +1,7 @@
|
|||
// run-rustfix
|
||||
|
||||
#![deny(unused_parens)]
|
||||
#![allow(while_true)] // for rustfix
|
||||
|
||||
#[derive(Eq, PartialEq)]
|
||||
struct X { y: bool }
|
||||
|
@ -13,22 +16,22 @@ fn bar(y: bool) -> X {
|
|||
return (X { y }); //~ ERROR unnecessary parentheses around `return` value
|
||||
}
|
||||
|
||||
fn unused_parens_around_return_type() -> (u32) { //~ ERROR unnecessary parentheses around type
|
||||
pub fn unused_parens_around_return_type() -> (u32) { //~ ERROR unnecessary parentheses around type
|
||||
panic!()
|
||||
}
|
||||
|
||||
fn unused_parens_around_block_return() -> u32 {
|
||||
let foo = {
|
||||
pub fn unused_parens_around_block_return() -> u32 {
|
||||
let _foo = {
|
||||
(5) //~ ERROR unnecessary parentheses around block return value
|
||||
};
|
||||
(5) //~ ERROR unnecessary parentheses around block return value
|
||||
}
|
||||
|
||||
trait Trait {
|
||||
pub trait Trait {
|
||||
fn test(&self);
|
||||
}
|
||||
|
||||
fn passes_unused_parens_lint() -> &'static (dyn Trait) {
|
||||
pub fn passes_unused_parens_lint() -> &'static (dyn Trait) {
|
||||
panic!()
|
||||
}
|
||||
|
||||
|
@ -38,8 +41,8 @@ macro_rules! baz {
|
|||
}
|
||||
}
|
||||
|
||||
const CONST_ITEM: usize = (10); //~ ERROR unnecessary parentheses around assigned value
|
||||
static STATIC_ITEM: usize = (10); //~ ERROR unnecessary parentheses around assigned value
|
||||
pub const CONST_ITEM: usize = (10); //~ ERROR unnecessary parentheses around assigned value
|
||||
pub static STATIC_ITEM: usize = (10); //~ ERROR unnecessary parentheses around assigned value
|
||||
|
||||
fn main() {
|
||||
foo();
|
||||
|
@ -47,7 +50,6 @@ fn main() {
|
|||
|
||||
if (true) {} //~ ERROR unnecessary parentheses around `if` condition
|
||||
while (true) {} //~ ERROR unnecessary parentheses around `while` condition
|
||||
//~^ WARN denote infinite loops with
|
||||
match (true) { //~ ERROR unnecessary parentheses around `match` scrutinee expression
|
||||
_ => {}
|
||||
}
|
||||
|
|
|
@ -1,118 +1,110 @@
|
|||
error: unnecessary parentheses around `return` value
|
||||
--> $DIR/lint-unnecessary-parens.rs:10:12
|
||||
--> $DIR/lint-unnecessary-parens.rs:13:12
|
||||
|
|
||||
LL | return (1);
|
||||
| ^^^ help: remove these parentheses
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/lint-unnecessary-parens.rs:1:9
|
||||
--> $DIR/lint-unnecessary-parens.rs:3:9
|
||||
|
|
||||
LL | #![deny(unused_parens)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: unnecessary parentheses around `return` value
|
||||
--> $DIR/lint-unnecessary-parens.rs:13:12
|
||||
--> $DIR/lint-unnecessary-parens.rs:16:12
|
||||
|
|
||||
LL | return (X { y });
|
||||
| ^^^^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around type
|
||||
--> $DIR/lint-unnecessary-parens.rs:16:42
|
||||
--> $DIR/lint-unnecessary-parens.rs:19:46
|
||||
|
|
||||
LL | fn unused_parens_around_return_type() -> (u32) {
|
||||
| ^^^^^ help: remove these parentheses
|
||||
LL | pub fn unused_parens_around_return_type() -> (u32) {
|
||||
| ^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around block return value
|
||||
--> $DIR/lint-unnecessary-parens.rs:22:9
|
||||
--> $DIR/lint-unnecessary-parens.rs:25:9
|
||||
|
|
||||
LL | (5)
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around block return value
|
||||
--> $DIR/lint-unnecessary-parens.rs:24:5
|
||||
--> $DIR/lint-unnecessary-parens.rs:27:5
|
||||
|
|
||||
LL | (5)
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around assigned value
|
||||
--> $DIR/lint-unnecessary-parens.rs:41:27
|
||||
--> $DIR/lint-unnecessary-parens.rs:44:31
|
||||
|
|
||||
LL | const CONST_ITEM: usize = (10);
|
||||
| ^^^^ help: remove these parentheses
|
||||
LL | pub const CONST_ITEM: usize = (10);
|
||||
| ^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around assigned value
|
||||
--> $DIR/lint-unnecessary-parens.rs:42:29
|
||||
--> $DIR/lint-unnecessary-parens.rs:45:33
|
||||
|
|
||||
LL | static STATIC_ITEM: usize = (10);
|
||||
| ^^^^ help: remove these parentheses
|
||||
LL | pub static STATIC_ITEM: usize = (10);
|
||||
| ^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around function argument
|
||||
--> $DIR/lint-unnecessary-parens.rs:46:9
|
||||
--> $DIR/lint-unnecessary-parens.rs:49:9
|
||||
|
|
||||
LL | bar((true));
|
||||
| ^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around `if` condition
|
||||
--> $DIR/lint-unnecessary-parens.rs:48:8
|
||||
--> $DIR/lint-unnecessary-parens.rs:51:8
|
||||
|
|
||||
LL | if (true) {}
|
||||
| ^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around `while` condition
|
||||
--> $DIR/lint-unnecessary-parens.rs:49:11
|
||||
--> $DIR/lint-unnecessary-parens.rs:52:11
|
||||
|
|
||||
LL | while (true) {}
|
||||
| ^^^^^^ help: remove these parentheses
|
||||
|
||||
warning: denote infinite loops with `loop { ... }`
|
||||
--> $DIR/lint-unnecessary-parens.rs:49:5
|
||||
|
|
||||
LL | while (true) {}
|
||||
| ^^^^^^^^^^^^ help: use `loop`
|
||||
|
|
||||
= note: `#[warn(while_true)]` on by default
|
||||
|
||||
error: unnecessary parentheses around `match` scrutinee expression
|
||||
--> $DIR/lint-unnecessary-parens.rs:51:11
|
||||
--> $DIR/lint-unnecessary-parens.rs:53:11
|
||||
|
|
||||
LL | match (true) {
|
||||
| ^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around `let` scrutinee expression
|
||||
--> $DIR/lint-unnecessary-parens.rs:54:16
|
||||
--> $DIR/lint-unnecessary-parens.rs:56:16
|
||||
|
|
||||
LL | if let 1 = (1) {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around `let` scrutinee expression
|
||||
--> $DIR/lint-unnecessary-parens.rs:55:19
|
||||
--> $DIR/lint-unnecessary-parens.rs:57:19
|
||||
|
|
||||
LL | while let 1 = (2) {}
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around method argument
|
||||
--> $DIR/lint-unnecessary-parens.rs:69:24
|
||||
--> $DIR/lint-unnecessary-parens.rs:71:24
|
||||
|
|
||||
LL | X { y: false }.foo((true));
|
||||
| ^^^^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around assigned value
|
||||
--> $DIR/lint-unnecessary-parens.rs:71:18
|
||||
--> $DIR/lint-unnecessary-parens.rs:73:18
|
||||
|
|
||||
LL | let mut _a = (0);
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around assigned value
|
||||
--> $DIR/lint-unnecessary-parens.rs:72:10
|
||||
--> $DIR/lint-unnecessary-parens.rs:74:10
|
||||
|
|
||||
LL | _a = (0);
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: unnecessary parentheses around assigned value
|
||||
--> $DIR/lint-unnecessary-parens.rs:73:11
|
||||
--> $DIR/lint-unnecessary-parens.rs:75:11
|
||||
|
|
||||
LL | _a += (1);
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
error: aborting due to 17 previous errors; 1 warning emitted
|
||||
error: aborting due to 17 previous errors
|
||||
|
||||
|
|
14
src/test/ui/lint/lint-unused-mut-self.fixed
Normal file
14
src/test/ui/lint/lint-unused-mut-self.fixed
Normal file
|
@ -0,0 +1,14 @@
|
|||
// run-rustfix
|
||||
|
||||
#![allow(unused_assignments)]
|
||||
#![allow(unused_variables)]
|
||||
#![allow(dead_code)]
|
||||
#![deny(unused_mut)]
|
||||
|
||||
struct Foo;
|
||||
impl Foo {
|
||||
fn foo(self) {} //~ ERROR: variable does not need to be mutable
|
||||
fn bar(self: Box<Foo>) {} //~ ERROR: variable does not need to be mutable
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -1,3 +1,5 @@
|
|||
// run-rustfix
|
||||
|
||||
#![allow(unused_assignments)]
|
||||
#![allow(unused_variables)]
|
||||
#![allow(dead_code)]
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-self.rs:8:12
|
||||
--> $DIR/lint-unused-mut-self.rs:10:12
|
||||
|
|
||||
LL | fn foo(mut self) {}
|
||||
| ----^^^^
|
||||
|
@ -7,13 +7,13 @@ LL | fn foo(mut self) {}
|
|||
| help: remove this `mut`
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/lint-unused-mut-self.rs:4:9
|
||||
--> $DIR/lint-unused-mut-self.rs:6:9
|
||||
|
|
||||
LL | #![deny(unused_mut)]
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-self.rs:9:12
|
||||
--> $DIR/lint-unused-mut-self.rs:11:12
|
||||
|
|
||||
LL | fn bar(mut self: Box<Foo>) {}
|
||||
| ----^^^^
|
||||
|
|
|
@ -92,13 +92,16 @@ fn main() {
|
|||
mut x => {} //~ WARN: variable does not need to be mutable
|
||||
|
||||
}
|
||||
match (30, 2) {
|
||||
(mut x, 1) | //~ WARN: variable does not need to be mutable
|
||||
|
||||
(mut x, 2) |
|
||||
(mut x, 3) => {
|
||||
}
|
||||
_ => {}
|
||||
match (30, 2) {
|
||||
// FIXME: Here's a false positive,
|
||||
// shouldn't be removed `mut` not to be bound with a different way.
|
||||
(mut x, 1) | //~ WARN: variable does not need to be mutable
|
||||
|
||||
(mut x, 2) |
|
||||
(mut x, 3) => {
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
let x = |mut y: isize| 10; //~ WARN: variable does not need to be mutable
|
||||
|
|
|
@ -69,7 +69,7 @@ LL | mut a: i32,
|
|||
| help: remove this `mut`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-variables.rs:104:14
|
||||
--> $DIR/lint-unused-mut-variables.rs:107:14
|
||||
|
|
||||
LL | let x = |mut y: isize| 10;
|
||||
| ----^
|
||||
|
@ -141,15 +141,15 @@ LL | mut x => {}
|
|||
| help: remove this `mut`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-variables.rs:96:8
|
||||
--> $DIR/lint-unused-mut-variables.rs:99:10
|
||||
|
|
||||
LL | (mut x, 1) |
|
||||
| ----^
|
||||
| |
|
||||
| help: remove this `mut`
|
||||
LL | (mut x, 1) |
|
||||
| ----^
|
||||
| |
|
||||
| help: remove this `mut`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-variables.rs:109:9
|
||||
--> $DIR/lint-unused-mut-variables.rs:112:9
|
||||
|
|
||||
LL | let mut a = &mut 5;
|
||||
| ----^
|
||||
|
@ -157,7 +157,7 @@ LL | let mut a = &mut 5;
|
|||
| help: remove this `mut`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-variables.rs:114:9
|
||||
--> $DIR/lint-unused-mut-variables.rs:117:9
|
||||
|
|
||||
LL | let mut b = (&mut a,);
|
||||
| ----^
|
||||
|
@ -165,7 +165,7 @@ LL | let mut b = (&mut a,);
|
|||
| help: remove this `mut`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-variables.rs:117:9
|
||||
--> $DIR/lint-unused-mut-variables.rs:120:9
|
||||
|
|
||||
LL | let mut x = &mut 1;
|
||||
| ----^
|
||||
|
@ -173,7 +173,7 @@ LL | let mut x = &mut 1;
|
|||
| help: remove this `mut`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-variables.rs:129:9
|
||||
--> $DIR/lint-unused-mut-variables.rs:132:9
|
||||
|
|
||||
LL | let mut v : &mut Vec<()> = &mut vec![];
|
||||
| ----^
|
||||
|
@ -181,7 +181,7 @@ LL | let mut v : &mut Vec<()> = &mut vec![];
|
|||
| help: remove this `mut`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-variables.rs:184:9
|
||||
--> $DIR/lint-unused-mut-variables.rs:187:9
|
||||
|
|
||||
LL | let mut raw_address_of_const = 1;
|
||||
| ----^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -189,7 +189,7 @@ LL | let mut raw_address_of_const = 1;
|
|||
| help: remove this `mut`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-variables.rs:106:13
|
||||
--> $DIR/lint-unused-mut-variables.rs:109:13
|
||||
|
|
||||
LL | fn what(mut foo: isize) {}
|
||||
| ----^^^
|
||||
|
@ -197,7 +197,7 @@ LL | fn what(mut foo: isize) {}
|
|||
| help: remove this `mut`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-variables.rs:124:20
|
||||
--> $DIR/lint-unused-mut-variables.rs:127:20
|
||||
|
|
||||
LL | fn mut_ref_arg(mut arg : &mut [u8]) -> &mut [u8] {
|
||||
| ----^^^
|
||||
|
@ -205,7 +205,7 @@ LL | fn mut_ref_arg(mut arg : &mut [u8]) -> &mut [u8] {
|
|||
| help: remove this `mut`
|
||||
|
||||
error: variable does not need to be mutable
|
||||
--> $DIR/lint-unused-mut-variables.rs:202:9
|
||||
--> $DIR/lint-unused-mut-variables.rs:205:9
|
||||
|
|
||||
LL | let mut b = vec![2];
|
||||
| ----^
|
||||
|
@ -213,7 +213,7 @@ LL | let mut b = vec![2];
|
|||
| help: remove this `mut`
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/lint-unused-mut-variables.rs:198:8
|
||||
--> $DIR/lint-unused-mut-variables.rs:201:8
|
||||
|
|
||||
LL | #[deny(unused_mut)]
|
||||
| ^^^^^^^^^^
|
||||
|
|
66
src/test/ui/lint/suggestions.fixed
Normal file
66
src/test/ui/lint/suggestions.fixed
Normal file
|
@ -0,0 +1,66 @@
|
|||
// ignore-tidy-tab
|
||||
// run-rustfix
|
||||
|
||||
#![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issue #43896
|
||||
|
||||
#[no_mangle] pub static DISCOVERY: usize = 1;
|
||||
//~^ ERROR const items should never be `#[no_mangle]`
|
||||
//~| HELP try a static value
|
||||
|
||||
|
||||
//~^ HELP remove this attribute
|
||||
pub fn defiant<T>(_t: T) {}
|
||||
//~^ WARN functions generic over types or consts must be mangled
|
||||
|
||||
#[no_mangle]
|
||||
fn rio_grande() {}
|
||||
|
||||
mod badlands {
|
||||
// The private-no-mangle lints shouldn't suggest inserting `pub` when the
|
||||
// item is already `pub` (but triggered the lint because, e.g., it's in a
|
||||
// private module). (Issue #47383)
|
||||
#[no_mangle] pub static DAUNTLESS: bool = true;
|
||||
//~^ ERROR const items should never be `#[no_mangle]`
|
||||
//~| HELP try a static value
|
||||
#[allow(dead_code)] // for rustfix
|
||||
pub fn val_jean<T>() {}
|
||||
//~^ WARN functions generic over types or consts must be mangled
|
||||
//~| HELP remove this attribute
|
||||
|
||||
// ... but we can suggest just-`pub` instead of restricted
|
||||
#[no_mangle] pub static VETAR: bool = true;
|
||||
//~^ ERROR const items should never be `#[no_mangle]`
|
||||
//~| HELP try a static value
|
||||
#[allow(dead_code)] // for rustfix
|
||||
pub(crate) fn crossfield<T>() {}
|
||||
//~^ WARN functions generic over types or consts must be mangled
|
||||
//~| HELP remove this attribute
|
||||
}
|
||||
|
||||
struct Equinox {
|
||||
warp_factor: f32,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
loop {
|
||||
//~^ WARN denote infinite loops
|
||||
//~| HELP use `loop`
|
||||
let registry_no = format!("NX-{}", 74205);
|
||||
//~^ WARN does not need to be mutable
|
||||
//~| HELP remove this `mut`
|
||||
//~| WARN unnecessary parentheses
|
||||
//~| HELP remove these parentheses
|
||||
// the line after `mut` has a `\t` at the beginning, this is on purpose
|
||||
let b = 1;
|
||||
//~^^ WARN does not need to be mutable
|
||||
//~| HELP remove this `mut`
|
||||
let d = Equinox { warp_factor: 9.975 };
|
||||
match d {
|
||||
#[allow(unused_variables)] // for rustfix
|
||||
Equinox { warp_factor } => {}
|
||||
//~^ WARN this pattern is redundant
|
||||
//~| HELP use shorthand field pattern
|
||||
}
|
||||
println!("{} {}", registry_no, b);
|
||||
}
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
// ignore-tidy-tab
|
||||
// run-rustfix
|
||||
|
||||
#![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issue #43896
|
||||
|
||||
|
@ -21,6 +22,7 @@ mod badlands {
|
|||
#[no_mangle] pub const DAUNTLESS: bool = true;
|
||||
//~^ ERROR const items should never be `#[no_mangle]`
|
||||
//~| HELP try a static value
|
||||
#[allow(dead_code)] // for rustfix
|
||||
#[no_mangle] pub fn val_jean<T>() {}
|
||||
//~^ WARN functions generic over types or consts must be mangled
|
||||
//~| HELP remove this attribute
|
||||
|
@ -29,6 +31,7 @@ mod badlands {
|
|||
#[no_mangle] pub(crate) const VETAR: bool = true;
|
||||
//~^ ERROR const items should never be `#[no_mangle]`
|
||||
//~| HELP try a static value
|
||||
#[allow(dead_code)] // for rustfix
|
||||
#[no_mangle] pub(crate) fn crossfield<T>() {}
|
||||
//~^ WARN functions generic over types or consts must be mangled
|
||||
//~| HELP remove this attribute
|
||||
|
@ -54,6 +57,7 @@ fn main() {
|
|||
//~| HELP remove this `mut`
|
||||
let d = Equinox { warp_factor: 9.975 };
|
||||
match d {
|
||||
#[allow(unused_variables)] // for rustfix
|
||||
Equinox { warp_factor: warp_factor } => {}
|
||||
//~^ WARN this pattern is redundant
|
||||
//~| HELP use shorthand field pattern
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
warning: denote infinite loops with `loop { ... }`
|
||||
--> $DIR/suggestions.rs:42:5
|
||||
--> $DIR/suggestions.rs:45:5
|
||||
|
|
||||
LL | while true {
|
||||
| ^^^^^^^^^^ help: use `loop`
|
||||
|
@ -7,19 +7,19 @@ LL | while true {
|
|||
= note: `#[warn(while_true)]` on by default
|
||||
|
||||
warning: unnecessary parentheses around assigned value
|
||||
--> $DIR/suggestions.rs:45:31
|
||||
--> $DIR/suggestions.rs:48:31
|
||||
|
|
||||
LL | let mut registry_no = (format!("NX-{}", 74205));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/suggestions.rs:3:21
|
||||
--> $DIR/suggestions.rs:4:21
|
||||
|
|
||||
LL | #![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issue #43896
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/suggestions.rs:45:13
|
||||
--> $DIR/suggestions.rs:48:13
|
||||
|
|
||||
LL | let mut registry_no = (format!("NX-{}", 74205));
|
||||
| ----^^^^^^^^^^^
|
||||
|
@ -27,13 +27,13 @@ LL | let mut registry_no = (format!("NX-{}", 74205));
|
|||
| help: remove this `mut`
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/suggestions.rs:3:9
|
||||
--> $DIR/suggestions.rs:4:9
|
||||
|
|
||||
LL | #![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issue #43896
|
||||
| ^^^^^^^^^^
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> $DIR/suggestions.rs:51:13
|
||||
--> $DIR/suggestions.rs:54:13
|
||||
|
|
||||
LL | let mut
|
||||
| _____________^
|
||||
|
@ -45,7 +45,7 @@ LL | || b = 1;
|
|||
| help: remove this `mut`
|
||||
|
||||
error: const items should never be `#[no_mangle]`
|
||||
--> $DIR/suggestions.rs:5:14
|
||||
--> $DIR/suggestions.rs:6:14
|
||||
|
|
||||
LL | #[no_mangle] const DISCOVERY: usize = 1;
|
||||
| -----^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -55,7 +55,7 @@ LL | #[no_mangle] const DISCOVERY: usize = 1;
|
|||
= note: `#[deny(no_mangle_const_items)]` on by default
|
||||
|
||||
warning: functions generic over types or consts must be mangled
|
||||
--> $DIR/suggestions.rs:11:1
|
||||
--> $DIR/suggestions.rs:12:1
|
||||
|
|
||||
LL | #[no_mangle]
|
||||
| ------------ help: remove this attribute
|
||||
|
@ -66,7 +66,7 @@ LL | pub fn defiant<T>(_t: T) {}
|
|||
= note: `#[warn(no_mangle_generic_items)]` on by default
|
||||
|
||||
warning: the `warp_factor:` in this pattern is redundant
|
||||
--> $DIR/suggestions.rs:57:23
|
||||
--> $DIR/suggestions.rs:61:23
|
||||
|
|
||||
LL | Equinox { warp_factor: warp_factor } => {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use shorthand field pattern: `warp_factor`
|
||||
|
@ -74,7 +74,7 @@ LL | Equinox { warp_factor: warp_factor } => {}
|
|||
= note: `#[warn(non_shorthand_field_patterns)]` on by default
|
||||
|
||||
error: const items should never be `#[no_mangle]`
|
||||
--> $DIR/suggestions.rs:21:18
|
||||
--> $DIR/suggestions.rs:22:18
|
||||
|
|
||||
LL | #[no_mangle] pub const DAUNTLESS: bool = true;
|
||||
| ---------^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -82,7 +82,7 @@ LL | #[no_mangle] pub const DAUNTLESS: bool = true;
|
|||
| help: try a static value: `pub static`
|
||||
|
||||
warning: functions generic over types or consts must be mangled
|
||||
--> $DIR/suggestions.rs:24:18
|
||||
--> $DIR/suggestions.rs:26:18
|
||||
|
|
||||
LL | #[no_mangle] pub fn val_jean<T>() {}
|
||||
| ------------ ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -90,7 +90,7 @@ LL | #[no_mangle] pub fn val_jean<T>() {}
|
|||
| help: remove this attribute
|
||||
|
||||
error: const items should never be `#[no_mangle]`
|
||||
--> $DIR/suggestions.rs:29:18
|
||||
--> $DIR/suggestions.rs:31:18
|
||||
|
|
||||
LL | #[no_mangle] pub(crate) const VETAR: bool = true;
|
||||
| ----------------^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -98,7 +98,7 @@ LL | #[no_mangle] pub(crate) const VETAR: bool = true;
|
|||
| help: try a static value: `pub static`
|
||||
|
||||
warning: functions generic over types or consts must be mangled
|
||||
--> $DIR/suggestions.rs:32:18
|
||||
--> $DIR/suggestions.rs:35:18
|
||||
|
|
||||
LL | #[no_mangle] pub(crate) fn crossfield<T>() {}
|
||||
| ------------ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
53
src/test/ui/lint/unused_braces.fixed
Normal file
53
src/test/ui/lint/unused_braces.fixed
Normal file
|
@ -0,0 +1,53 @@
|
|||
// check-pass
|
||||
// run-rustfix
|
||||
|
||||
#![warn(unused_braces, unused_parens)]
|
||||
#![allow(unreachable_code, unused_unsafe)] // for rustfix
|
||||
|
||||
fn consume<T>(_: T) {}
|
||||
|
||||
fn main() {
|
||||
let _ = 7;
|
||||
//~^WARN unnecessary parentheses
|
||||
|
||||
// Do not emit a lint in these cases,
|
||||
// as we have to be careful with
|
||||
// `ref` patterns.
|
||||
{
|
||||
let _ = { 7 };
|
||||
|
||||
if let 7 = { 7 } { }
|
||||
|
||||
match { 7 } {
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
|
||||
if true {
|
||||
//~^ WARN unnecessary braces
|
||||
}
|
||||
|
||||
while false {
|
||||
//~^ WARN unnecessary braces
|
||||
}
|
||||
|
||||
let _: [u8; 3 ];
|
||||
//~^ WARN unnecessary braces
|
||||
|
||||
consume( 7 );
|
||||
//~^ WARN unnecessary braces
|
||||
|
||||
// Do not emit lint for multiline blocks.
|
||||
let _ = {
|
||||
7
|
||||
};
|
||||
|
||||
// Do not emit lint for unsafe blocks.
|
||||
let _ = unsafe { 7 };
|
||||
|
||||
// Do not emit lint, as the `{` would then
|
||||
// be parsed as part of the `return`.
|
||||
if { return } {
|
||||
|
||||
}
|
||||
}
|
|
@ -1,5 +1,8 @@
|
|||
// check-pass
|
||||
// run-rustfix
|
||||
|
||||
#![warn(unused_braces, unused_parens)]
|
||||
#![allow(unreachable_code, unused_unsafe)] // for rustfix
|
||||
|
||||
fn consume<T>(_: T) {}
|
||||
|
||||
|
|
|
@ -1,41 +1,41 @@
|
|||
warning: unnecessary parentheses around assigned value
|
||||
--> $DIR/unused_braces.rs:7:13
|
||||
--> $DIR/unused_braces.rs:10:13
|
||||
|
|
||||
LL | let _ = (7);
|
||||
| ^^^ help: remove these parentheses
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused_braces.rs:2:24
|
||||
--> $DIR/unused_braces.rs:4:24
|
||||
|
|
||||
LL | #![warn(unused_braces, unused_parens)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unnecessary braces around `if` condition
|
||||
--> $DIR/unused_braces.rs:23:8
|
||||
--> $DIR/unused_braces.rs:26:8
|
||||
|
|
||||
LL | if { true } {
|
||||
| ^^^^^^^^ help: remove these braces
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused_braces.rs:2:9
|
||||
--> $DIR/unused_braces.rs:4:9
|
||||
|
|
||||
LL | #![warn(unused_braces, unused_parens)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unnecessary braces around `while` condition
|
||||
--> $DIR/unused_braces.rs:27:11
|
||||
--> $DIR/unused_braces.rs:30:11
|
||||
|
|
||||
LL | while { false } {
|
||||
| ^^^^^^^^^ help: remove these braces
|
||||
|
||||
warning: unnecessary braces around const expression
|
||||
--> $DIR/unused_braces.rs:31:17
|
||||
--> $DIR/unused_braces.rs:34:17
|
||||
|
|
||||
LL | let _: [u8; { 3 }];
|
||||
| ^^^^^ help: remove these braces
|
||||
|
||||
warning: unnecessary braces around function argument
|
||||
--> $DIR/unused_braces.rs:34:13
|
||||
--> $DIR/unused_braces.rs:37:13
|
||||
|
|
||||
LL | consume({ 7 });
|
||||
| ^^^^^ help: remove these braces
|
||||
|
|
26
src/test/ui/lint/unused_braces_borrow.fixed
Normal file
26
src/test/ui/lint/unused_braces_borrow.fixed
Normal file
|
@ -0,0 +1,26 @@
|
|||
// check-pass
|
||||
// run-rustfix
|
||||
|
||||
#![warn(unused_braces)]
|
||||
|
||||
// changing `&{ expr }` to `&expr` changes the semantic of the program
|
||||
// so we should not warn this case
|
||||
|
||||
#[repr(packed)]
|
||||
pub struct A {
|
||||
pub a: u8,
|
||||
pub b: u32,
|
||||
}
|
||||
|
||||
fn consume<T>(_: T) {}
|
||||
|
||||
fn main() {
|
||||
let a = A {
|
||||
a: 42,
|
||||
b: 1729,
|
||||
};
|
||||
|
||||
consume(&{ a.b });
|
||||
consume( a.b );
|
||||
//~^ WARN unnecessary braces
|
||||
}
|
|
@ -1,13 +1,15 @@
|
|||
// check-pass
|
||||
// run-rustfix
|
||||
|
||||
#![warn(unused_braces)]
|
||||
|
||||
// changing `&{ expr }` to `&expr` changes the semantic of the program
|
||||
// so we should not warn this case
|
||||
|
||||
#[repr(packed)]
|
||||
struct A {
|
||||
a: u8,
|
||||
b: u32,
|
||||
pub struct A {
|
||||
pub a: u8,
|
||||
pub b: u32,
|
||||
}
|
||||
|
||||
fn consume<T>(_: T) {}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
warning: unnecessary braces around function argument
|
||||
--> $DIR/unused_braces_borrow.rs:22:13
|
||||
--> $DIR/unused_braces_borrow.rs:24:13
|
||||
|
|
||||
LL | consume({ a.b });
|
||||
| ^^^^^^^ help: remove these braces
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused_braces_borrow.rs:2:9
|
||||
--> $DIR/unused_braces_borrow.rs:4:9
|
||||
|
|
||||
LL | #![warn(unused_braces)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
16
src/test/ui/nll/capture-mut-ref.fixed
Normal file
16
src/test/ui/nll/capture-mut-ref.fixed
Normal file
|
@ -0,0 +1,16 @@
|
|||
// run-rustfix
|
||||
|
||||
// Check that capturing a mutable reference by move and assigning to its
|
||||
// referent doesn't make the unused mut lint think that it is mutable.
|
||||
|
||||
#![deny(unused_mut)]
|
||||
|
||||
pub fn mutable_upvar() {
|
||||
let x = &mut 0;
|
||||
//~^ ERROR
|
||||
move || {
|
||||
*x = 1;
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue