mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-05 11:48:30 +00:00
Auto merge of #94966 - matthiaskrgr:rollup-iqzswh3, r=matthiaskrgr
Rollup of 4 pull requests Successful merges: - #94810 (debuginfo: Fix bug in type name generation for dyn types with associated types but no other generic arguments.) - #94947 (fix typos) - #94956 (Fix small typo in FIXME) - #94958 (Support other types of pluralization in pluralize macro) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
83460d5e62
@ -226,13 +226,18 @@ fn push_debuginfo_type_name<'tcx>(
|
|||||||
if projection_bounds.len() != 0 {
|
if projection_bounds.len() != 0 {
|
||||||
if principal_has_generic_params {
|
if principal_has_generic_params {
|
||||||
// push_generic_params_internal() above added a `>` but we actually
|
// push_generic_params_internal() above added a `>` but we actually
|
||||||
// want to add more items to that list, so remove that again.
|
// want to add more items to that list, so remove that again...
|
||||||
pop_close_angle_bracket(output);
|
pop_close_angle_bracket(output);
|
||||||
|
// .. and add a comma to separate the regular generic args from the
|
||||||
|
// associated types.
|
||||||
|
push_arg_separator(cpp_like_debuginfo, output);
|
||||||
|
} else {
|
||||||
|
// push_generic_params_internal() did not add `<...>`, so we open
|
||||||
|
// angle brackets here.
|
||||||
|
output.push('<');
|
||||||
}
|
}
|
||||||
|
|
||||||
for (item_def_id, ty) in projection_bounds {
|
for (item_def_id, ty) in projection_bounds {
|
||||||
push_arg_separator(cpp_like_debuginfo, output);
|
|
||||||
|
|
||||||
if cpp_like_debuginfo {
|
if cpp_like_debuginfo {
|
||||||
output.push_str("assoc$<");
|
output.push_str("assoc$<");
|
||||||
push_item_name(tcx, item_def_id, false, output);
|
push_item_name(tcx, item_def_id, false, output);
|
||||||
@ -244,8 +249,10 @@ fn push_debuginfo_type_name<'tcx>(
|
|||||||
output.push('=');
|
output.push('=');
|
||||||
push_debuginfo_type_name(tcx, ty, true, output, visited);
|
push_debuginfo_type_name(tcx, ty, true, output, visited);
|
||||||
}
|
}
|
||||||
|
push_arg_separator(cpp_like_debuginfo, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pop_arg_separator(output);
|
||||||
push_close_angle_bracket(cpp_like_debuginfo, output);
|
push_close_angle_bracket(cpp_like_debuginfo, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -656,7 +656,7 @@ impl<T: Idx> BitRelations<HybridBitSet<T>> for ChunkedBitSet<T> {
|
|||||||
fn union(&mut self, other: &HybridBitSet<T>) -> bool {
|
fn union(&mut self, other: &HybridBitSet<T>) -> bool {
|
||||||
// FIXME: This is slow if `other` is dense, but it hasn't been a problem
|
// FIXME: This is slow if `other` is dense, but it hasn't been a problem
|
||||||
// in practice so far.
|
// in practice so far.
|
||||||
// If a a faster implementation of this operation is required, consider
|
// If a faster implementation of this operation is required, consider
|
||||||
// reopening https://github.com/rust-lang/rust/pull/94625
|
// reopening https://github.com/rust-lang/rust/pull/94625
|
||||||
assert_eq!(self.domain_size, other.domain_size());
|
assert_eq!(self.domain_size, other.domain_size());
|
||||||
sequential_update(|elem| self.insert(elem), other.iter())
|
sequential_update(|elem| self.insert(elem), other.iter())
|
||||||
@ -665,7 +665,7 @@ impl<T: Idx> BitRelations<HybridBitSet<T>> for ChunkedBitSet<T> {
|
|||||||
fn subtract(&mut self, other: &HybridBitSet<T>) -> bool {
|
fn subtract(&mut self, other: &HybridBitSet<T>) -> bool {
|
||||||
// FIXME: This is slow if `other` is dense, but it hasn't been a problem
|
// FIXME: This is slow if `other` is dense, but it hasn't been a problem
|
||||||
// in practice so far.
|
// in practice so far.
|
||||||
// If a a faster implementation of this operation is required, consider
|
// If a faster implementation of this operation is required, consider
|
||||||
// reopening https://github.com/rust-lang/rust/pull/94625
|
// reopening https://github.com/rust-lang/rust/pull/94625
|
||||||
assert_eq!(self.domain_size, other.domain_size());
|
assert_eq!(self.domain_size, other.domain_size());
|
||||||
sequential_update(|elem| self.remove(elem), other.iter())
|
sequential_update(|elem| self.remove(elem), other.iter())
|
||||||
|
@ -328,7 +328,7 @@ impl UnsafeCode {
|
|||||||
cx.struct_span_lint(UNSAFE_CODE, span, decorate);
|
cx.struct_span_lint(UNSAFE_CODE, span, decorate);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn report_overriden_symbol_name(&self, cx: &EarlyContext<'_>, span: Span, msg: &str) {
|
fn report_overridden_symbol_name(&self, cx: &EarlyContext<'_>, span: Span, msg: &str) {
|
||||||
self.report_unsafe(cx, span, |lint| {
|
self.report_unsafe(cx, span, |lint| {
|
||||||
lint.build(msg)
|
lint.build(msg)
|
||||||
.note(
|
.note(
|
||||||
@ -380,14 +380,14 @@ impl EarlyLintPass for UnsafeCode {
|
|||||||
|
|
||||||
ast::ItemKind::Fn(..) => {
|
ast::ItemKind::Fn(..) => {
|
||||||
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) {
|
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) {
|
||||||
self.report_overriden_symbol_name(
|
self.report_overridden_symbol_name(
|
||||||
cx,
|
cx,
|
||||||
attr.span,
|
attr.span,
|
||||||
"declaration of a `no_mangle` function",
|
"declaration of a `no_mangle` function",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) {
|
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) {
|
||||||
self.report_overriden_symbol_name(
|
self.report_overridden_symbol_name(
|
||||||
cx,
|
cx,
|
||||||
attr.span,
|
attr.span,
|
||||||
"declaration of a function with `export_name`",
|
"declaration of a function with `export_name`",
|
||||||
@ -397,14 +397,14 @@ impl EarlyLintPass for UnsafeCode {
|
|||||||
|
|
||||||
ast::ItemKind::Static(..) => {
|
ast::ItemKind::Static(..) => {
|
||||||
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) {
|
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) {
|
||||||
self.report_overriden_symbol_name(
|
self.report_overridden_symbol_name(
|
||||||
cx,
|
cx,
|
||||||
attr.span,
|
attr.span,
|
||||||
"declaration of a `no_mangle` static",
|
"declaration of a `no_mangle` static",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) {
|
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) {
|
||||||
self.report_overriden_symbol_name(
|
self.report_overridden_symbol_name(
|
||||||
cx,
|
cx,
|
||||||
attr.span,
|
attr.span,
|
||||||
"declaration of a static with `export_name`",
|
"declaration of a static with `export_name`",
|
||||||
@ -419,14 +419,14 @@ impl EarlyLintPass for UnsafeCode {
|
|||||||
fn check_impl_item(&mut self, cx: &EarlyContext<'_>, it: &ast::AssocItem) {
|
fn check_impl_item(&mut self, cx: &EarlyContext<'_>, it: &ast::AssocItem) {
|
||||||
if let ast::AssocItemKind::Fn(..) = it.kind {
|
if let ast::AssocItemKind::Fn(..) = it.kind {
|
||||||
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) {
|
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) {
|
||||||
self.report_overriden_symbol_name(
|
self.report_overridden_symbol_name(
|
||||||
cx,
|
cx,
|
||||||
attr.span,
|
attr.span,
|
||||||
"declaration of a `no_mangle` method",
|
"declaration of a `no_mangle` method",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) {
|
if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) {
|
||||||
self.report_overriden_symbol_name(
|
self.report_overridden_symbol_name(
|
||||||
cx,
|
cx,
|
||||||
attr.span,
|
attr.span,
|
||||||
"declaration of a method with `export_name`",
|
"declaration of a method with `export_name`",
|
||||||
|
@ -116,7 +116,7 @@ impl<'s> LintLevelsBuilder<'s> {
|
|||||||
continue
|
continue
|
||||||
};
|
};
|
||||||
for id in ids {
|
for id in ids {
|
||||||
// ForceWarn and Forbid cannot be overriden
|
// ForceWarn and Forbid cannot be overridden
|
||||||
if let Some((Level::ForceWarn | Level::Forbid, _)) = self.current_specs().get(&id) {
|
if let Some((Level::ForceWarn | Level::Forbid, _)) = self.current_specs().get(&id) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ impl<'s> LintLevelsBuilder<'s> {
|
|||||||
self.sets.get_lint_level(id.lint, self.cur, Some(self.current_specs()), &self.sess);
|
self.sets.get_lint_level(id.lint, self.cur, Some(self.current_specs()), &self.sess);
|
||||||
// Setting to a non-forbid level is an error if the lint previously had
|
// Setting to a non-forbid level is an error if the lint previously had
|
||||||
// a forbid level. Note that this is not necessarily true even with a
|
// a forbid level. Note that this is not necessarily true even with a
|
||||||
// `#[forbid(..)]` attribute present, as that is overriden by `--cap-lints`.
|
// `#[forbid(..)]` attribute present, as that is overridden by `--cap-lints`.
|
||||||
//
|
//
|
||||||
// This means that this only errors if we're truly lowering the lint
|
// This means that this only errors if we're truly lowering the lint
|
||||||
// level from forbid.
|
// level from forbid.
|
||||||
|
@ -20,6 +20,12 @@ macro_rules! pluralize {
|
|||||||
($x:expr) => {
|
($x:expr) => {
|
||||||
if $x != 1 { "s" } else { "" }
|
if $x != 1 { "s" } else { "" }
|
||||||
};
|
};
|
||||||
|
("is", $x:expr) => {
|
||||||
|
if $x == 1 { "is" } else { "are" }
|
||||||
|
};
|
||||||
|
("this", $x:expr) => {
|
||||||
|
if $x == 1 { "this" } else { "these" }
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Indicates the confidence in the correctness of a suggestion.
|
/// Indicates the confidence in the correctness of a suggestion.
|
||||||
|
@ -50,7 +50,7 @@ fn bb_to_graph_node(block: BasicBlock, body: &Body<'_>, dark_mode: bool) -> Node
|
|||||||
let style = NodeStyle { title_bg: Some(bgcolor.to_owned()), ..Default::default() };
|
let style = NodeStyle { title_bg: Some(bgcolor.to_owned()), ..Default::default() };
|
||||||
let mut stmts: Vec<String> = data.statements.iter().map(|x| format!("{:?}", x)).collect();
|
let mut stmts: Vec<String> = data.statements.iter().map(|x| format!("{:?}", x)).collect();
|
||||||
|
|
||||||
// add the terminator to the stmts, gsgdt can print it out seperately
|
// add the terminator to the stmts, gsgdt can print it out separately
|
||||||
let mut terminator_head = String::new();
|
let mut terminator_head = String::new();
|
||||||
data.terminator().kind.fmt_head(&mut terminator_head).unwrap();
|
data.terminator().kind.fmt_head(&mut terminator_head).unwrap();
|
||||||
stmts.push(terminator_head);
|
stmts.push(terminator_head);
|
||||||
|
@ -400,7 +400,7 @@ impl fmt::Display for UndefinedBehaviorInfo<'_> {
|
|||||||
Pointer::new(*alloc, access.access_offset),
|
Pointer::new(*alloc, access.access_offset),
|
||||||
access.uninit_size.bytes(),
|
access.uninit_size.bytes(),
|
||||||
pluralize!(access.uninit_size.bytes()),
|
pluralize!(access.uninit_size.bytes()),
|
||||||
if access.uninit_size.bytes() != 1 { "are" } else { "is" },
|
pluralize!("is", access.uninit_size.bytes()),
|
||||||
Pointer::new(*alloc, access.uninit_offset),
|
Pointer::new(*alloc, access.uninit_offset),
|
||||||
),
|
),
|
||||||
InvalidUninitBytes(None) => write!(
|
InvalidUninitBytes(None) => write!(
|
||||||
|
@ -250,7 +250,7 @@ pub struct BorrowCheckResult<'tcx> {
|
|||||||
|
|
||||||
/// The result of the `mir_const_qualif` query.
|
/// The result of the `mir_const_qualif` query.
|
||||||
///
|
///
|
||||||
/// Each field (except `error_occured`) corresponds to an implementer of the `Qualif` trait in
|
/// Each field (except `error_occurred`) corresponds to an implementer of the `Qualif` trait in
|
||||||
/// `rustc_const_eval/src/transform/check_consts/qualifs.rs`. See that file for more information on each
|
/// `rustc_const_eval/src/transform/check_consts/qualifs.rs`. See that file for more information on each
|
||||||
/// `Qualif`.
|
/// `Qualif`.
|
||||||
#[derive(Clone, Copy, Debug, Default, TyEncodable, TyDecodable, HashStable)]
|
#[derive(Clone, Copy, Debug, Default, TyEncodable, TyDecodable, HashStable)]
|
||||||
|
@ -847,7 +847,7 @@ fn foo(&self) -> Self::T { String::new() }
|
|||||||
"{some} method{s} {are} available that return{r} `{ty}`",
|
"{some} method{s} {are} available that return{r} `{ty}`",
|
||||||
some = if methods.len() == 1 { "a" } else { "some" },
|
some = if methods.len() == 1 { "a" } else { "some" },
|
||||||
s = pluralize!(methods.len()),
|
s = pluralize!(methods.len()),
|
||||||
are = if methods.len() == 1 { "is" } else { "are" },
|
are = pluralize!("is", methods.len()),
|
||||||
r = if methods.len() == 1 { "s" } else { "" },
|
r = if methods.len() == 1 { "s" } else { "" },
|
||||||
ty = expected
|
ty = expected
|
||||||
);
|
);
|
||||||
|
@ -608,7 +608,7 @@ pub fn check_unsafety<'tcx>(tcx: TyCtxt<'tcx>, def: ty::WithOptConstParam<LocalD
|
|||||||
|
|
||||||
let (thir, expr) = tcx.thir_body(def);
|
let (thir, expr) = tcx.thir_body(def);
|
||||||
let thir = &thir.borrow();
|
let thir = &thir.borrow();
|
||||||
// If `thir` is empty, a type error occured, skip this body.
|
// If `thir` is empty, a type error occurred, skip this body.
|
||||||
if thir.exprs.is_empty() {
|
if thir.exprs.is_empty() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1410,7 +1410,7 @@ impl CheckAttrVisitor<'_> {
|
|||||||
span,
|
span,
|
||||||
format!(
|
format!(
|
||||||
"there {} only {} argument{}",
|
"there {} only {} argument{}",
|
||||||
if arg_count != 1 { "are" } else { "is" },
|
pluralize!("is", arg_count),
|
||||||
arg_count,
|
arg_count,
|
||||||
pluralize!(arg_count)
|
pluralize!(arg_count)
|
||||||
),
|
),
|
||||||
|
@ -504,9 +504,9 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
|
|||||||
for sp in spans {
|
for sp in spans {
|
||||||
let msg = if sp == last_bound_span {
|
let msg = if sp == last_bound_span {
|
||||||
format!(
|
format!(
|
||||||
"...because of {} bound{}",
|
"...because of {these} bound{s}",
|
||||||
if bounds.len() <= 2 { "this" } else { "these" },
|
these = pluralize!("this", bounds.len() - 1),
|
||||||
if bounds.len() <= 2 { "" } else { "s" },
|
s = pluralize!(bounds.len() - 1),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
String::new()
|
String::new()
|
||||||
|
@ -394,7 +394,7 @@ mod desc {
|
|||||||
pub const parse_linker_plugin_lto: &str =
|
pub const parse_linker_plugin_lto: &str =
|
||||||
"either a boolean (`yes`, `no`, `on`, `off`, etc), or the path to the linker plugin";
|
"either a boolean (`yes`, `no`, `on`, `off`, etc), or the path to the linker plugin";
|
||||||
pub const parse_location_detail: &str =
|
pub const parse_location_detail: &str =
|
||||||
"comma seperated list of location details to track: `file`, `line`, or `column`";
|
"comma separated list of location details to track: `file`, `line`, or `column`";
|
||||||
pub const parse_switch_with_opt_path: &str =
|
pub const parse_switch_with_opt_path: &str =
|
||||||
"an optional path to the profiling data output directory";
|
"an optional path to the profiling data output directory";
|
||||||
pub const parse_merge_functions: &str = "one of: `disabled`, `trampolines`, or `aliases`";
|
pub const parse_merge_functions: &str = "one of: `disabled`, `trampolines`, or `aliases`";
|
||||||
@ -1283,7 +1283,7 @@ options! {
|
|||||||
llvm_time_trace: bool = (false, parse_bool, [UNTRACKED],
|
llvm_time_trace: bool = (false, parse_bool, [UNTRACKED],
|
||||||
"generate JSON tracing data file from LLVM data (default: no)"),
|
"generate JSON tracing data file from LLVM data (default: no)"),
|
||||||
location_detail: LocationDetail = (LocationDetail::all(), parse_location_detail, [TRACKED],
|
location_detail: LocationDetail = (LocationDetail::all(), parse_location_detail, [TRACKED],
|
||||||
"comma seperated list of location details to be tracked when using caller_location \
|
"comma separated list of location details to be tracked when using caller_location \
|
||||||
valid options are `file`, `line`, and `column` (default: all)"),
|
valid options are `file`, `line`, and `column` (default: all)"),
|
||||||
ls: bool = (false, parse_bool, [UNTRACKED],
|
ls: bool = (false, parse_bool, [UNTRACKED],
|
||||||
"list the symbols defined by a library crate (default: no)"),
|
"list the symbols defined by a library crate (default: no)"),
|
||||||
|
@ -69,7 +69,7 @@ pub struct SymbolGallery {
|
|||||||
|
|
||||||
impl SymbolGallery {
|
impl SymbolGallery {
|
||||||
/// Insert a symbol and its span into symbol gallery.
|
/// Insert a symbol and its span into symbol gallery.
|
||||||
/// If the symbol has occurred before, ignore the new occurance.
|
/// If the symbol has occurred before, ignore the new occurrance.
|
||||||
pub fn insert(&self, symbol: Symbol, span: Span) {
|
pub fn insert(&self, symbol: Symbol, span: Span) {
|
||||||
self.symbols.lock().entry(symbol).or_insert(span);
|
self.symbols.lock().entry(symbol).or_insert(span);
|
||||||
}
|
}
|
||||||
|
@ -369,7 +369,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
|||||||
(true, Some(None)) => {
|
(true, Some(None)) => {
|
||||||
Some(format!("{cannot_do_this} in const contexts"))
|
Some(format!("{cannot_do_this} in const contexts"))
|
||||||
}
|
}
|
||||||
// overriden post message
|
// overridden post message
|
||||||
(true, Some(Some(post_message))) => {
|
(true, Some(Some(post_message))) => {
|
||||||
Some(format!("{cannot_do_this}{post_message}"))
|
Some(format!("{cannot_do_this}{post_message}"))
|
||||||
}
|
}
|
||||||
|
@ -1761,7 +1761,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
sp,
|
sp,
|
||||||
&format!(
|
&format!(
|
||||||
"include the missing field{} in the pattern{}",
|
"include the missing field{} in the pattern{}",
|
||||||
if len == 1 { "" } else { "s" },
|
pluralize!(len),
|
||||||
if have_inaccessible_fields { " and ignore the inaccessible fields" } else { "" }
|
if have_inaccessible_fields { " and ignore the inaccessible fields" } else { "" }
|
||||||
),
|
),
|
||||||
format!(
|
format!(
|
||||||
@ -1780,10 +1780,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
err.span_suggestion(
|
err.span_suggestion(
|
||||||
sp,
|
sp,
|
||||||
&format!(
|
&format!(
|
||||||
"if you don't care about {} missing field{}, you can explicitly ignore {}",
|
"if you don't care about {these} missing field{s}, you can explicitly ignore {them}",
|
||||||
if len == 1 { "this" } else { "these" },
|
these = pluralize!("this", len),
|
||||||
if len == 1 { "" } else { "s" },
|
s = pluralize!(len),
|
||||||
if len == 1 { "it" } else { "them" },
|
them = if len == 1 { "it" } else { "them" },
|
||||||
),
|
),
|
||||||
format!("{}..{}", prefix, postfix),
|
format!("{}..{}", prefix, postfix),
|
||||||
Applicability::MachineApplicable,
|
Applicability::MachineApplicable,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//! `tcx.inherent_impls(def_id)`). That value, however,
|
//! `tcx.inherent_impls(def_id)`). That value, however,
|
||||||
//! is computed by selecting an idea from this table.
|
//! is computed by selecting an idea from this table.
|
||||||
|
|
||||||
use rustc_errors::struct_span_err;
|
use rustc_errors::{pluralize, struct_span_err};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_hir::itemlikevisit::ItemLikeVisitor;
|
use rustc_hir::itemlikevisit::ItemLikeVisitor;
|
||||||
@ -410,7 +410,6 @@ impl<'tcx> InherentCollect<'tcx> {
|
|||||||
let to_implement = if assoc_items.is_empty() {
|
let to_implement = if assoc_items.is_empty() {
|
||||||
String::new()
|
String::new()
|
||||||
} else {
|
} else {
|
||||||
let plural = assoc_items.len() > 1;
|
|
||||||
let assoc_items_kind = {
|
let assoc_items_kind = {
|
||||||
let item_types = assoc_items.iter().map(|x| x.kind);
|
let item_types = assoc_items.iter().map(|x| x.kind);
|
||||||
if item_types.clone().all(|x| x == hir::AssocItemKind::Const) {
|
if item_types.clone().all(|x| x == hir::AssocItemKind::Const) {
|
||||||
@ -427,9 +426,9 @@ impl<'tcx> InherentCollect<'tcx> {
|
|||||||
|
|
||||||
format!(
|
format!(
|
||||||
" to implement {} {}{}",
|
" to implement {} {}{}",
|
||||||
if plural { "these" } else { "this" },
|
pluralize!("this", assoc_items.len()),
|
||||||
assoc_items_kind,
|
assoc_items_kind,
|
||||||
if plural { "s" } else { "" }
|
pluralize!(assoc_items.len()),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -657,10 +657,9 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> {
|
|||||||
|
|
||||||
let num_redundant_lt_args = lt_arg_spans.len() - self.num_expected_lifetime_args();
|
let num_redundant_lt_args = lt_arg_spans.len() - self.num_expected_lifetime_args();
|
||||||
let msg_lifetimes = format!(
|
let msg_lifetimes = format!(
|
||||||
"remove {} {} argument{}",
|
"remove {these} lifetime argument{s}",
|
||||||
if num_redundant_lt_args == 1 { "this" } else { "these" },
|
these = pluralize!("this", num_redundant_lt_args),
|
||||||
"lifetime",
|
s = pluralize!(num_redundant_lt_args),
|
||||||
pluralize!(num_redundant_lt_args),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
err.span_suggestion(
|
err.span_suggestion(
|
||||||
@ -700,10 +699,9 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> {
|
|||||||
let num_redundant_gen_args =
|
let num_redundant_gen_args =
|
||||||
gen_arg_spans.len() - self.num_expected_type_or_const_args();
|
gen_arg_spans.len() - self.num_expected_type_or_const_args();
|
||||||
let msg_types_or_consts = format!(
|
let msg_types_or_consts = format!(
|
||||||
"remove {} {} argument{}",
|
"remove {these} generic argument{s}",
|
||||||
if num_redundant_gen_args == 1 { "this" } else { "these" },
|
these = pluralize!("this", num_redundant_gen_args),
|
||||||
"generic",
|
s = pluralize!(num_redundant_gen_args),
|
||||||
pluralize!(num_redundant_type_or_const_args),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
err.span_suggestion(
|
err.span_suggestion(
|
||||||
|
@ -609,7 +609,7 @@ fn assert_send() {
|
|||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
// Check that the member-like functions conditionally provided by #[derive()]
|
// Check that the member-like functions conditionally provided by #[derive()]
|
||||||
// are not overriden by genuine member functions with a different signature.
|
// are not overridden by genuine member functions with a different signature.
|
||||||
fn assert_derives() {
|
fn assert_derives() {
|
||||||
fn hash<T: Hash, H: Hasher>(v: BTreeSet<T>, state: &mut H) {
|
fn hash<T: Hash, H: Hasher>(v: BTreeSet<T>, state: &mut H) {
|
||||||
v.hash(state);
|
v.hash(state);
|
||||||
|
@ -1795,7 +1795,7 @@ impl Rustflags {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// By default, cargo will pick up on various variables in the environment. However, bootstrap
|
/// By default, cargo will pick up on various variables in the environment. However, bootstrap
|
||||||
/// reuses those variables to pass additional flags to rustdoc, so by default they get overriden.
|
/// reuses those variables to pass additional flags to rustdoc, so by default they get overridden.
|
||||||
/// Explicitly add back any previous value in the environment.
|
/// Explicitly add back any previous value in the environment.
|
||||||
///
|
///
|
||||||
/// `prefix` is usually `RUSTFLAGS` or `RUSTDOCFLAGS`.
|
/// `prefix` is usually `RUSTFLAGS` or `RUSTDOCFLAGS`.
|
||||||
|
@ -948,7 +948,7 @@ fn resolve_associated_trait_item<'a>(
|
|||||||
///
|
///
|
||||||
/// This function returns `None` if no associated item was found in the impl.
|
/// This function returns `None` if no associated item was found in the impl.
|
||||||
/// This can occur when the trait associated item has a default value that is
|
/// This can occur when the trait associated item has a default value that is
|
||||||
/// not overriden in the impl.
|
/// not overridden in the impl.
|
||||||
///
|
///
|
||||||
/// This is just a wrapper around [`TyCtxt::impl_item_implementor_ids()`] and
|
/// This is just a wrapper around [`TyCtxt::impl_item_implementor_ids()`] and
|
||||||
/// [`TyCtxt::associated_item()`] (with some helpful logging added).
|
/// [`TyCtxt::associated_item()`] (with some helpful logging added).
|
||||||
|
@ -326,7 +326,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||||||
om.items.push((item, renamed))
|
om.items.push((item, renamed))
|
||||||
}
|
}
|
||||||
hir::ItemKind::Macro(ref macro_def, _) => {
|
hir::ItemKind::Macro(ref macro_def, _) => {
|
||||||
// `#[macro_export] macro_rules!` items are handled seperately in `visit()`,
|
// `#[macro_export] macro_rules!` items are handled separately in `visit()`,
|
||||||
// above, since they need to be documented at the module top level. Accordingly,
|
// above, since they need to be documented at the module top level. Accordingly,
|
||||||
// we only want to handle macros if one of three conditions holds:
|
// we only want to handle macros if one of three conditions holds:
|
||||||
//
|
//
|
||||||
|
@ -122,6 +122,9 @@
|
|||||||
// gdb-command:whatis has_associated_type_trait
|
// gdb-command:whatis has_associated_type_trait
|
||||||
// gdb-check:type = &(dyn type_names::Trait3<u32, AssocType=isize> + core::marker::Send)
|
// gdb-check:type = &(dyn type_names::Trait3<u32, AssocType=isize> + core::marker::Send)
|
||||||
|
|
||||||
|
// gdb-command:whatis has_associated_type_but_no_generics_trait
|
||||||
|
// gdb-check:type = &dyn type_names::TraitNoGenericsButWithAssocType<Output=isize>
|
||||||
|
|
||||||
// BARE FUNCTIONS
|
// BARE FUNCTIONS
|
||||||
// gdb-command:whatis rust_fn
|
// gdb-command:whatis rust_fn
|
||||||
// gdb-check:type = (fn(core::option::Option<isize>, core::option::Option<&type_names::mod1::Struct2>), usize)
|
// gdb-check:type = (fn(core::option::Option<isize>, core::option::Option<&type_names::mod1::Struct2>), usize)
|
||||||
@ -228,6 +231,7 @@
|
|||||||
// cdb-check:struct ref_mut$<dyn$<type_names::Trait1> > mut_ref_trait = [...]
|
// cdb-check:struct ref_mut$<dyn$<type_names::Trait1> > mut_ref_trait = [...]
|
||||||
// cdb-check:struct alloc::boxed::Box<dyn$<core::marker::Send,core::marker::Sync>,alloc::alloc::Global> no_principal_trait = [...]
|
// cdb-check:struct alloc::boxed::Box<dyn$<core::marker::Send,core::marker::Sync>,alloc::alloc::Global> no_principal_trait = [...]
|
||||||
// cdb-check:struct ref$<dyn$<type_names::Trait3<u32,assoc$<AssocType,isize> >,core::marker::Send> > has_associated_type_trait = struct ref$<dyn$<type_names::Trait3<u32,assoc$<AssocType,isize> >,core::marker::Send> >
|
// cdb-check:struct ref$<dyn$<type_names::Trait3<u32,assoc$<AssocType,isize> >,core::marker::Send> > has_associated_type_trait = struct ref$<dyn$<type_names::Trait3<u32,assoc$<AssocType,isize> >,core::marker::Send> >
|
||||||
|
// cdb-check:struct ref$<dyn$<type_names::TraitNoGenericsButWithAssocType<assoc$<Output,isize> > > > has_associated_type_but_no_generics_trait = struct ref$<dyn$<type_names::TraitNoGenericsButWithAssocType<assoc$<Output,isize> > > >
|
||||||
|
|
||||||
// BARE FUNCTIONS
|
// BARE FUNCTIONS
|
||||||
// cdb-command:dv /t *_fn*
|
// cdb-command:dv /t *_fn*
|
||||||
@ -317,12 +321,22 @@ trait Trait3<T> {
|
|||||||
panic!()
|
panic!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
trait TraitNoGenericsButWithAssocType {
|
||||||
|
type Output;
|
||||||
|
fn foo(&self) -> Self::Output;
|
||||||
|
}
|
||||||
|
|
||||||
impl Trait1 for isize {}
|
impl Trait1 for isize {}
|
||||||
impl<T1, T2> Trait2<T1, T2> for isize {}
|
impl<T1, T2> Trait2<T1, T2> for isize {}
|
||||||
impl<T> Trait3<T> for isize {
|
impl<T> Trait3<T> for isize {
|
||||||
type AssocType = isize;
|
type AssocType = isize;
|
||||||
}
|
}
|
||||||
|
impl TraitNoGenericsButWithAssocType for isize {
|
||||||
|
type Output = isize;
|
||||||
|
fn foo(&self) -> Self::Output {
|
||||||
|
*self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn rust_fn(_: Option<isize>, _: Option<&mod1::Struct2>) {}
|
fn rust_fn(_: Option<isize>, _: Option<&mod1::Struct2>) {}
|
||||||
extern "C" fn extern_c_fn(_: isize) {}
|
extern "C" fn extern_c_fn(_: isize) {}
|
||||||
@ -413,6 +427,8 @@ fn main() {
|
|||||||
let mut_ref_trait = (&mut mut_int1) as &mut dyn Trait1;
|
let mut_ref_trait = (&mut mut_int1) as &mut dyn Trait1;
|
||||||
let no_principal_trait = Box::new(0_isize) as Box<(dyn Send + Sync)>;
|
let no_principal_trait = Box::new(0_isize) as Box<(dyn Send + Sync)>;
|
||||||
let has_associated_type_trait = &0_isize as &(dyn Trait3<u32, AssocType = isize> + Send);
|
let has_associated_type_trait = &0_isize as &(dyn Trait3<u32, AssocType = isize> + Send);
|
||||||
|
let has_associated_type_but_no_generics_trait =
|
||||||
|
&0_isize as &dyn TraitNoGenericsButWithAssocType<Output = isize>;
|
||||||
|
|
||||||
let generic_box_trait = Box::new(0_isize) as Box<dyn Trait2<i32, mod1::Struct2>>;
|
let generic_box_trait = Box::new(0_isize) as Box<dyn Trait2<i32, mod1::Struct2>>;
|
||||||
let generic_ref_trait = (&0_isize) as &dyn Trait2<Struct1, Struct1>;
|
let generic_ref_trait = (&0_isize) as &dyn Trait2<Struct1, Struct1>;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Test that `--show-output` has an effect and `allow(unused)` can be overriden.
|
// Test that `--show-output` has an effect and `allow(unused)` can be overridden.
|
||||||
|
|
||||||
// check-pass
|
// check-pass
|
||||||
// edition:2018
|
// edition:2018
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// Tests that subsequent lints specified via the command line override
|
// Tests that subsequent lints specified via the command line override
|
||||||
// each other, except for ForceWarn and Forbid, which cannot be overriden.
|
// each other, except for ForceWarn and Forbid, which cannot be overridden.
|
||||||
//
|
//
|
||||||
// revisions: warn_deny forbid_warn force_warn_deny
|
// revisions: warn_deny forbid_warn force_warn_deny
|
||||||
//
|
//
|
||||||
|
@ -10,7 +10,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: Summary
|
label: Summary
|
||||||
description: |
|
description: |
|
||||||
If possible, try to provide a minimal verifiable example. You can read ["Rust Bug Minimization Patterns"][mve] for how to create smaller examples. Otherwise, provide the crate where the ICE occured.
|
If possible, try to provide a minimal verifiable example. You can read ["Rust Bug Minimization Patterns"][mve] for how to create smaller examples. Otherwise, provide the crate where the ICE occurred.
|
||||||
|
|
||||||
[mve]: http://blog.pnkfx.org/blog/2019/11/18/rust-bug-minimization-patterns/
|
[mve]: http://blog.pnkfx.org/blog/2019/11/18/rust-bug-minimization-patterns/
|
||||||
validations:
|
validations:
|
||||||
|
@ -114,7 +114,7 @@ impl LateLintPass<'_> for UpperCaseAcronyms {
|
|||||||
check_ident(cx, &it.ident, self.upper_case_acronyms_aggressive);
|
check_ident(cx, &it.ident, self.upper_case_acronyms_aggressive);
|
||||||
},
|
},
|
||||||
ItemKind::Enum(ref enumdef, _) => {
|
ItemKind::Enum(ref enumdef, _) => {
|
||||||
// check enum variants seperately because again we only want to lint on private enums and
|
// check enum variants separately because again we only want to lint on private enums and
|
||||||
// the fn check_variant does not know about the vis of the enum of its variants
|
// the fn check_variant does not know about the vis of the enum of its variants
|
||||||
enumdef
|
enumdef
|
||||||
.variants
|
.variants
|
||||||
|
Loading…
Reference in New Issue
Block a user