提交 70f9d23b 编写于 作者: B bors

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
......@@ -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 @@ fn run(self, builder: &Builder<'_>) {
.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 @@ fn run(self, builder: &Builder<'_>) {
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 @@ pub fn new() -> 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 @@ pub fn into_raw(this: Self) -> *const 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);
......
#![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 @@ fn verify_piece(&mut self, p: &parse::Piece<'_>) {
("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 @@ fn visit_terminator(&mut self, terminator: &mut Terminator<'tcx>, location: Loca
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 @@ fn visit_terminator(&mut self, terminator: &mut Terminator<'tcx>, location: Loca
};
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 @@ pub(super) fn recover_closing_delimiter(
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 @@ fn parse_seq_to_before_tokens<T>(
// 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 @@ fn check_safety_of_rvalue_destructor_if_necessary(
) {
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 @@ fn link_region(
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 @@ fn walk_struct_expr(
// 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 @@ fn cat_upvar(&self, hir_id: hir::HirId, var_id: hir::HirId) -> McResult<PlaceWit
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 @@ fn cat_deref(
) -> 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) });
let ret = PlaceWithHirId::new(node.hir_id(), deref_ty, base_place.place.base, projections);
projections.push(Projection { kind: ProjectionKind::Deref, ty: deref_ty });
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 @@ fn cat_pattern_<F>(
}
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 @@ fn println_condition(condition: Condition) {
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 @@ fn println_condition(condition: Condition) {
markdown_css,
markdown_playground_url,
generate_search_filter,
generate_redirect_pages,
document_private,
document_hidden,
},
......
......@@ -154,38 +154,6 @@ pub fn as_str(&self) -> &'static str {
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 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
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 @@ struct Context {
/// 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 @@ fn item<F>(&mut self, item: clean::Item, all: &mut AllTypes, mut f: F) -> Result
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 trait_item(w: &mut Buffer, cx: &Context, m: &clean::Item, t: &clean::Item) {
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}:&nbsp;{t}\
<code>{f}:&nbsp;{t}\
</code></span>",
id = id,
ns_id = ns_id,
f = field.name.as_ref().unwrap(),
t = ty.print()
);
......@@ -3661,9 +3628,7 @@ fn doc_impl_item(
// 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 doc_impl_item(
}
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 doc_impl_item(
}
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 @@ fn macro_resolve(&self, path_str: &str, parent_id: Option<hir::HirId>) -> Option
fn resolve(
&self,
path_str: &str,
disambiguator: Option<&str>,
ns: Namespace,
current_item: &Option<String>,
parent_id: Option<hir::HirId>,
......@@ -203,11 +204,22 @@ fn resolve(
}
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 @@ fn fold_item(&mut self, mut item: Item) -> Option<Item> {
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 @@ fn fold_item(&mut self, mut item: Item) -> Option<Item> {
.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 @@ fn fold_item(&mut self, mut item: Item) -> Option<Item> {
Some(ns @ ValueNS) => {
match self.resolve(
path_str,
disambiguator,
ns,
&current_item,
base_node,
......@@ -657,6 +677,7 @@ fn fold_item(&mut self, mut item: Item) -> Option<Item> {
Some(ns @ TypeNS) => {
match self.resolve(
path_str,
disambiguator,
ns,
&current_item,
base_node,
......@@ -683,6 +704,7 @@ fn fold_item(&mut self, mut item: Item) -> Option<Item> {
.map(|res| (res, extra_fragment.clone())),
type_ns: match self.resolve(
path_str,
disambiguator,
TypeNS,
&current_item,
base_node,
......@@ -697,6 +719,7 @@ fn fold_item(&mut self, mut item: Item) -> Option<Item> {
},
value_ns: match self.resolve(
path_str,
disambiguator,
ValueNS,
&current_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)] = &[
......
#![deny(unsafe_op_in_unsafe_fn)]
use crate::io::prelude::*;
use crate::fmt;
......@@ -583,7 +584,8 @@ fn is_read_vectored(&self) -> bool {
#[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 @@ fn is_read_vectored(&self) -> bool {
#[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 @@ fn read_exact_at(&self, mut buf: &mut [u8], mut offset: u64) -> io::Result<()> {
/// 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 @@ fn read_exact_at(&self, mut buf: &mut [u8], mut offset: u64) -> io::Result<()> {
/// 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::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
......
// 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`]
......
// 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 @@ fn deref_mut(&mut self) -> &mut Foo { loop {} }
}
// @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 @@ fn deref(&self) -> &Foo { loop {} }
}
// @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]
......
// 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 {
......
// run-rustfix
fn foo() -> i32 {
0
}
fn main() {
let _x: i32 = {
//~^ ERROR mismatched types
foo() //~ HELP consider removing this semicolon
};
}
// run-rustfix
fn foo() -> i32 {
0
0
}
fn main() {
let x: i32 = {
let _x: i32 = {
//~^ ERROR mismatched types
foo(); //~ HELP consider removing this semicolon
};
......
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
......
// 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() {}
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();
}
......
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
......
// #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);
}
// #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);
}
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 `()`
......
// 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
}
// 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>;
......
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
// check-pass
pub struct Fixed64(i64);
pub fn div(f: Fixed64) {
f.0 / 0;
}
fn main() {}
// run-rustfix
fn main() {
let _x = !1; //~ ERROR cannot be used as a unary operator
}
// 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
}
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
// 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");
}
}
// 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");
}
}
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
// 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() {}
// run-rustfix
#![allow(unused)] // for rustfix
#[derive(Clone, Copy)]
struct S;
......
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) {}
| ^^^^^^^^
......
// 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() {}
// run-rustfix
#![deny(no_mangle_generic_items)]
#[no_mangle]
......
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
......
// 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
}
// run-rustfix
// Make sure that invalid ranges generate an error during parsing, not an ICE
#![allow(path_statements)]
pub fn main() {
..;
0..;
......
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
......
// 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();
}
// 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; }
}
}
// 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; }
}
}
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`
......
// run-rustfix
fn main() {
for _i in 0..2 { //~ ERROR missing `in`
}
}
// run-rustfix
fn main() {
for i 0..2 { //~ ERROR missing `in`
for _i 0..2 { //~ ERROR missing `in`
}
}
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
// run-rustfix
pub struct Struct {
pub a: usize,
}
//~^ ERROR expected item, found `;`
fn main() {}
struct Struct {
a: usize,
// run-rustfix
pub struct Struct {
pub a: usize,
};
//~^ ERROR expected item, found `;`
......
error: expected item, found `;`
--> $DIR/issue-46186.rs:3:2
--> $DIR/issue-46186.rs:5:2
|
LL | };
| ^ help: remove this semicolon
......
// run-rustfix
trait Foo {
fn foo(_: [i32; 2]) {}
//~^ ERROR: patterns aren't allowed in methods without bodies
}
fn main() {}
// run-rustfix
trait Foo {
fn foo([a, b]: [i32; 2]) {}
//~^ ERROR: patterns aren't allowed in methods without bodies
......
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]) {}
| ^^^^^^
......
// 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
&_ => {}
}
}
#![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() {
......
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
......
// 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);
}
// 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 @@ fn passes_unused_parens_lint() -> &'static (dyn Trait) {
}
}
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
_ => {}
}
......
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
// 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() {}
// run-rustfix
#![allow(unused_assignments)]
#![allow(unused_variables)]
#![allow(dead_code)]
......
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
// 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) => {
}
_ => {}
(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)]
| ^^^^^^^^^^
......
// 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);
}
}
// 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
......
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>() {}
| ------------ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
......
// 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 } {
}
}
// check-pass
// run-rustfix
#![warn(unused_braces, unused_parens)]
#![allow(unreachable_code, unused_unsafe)] // for rustfix
fn consume<T>(_: T) {}
......
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
......
// 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
}
// 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) {}
......
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)]
| ^^^^^^^^^^^^^
......
// 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() {}
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册