mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-07 12:33:14 +00:00
Auto merge of #90836 - matthiaskrgr:rollup-ou6yrlw, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #90589 (rustc_llvm: update PassWrapper for recent LLVM) - #90644 (Extend the const swap feature) - #90704 (Unix ExitStatus comments and a tiny docs fix) - #90761 (Shorten Span of unused macro lints) - #90795 (Add more comments to explain the code to generate the search index) - #90798 (Document `unreachable!` custom panic message) - #90826 (rustc_feature: Convert `BuiltinAttribute` from tuple to a struct) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
e90c5fbbc5
@ -3,7 +3,7 @@ use rustc_ast::visit::{self, AssocCtxt, FnCtxt, FnKind, Visitor};
|
||||
use rustc_ast::{AssocTyConstraint, AssocTyConstraintKind, NodeId};
|
||||
use rustc_ast::{PatKind, RangeEnd, VariantData};
|
||||
use rustc_errors::struct_span_err;
|
||||
use rustc_feature::{AttributeGate, BUILTIN_ATTRIBUTE_MAP};
|
||||
use rustc_feature::{AttributeGate, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP};
|
||||
use rustc_feature::{Features, GateIssue};
|
||||
use rustc_session::parse::{feature_err, feature_err_issue};
|
||||
use rustc_session::Session;
|
||||
@ -301,11 +301,14 @@ impl<'a> PostExpansionVisitor<'a> {
|
||||
|
||||
impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
||||
fn visit_attribute(&mut self, attr: &ast::Attribute) {
|
||||
let attr_info =
|
||||
attr.ident().and_then(|ident| BUILTIN_ATTRIBUTE_MAP.get(&ident.name)).map(|a| **a);
|
||||
let attr_info = attr.ident().and_then(|ident| BUILTIN_ATTRIBUTE_MAP.get(&ident.name));
|
||||
// Check feature gates for built-in attributes.
|
||||
if let Some((.., AttributeGate::Gated(_, name, descr, has_feature))) = attr_info {
|
||||
gate_feature_fn!(self, has_feature, attr.span, name, descr);
|
||||
if let Some(BuiltinAttribute {
|
||||
gate: AttributeGate::Gated(_, name, descr, has_feature),
|
||||
..
|
||||
}) = attr_info
|
||||
{
|
||||
gate_feature_fn!(self, has_feature, attr.span, *name, descr);
|
||||
}
|
||||
// Check unstable flavors of the `#[doc]` attribute.
|
||||
if attr.has_name(sym::doc) {
|
||||
|
@ -115,16 +115,26 @@ macro_rules! template {
|
||||
|
||||
macro_rules! ungated {
|
||||
($attr:ident, $typ:expr, $tpl:expr $(,)?) => {
|
||||
(sym::$attr, $typ, $tpl, Ungated)
|
||||
BuiltinAttribute { name: sym::$attr, type_: $typ, template: $tpl, gate: Ungated }
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! gated {
|
||||
($attr:ident, $typ:expr, $tpl:expr, $gate:ident, $msg:expr $(,)?) => {
|
||||
(sym::$attr, $typ, $tpl, Gated(Stability::Unstable, sym::$gate, $msg, cfg_fn!($gate)))
|
||||
BuiltinAttribute {
|
||||
name: sym::$attr,
|
||||
type_: $typ,
|
||||
template: $tpl,
|
||||
gate: Gated(Stability::Unstable, sym::$gate, $msg, cfg_fn!($gate)),
|
||||
}
|
||||
};
|
||||
($attr:ident, $typ:expr, $tpl:expr, $msg:expr $(,)?) => {
|
||||
(sym::$attr, $typ, $tpl, Gated(Stability::Unstable, sym::$attr, $msg, cfg_fn!($attr)))
|
||||
BuiltinAttribute {
|
||||
name: sym::$attr,
|
||||
type_: $typ,
|
||||
template: $tpl,
|
||||
gate: Gated(Stability::Unstable, sym::$attr, $msg, cfg_fn!($attr)),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@ -143,12 +153,12 @@ macro_rules! rustc_attr {
|
||||
)
|
||||
};
|
||||
($attr:ident, $typ:expr, $tpl:expr, $msg:expr $(,)?) => {
|
||||
(
|
||||
sym::$attr,
|
||||
$typ,
|
||||
$tpl,
|
||||
Gated(Stability::Unstable, sym::rustc_attrs, $msg, cfg_fn!(rustc_attrs)),
|
||||
)
|
||||
BuiltinAttribute {
|
||||
name: sym::$attr,
|
||||
type_: $typ,
|
||||
template: $tpl,
|
||||
gate: Gated(Stability::Unstable, sym::rustc_attrs, $msg, cfg_fn!(rustc_attrs)),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@ -161,7 +171,12 @@ macro_rules! experimental {
|
||||
const IMPL_DETAIL: &str = "internal implementation detail";
|
||||
const INTERNAL_UNSTABLE: &str = "this is an internal attribute that will never be stable";
|
||||
|
||||
pub type BuiltinAttribute = (Symbol, AttributeType, AttributeTemplate, AttributeGate);
|
||||
pub struct BuiltinAttribute {
|
||||
pub name: Symbol,
|
||||
pub type_: AttributeType,
|
||||
pub template: AttributeTemplate,
|
||||
pub gate: AttributeGate,
|
||||
}
|
||||
|
||||
/// Attributes that have a special meaning to rustc or rustdoc.
|
||||
#[rustfmt::skip]
|
||||
@ -290,9 +305,11 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
||||
),
|
||||
|
||||
// Plugins:
|
||||
(
|
||||
sym::plugin, CrateLevel, template!(List: "name"),
|
||||
Gated(
|
||||
BuiltinAttribute {
|
||||
name: sym::plugin,
|
||||
type_: CrateLevel,
|
||||
template: template!(List: "name"),
|
||||
gate: Gated(
|
||||
Stability::Deprecated(
|
||||
"https://github.com/rust-lang/rust/pull/64675",
|
||||
Some("may be removed in a future compiler version"),
|
||||
@ -300,8 +317,8 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
||||
sym::plugin,
|
||||
"compiler plugins are deprecated",
|
||||
cfg_fn!(plugin)
|
||||
)
|
||||
),
|
||||
),
|
||||
},
|
||||
|
||||
// Testing:
|
||||
gated!(allow_fail, Normal, template!(Word), experimental!(allow_fail)),
|
||||
@ -497,17 +514,17 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
||||
lang, Normal, template!(NameValueStr: "name"), lang_items,
|
||||
"language items are subject to change",
|
||||
),
|
||||
(
|
||||
sym::rustc_diagnostic_item,
|
||||
Normal,
|
||||
template!(NameValueStr: "name"),
|
||||
Gated(
|
||||
BuiltinAttribute {
|
||||
name: sym::rustc_diagnostic_item,
|
||||
type_: Normal,
|
||||
template: template!(NameValueStr: "name"),
|
||||
gate: Gated(
|
||||
Stability::Unstable,
|
||||
sym::rustc_attrs,
|
||||
"diagnostic items compiler internal support for linting",
|
||||
cfg_fn!(rustc_attrs),
|
||||
),
|
||||
),
|
||||
},
|
||||
gated!(
|
||||
// Used in resolve:
|
||||
prelude_import, Normal, template!(Word),
|
||||
@ -601,7 +618,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
||||
];
|
||||
|
||||
pub fn deprecated_attributes() -> Vec<&'static BuiltinAttribute> {
|
||||
BUILTIN_ATTRIBUTES.iter().filter(|(.., gate)| gate.is_deprecated()).collect()
|
||||
BUILTIN_ATTRIBUTES.iter().filter(|attr| attr.gate.is_deprecated()).collect()
|
||||
}
|
||||
|
||||
pub fn is_builtin_attr_name(name: Symbol) -> bool {
|
||||
@ -612,8 +629,8 @@ pub static BUILTIN_ATTRIBUTE_MAP: SyncLazy<FxHashMap<Symbol, &BuiltinAttribute>>
|
||||
SyncLazy::new(|| {
|
||||
let mut map = FxHashMap::default();
|
||||
for attr in BUILTIN_ATTRIBUTES.iter() {
|
||||
if map.insert(attr.0, attr).is_some() {
|
||||
panic!("duplicate builtin attribute `{}`", attr.0);
|
||||
if map.insert(attr.name, attr).is_some() {
|
||||
panic!("duplicate builtin attribute `{}`", attr.name);
|
||||
}
|
||||
}
|
||||
map
|
||||
|
@ -32,8 +32,7 @@ use rustc_ast_pretty::pprust::{self, expr_to_string};
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_errors::{Applicability, DiagnosticBuilder, DiagnosticStyledString};
|
||||
use rustc_feature::{deprecated_attributes, AttributeGate, AttributeTemplate, AttributeType};
|
||||
use rustc_feature::{GateIssue, Stability};
|
||||
use rustc_feature::{deprecated_attributes, AttributeGate, BuiltinAttribute, GateIssue, Stability};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId, LocalDefIdSet, CRATE_DEF_ID};
|
||||
@ -959,7 +958,7 @@ impl EarlyLintPass for AnonymousParameters {
|
||||
pub struct DeprecatedAttr {
|
||||
// This is not free to compute, so we want to keep it around, rather than
|
||||
// compute it for every attribute.
|
||||
depr_attrs: Vec<&'static (Symbol, AttributeType, AttributeTemplate, AttributeGate)>,
|
||||
depr_attrs: Vec<&'static BuiltinAttribute>,
|
||||
}
|
||||
|
||||
impl_lint_pass!(DeprecatedAttr => []);
|
||||
@ -990,14 +989,14 @@ fn lint_deprecated_attr(
|
||||
|
||||
impl EarlyLintPass for DeprecatedAttr {
|
||||
fn check_attribute(&mut self, cx: &EarlyContext<'_>, attr: &ast::Attribute) {
|
||||
for &&(n, _, _, ref g) in &self.depr_attrs {
|
||||
if attr.ident().map(|ident| ident.name) == Some(n) {
|
||||
for BuiltinAttribute { name, gate, .. } in &self.depr_attrs {
|
||||
if attr.ident().map(|ident| ident.name) == Some(*name) {
|
||||
if let &AttributeGate::Gated(
|
||||
Stability::Deprecated(link, suggestion),
|
||||
name,
|
||||
reason,
|
||||
_,
|
||||
) = g
|
||||
) = gate
|
||||
{
|
||||
let msg =
|
||||
format!("use of deprecated attribute `{}`: {}. See {}", name, reason, link);
|
||||
|
@ -889,15 +889,17 @@ LLVMRustOptimizeWithNewPassManager(
|
||||
OptimizerLastEPCallbacks.push_back(
|
||||
[SanitizerOptions](ModulePassManager &MPM, OptimizationLevel Level) {
|
||||
MPM.addPass(RequireAnalysisPass<ASanGlobalsMetadataAnalysis, Module>());
|
||||
#if LLVM_VERSION_GE(14, 0)
|
||||
AddressSanitizerOptions opts = AddressSanitizerOptions{
|
||||
/*CompileKernel=*/false,
|
||||
SanitizerOptions->SanitizeAddressRecover,
|
||||
/*UseAfterScope=*/true,
|
||||
AsanDetectStackUseAfterReturnMode::Runtime,
|
||||
};
|
||||
MPM.addPass(ModuleAddressSanitizerPass(opts));
|
||||
#else
|
||||
MPM.addPass(ModuleAddressSanitizerPass(
|
||||
/*CompileKernel=*/false, SanitizerOptions->SanitizeAddressRecover));
|
||||
#if LLVM_VERSION_GE(14, 0)
|
||||
AddressSanitizerOptions opts(/*CompileKernel=*/false,
|
||||
SanitizerOptions->SanitizeAddressRecover,
|
||||
/*UseAfterScope=*/true,
|
||||
AsanDetectStackUseAfterReturnMode::Runtime);
|
||||
MPM.addPass(createModuleToFunctionPassAdaptor(AddressSanitizerPass(opts)));
|
||||
#else
|
||||
MPM.addPass(createModuleToFunctionPassAdaptor(AddressSanitizerPass(
|
||||
/*CompileKernel=*/false, SanitizerOptions->SanitizeAddressRecover,
|
||||
/*UseAfterScope=*/true)));
|
||||
|
@ -5,7 +5,7 @@ use crate::parse_in;
|
||||
use rustc_ast::tokenstream::{DelimSpan, TokenTree};
|
||||
use rustc_ast::{self as ast, Attribute, MacArgs, MacDelimiter, MetaItem, MetaItemKind};
|
||||
use rustc_errors::{Applicability, FatalError, PResult};
|
||||
use rustc_feature::{AttributeTemplate, BUILTIN_ATTRIBUTE_MAP};
|
||||
use rustc_feature::{AttributeTemplate, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP};
|
||||
use rustc_session::lint::builtin::ILL_FORMED_ATTRIBUTE_INPUT;
|
||||
use rustc_session::parse::ParseSess;
|
||||
use rustc_span::{sym, Symbol};
|
||||
@ -15,14 +15,13 @@ pub fn check_meta(sess: &ParseSess, attr: &Attribute) {
|
||||
return;
|
||||
}
|
||||
|
||||
let attr_info =
|
||||
attr.ident().and_then(|ident| BUILTIN_ATTRIBUTE_MAP.get(&ident.name)).map(|a| **a);
|
||||
let attr_info = attr.ident().and_then(|ident| BUILTIN_ATTRIBUTE_MAP.get(&ident.name));
|
||||
|
||||
// Check input tokens for built-in and key-value attributes.
|
||||
match attr_info {
|
||||
// `rustc_dummy` doesn't have any restrictions specific to built-in attributes.
|
||||
Some((name, _, template, _)) if name != sym::rustc_dummy => {
|
||||
check_builtin_attribute(sess, attr, name, template)
|
||||
Some(BuiltinAttribute { name, template, .. }) if *name != sym::rustc_dummy => {
|
||||
check_builtin_attribute(sess, attr, *name, *template)
|
||||
}
|
||||
_ if let MacArgs::Eq(..) = attr.get_normal_item().args => {
|
||||
// All key-value attributes are restricted to meta-item syntax.
|
||||
@ -168,7 +167,7 @@ pub fn emit_fatal_malformed_builtin_attribute(
|
||||
attr: &Attribute,
|
||||
name: Symbol,
|
||||
) -> ! {
|
||||
let template = BUILTIN_ATTRIBUTE_MAP.get(&name).expect("builtin attr defined").2;
|
||||
let template = BUILTIN_ATTRIBUTE_MAP.get(&name).expect("builtin attr defined").template;
|
||||
emit_malformed_attribute(sess, attr, name, template);
|
||||
// This is fatal, otherwise it will likely cause a cascade of other errors
|
||||
// (and an error here is expected to be very rare).
|
||||
|
@ -11,7 +11,7 @@ use rustc_middle::ty::TyCtxt;
|
||||
use rustc_ast::{ast, AttrStyle, Attribute, Lit, LitKind, NestedMetaItem};
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_errors::{pluralize, struct_span_err, Applicability};
|
||||
use rustc_feature::{AttributeType, BUILTIN_ATTRIBUTE_MAP};
|
||||
use rustc_feature::{AttributeType, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def_id::LocalDefId;
|
||||
use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
|
||||
@ -148,7 +148,7 @@ impl CheckAttrVisitor<'tcx> {
|
||||
}
|
||||
|
||||
if hir_id != CRATE_HIR_ID {
|
||||
if let Some((_, AttributeType::CrateLevel, ..)) =
|
||||
if let Some(BuiltinAttribute { type_: AttributeType::CrateLevel, .. }) =
|
||||
attr.ident().and_then(|ident| BUILTIN_ATTRIBUTE_MAP.get(&ident.name))
|
||||
{
|
||||
self.tcx.struct_span_lint_hir(UNUSED_ATTRIBUTES, hir_id, attr.span, |lint| {
|
||||
|
@ -1194,15 +1194,9 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
// Mark the given macro as unused unless its name starts with `_`.
|
||||
// Macro uses will remove items from this set, and the remaining
|
||||
// items will be reported as `unused_macros`.
|
||||
fn insert_unused_macro(
|
||||
&mut self,
|
||||
ident: Ident,
|
||||
def_id: LocalDefId,
|
||||
node_id: NodeId,
|
||||
span: Span,
|
||||
) {
|
||||
fn insert_unused_macro(&mut self, ident: Ident, def_id: LocalDefId, node_id: NodeId) {
|
||||
if !ident.as_str().starts_with('_') {
|
||||
self.r.unused_macros.insert(def_id, (node_id, span));
|
||||
self.r.unused_macros.insert(def_id, (node_id, ident));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1246,7 +1240,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
self.r.define(module, ident, MacroNS, (res, vis, span, expansion, IsMacroExport));
|
||||
} else {
|
||||
self.r.check_reserved_macro_name(ident, res);
|
||||
self.insert_unused_macro(ident, def_id, item.id, span);
|
||||
self.insert_unused_macro(ident, def_id, item.id);
|
||||
}
|
||||
self.r.visibilities.insert(def_id, vis);
|
||||
self.r.arenas.alloc_macro_rules_scope(MacroRulesScope::Binding(
|
||||
@ -1267,7 +1261,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
_ => self.resolve_visibility(&item.vis),
|
||||
};
|
||||
if vis != ty::Visibility::Public {
|
||||
self.insert_unused_macro(ident, def_id, item.id, span);
|
||||
self.insert_unused_macro(ident, def_id, item.id);
|
||||
}
|
||||
self.r.define(module, ident, MacroNS, (res, vis, span, expansion));
|
||||
self.r.visibilities.insert(def_id, vis);
|
||||
|
@ -731,7 +731,7 @@ impl<'a> Resolver<'a> {
|
||||
suggestions.extend(
|
||||
BUILTIN_ATTRIBUTES
|
||||
.iter()
|
||||
.map(|(name, ..)| TypoSuggestion::typo_from_res(*name, res)),
|
||||
.map(|attr| TypoSuggestion::typo_from_res(attr.name, res)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -988,7 +988,7 @@ pub struct Resolver<'a> {
|
||||
non_macro_attr: Lrc<SyntaxExtension>,
|
||||
local_macro_def_scopes: FxHashMap<LocalDefId, Module<'a>>,
|
||||
ast_transform_scopes: FxHashMap<LocalExpnId, Module<'a>>,
|
||||
unused_macros: FxHashMap<LocalDefId, (NodeId, Span)>,
|
||||
unused_macros: FxHashMap<LocalDefId, (NodeId, Ident)>,
|
||||
proc_macro_stubs: FxHashSet<LocalDefId>,
|
||||
/// Traces collected during macro resolution and validated when it's complete.
|
||||
single_segment_macro_resolutions:
|
||||
|
@ -315,8 +315,13 @@ impl<'a> ResolverExpand for Resolver<'a> {
|
||||
}
|
||||
|
||||
fn check_unused_macros(&mut self) {
|
||||
for (_, &(node_id, span)) in self.unused_macros.iter() {
|
||||
self.lint_buffer.buffer_lint(UNUSED_MACROS, node_id, span, "unused macro definition");
|
||||
for (_, &(node_id, ident)) in self.unused_macros.iter() {
|
||||
self.lint_buffer.buffer_lint(
|
||||
UNUSED_MACROS,
|
||||
node_id,
|
||||
ident.span,
|
||||
&format!("unused macro definition: `{}`", ident.as_str()),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -554,7 +554,10 @@ macro_rules! writeln {
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// This will always [`panic!`].
|
||||
/// This will always [`panic!`] because `unreachable!` is just a shorthand for `panic!` with a
|
||||
/// fixed, specific message.
|
||||
///
|
||||
/// Like `panic!`, this macro has a second form for displaying custom values.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -581,7 +584,7 @@ macro_rules! writeln {
|
||||
/// if 3*i < i { panic!("u32 overflow"); }
|
||||
/// if x < 3*i { return i-1; }
|
||||
/// }
|
||||
/// unreachable!();
|
||||
/// unreachable!("The loop should always return");
|
||||
/// }
|
||||
/// ```
|
||||
#[macro_export]
|
||||
|
@ -1092,8 +1092,9 @@ impl<T: ?Sized> *mut T {
|
||||
///
|
||||
/// [`ptr::swap`]: crate::ptr::swap()
|
||||
#[stable(feature = "pointer_methods", since = "1.26.0")]
|
||||
#[rustc_const_unstable(feature = "const_swap", issue = "83163")]
|
||||
#[inline(always)]
|
||||
pub unsafe fn swap(self, with: *mut T)
|
||||
pub const unsafe fn swap(self, with: *mut T)
|
||||
where
|
||||
T: Sized,
|
||||
{
|
||||
|
@ -558,8 +558,9 @@ impl<T> [T] {
|
||||
/// assert!(v == ["a", "b", "e", "d", "c"]);
|
||||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_swap", issue = "83163")]
|
||||
#[inline]
|
||||
pub fn swap(&mut self, a: usize, b: usize) {
|
||||
pub const fn swap(&mut self, a: usize, b: usize) {
|
||||
let _ = &self[a];
|
||||
let _ = &self[b];
|
||||
|
||||
@ -595,7 +596,8 @@ impl<T> [T] {
|
||||
/// [`swap`]: slice::swap
|
||||
/// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
|
||||
#[unstable(feature = "slice_swap_unchecked", issue = "88539")]
|
||||
pub unsafe fn swap_unchecked(&mut self, a: usize, b: usize) {
|
||||
#[rustc_const_unstable(feature = "const_swap", issue = "83163")]
|
||||
pub const unsafe fn swap_unchecked(&mut self, a: usize, b: usize) {
|
||||
#[cfg(debug_assertions)]
|
||||
{
|
||||
let _ = &self[a];
|
||||
|
@ -207,7 +207,7 @@ impl CommandExt for process::Command {
|
||||
/// [`ExitStatusError`](process::ExitStatusError).
|
||||
///
|
||||
/// On Unix, `ExitStatus` **does not necessarily represent an exit status**, as
|
||||
/// passed to the `exit` system call or returned by
|
||||
/// passed to the `_exit` system call or returned by
|
||||
/// [`ExitStatus::code()`](crate::process::ExitStatus::code). It represents **any wait status**
|
||||
/// as returned by one of the `wait` family of system
|
||||
/// calls.
|
||||
|
@ -1417,6 +1417,11 @@ impl From<fs::File> for Stdio {
|
||||
///
|
||||
/// [`status`]: Command::status
|
||||
/// [`wait`]: Child::wait
|
||||
//
|
||||
// We speak slightly loosely (here and in various other places in the stdlib docs) about `exit`
|
||||
// vs `_exit`. Naming of Unix system calls is not standardised across Unices, so terminology is a
|
||||
// matter of convention and tradition. For clarity we usually speak of `exit`, even when we might
|
||||
// mean an underlying system call such as `_exit`.
|
||||
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
||||
#[stable(feature = "process", since = "1.0.0")]
|
||||
pub struct ExitStatus(imp::ExitStatus);
|
||||
|
@ -617,6 +617,9 @@ impl Process {
|
||||
}
|
||||
|
||||
/// Unix exit statuses
|
||||
//
|
||||
// This is not actually an "exit status" in Unix terminology. Rather, it is a "wait status".
|
||||
// See the discussion in comments and doc comments for `std::process::ExitStatus`.
|
||||
#[derive(PartialEq, Eq, Clone, Copy)]
|
||||
pub struct ExitStatus(c_int);
|
||||
|
||||
|
@ -244,8 +244,10 @@ fn get_index_type_name(clean_type: &clean::Type, accept_generic: bool) -> Option
|
||||
/// The point of this function is to replace bounds with types.
|
||||
///
|
||||
/// i.e. `[T, U]` when you have the following bounds: `T: Display, U: Option<T>` will return
|
||||
/// `[Display, Option]` (we just returns the list of the types, we don't care about the
|
||||
/// wrapped types in here).
|
||||
/// `[Display, Option]`. If a type parameter has no trait bound, it is discarded.
|
||||
///
|
||||
/// Important note: It goes through generics recursively. So if you have
|
||||
/// `T: Option<Result<(), ()>>`, it'll go into `Option` and then into `Result`.
|
||||
crate fn get_real_types<'tcx>(
|
||||
generics: &Generics,
|
||||
arg: &Type,
|
||||
@ -329,7 +331,10 @@ crate fn get_real_types<'tcx>(
|
||||
return;
|
||||
}
|
||||
|
||||
// If this argument is a type parameter and not a trait bound or a type, we need to look
|
||||
// for its bounds.
|
||||
if let Type::Generic(arg_s) = *arg {
|
||||
// First we check if the bounds are in a `where` predicate...
|
||||
if let Some(where_pred) = generics.where_predicates.iter().find(|g| match g {
|
||||
WherePredicate::BoundPredicate { ty, .. } => {
|
||||
ty.def_id_no_primitives() == arg.def_id_no_primitives()
|
||||
@ -352,6 +357,7 @@ crate fn get_real_types<'tcx>(
|
||||
}
|
||||
insert_ty(res, tcx, arg.clone(), ty_generics);
|
||||
}
|
||||
// Otherwise we check if the trait bounds are "inlined" like `T: Option<u32>`...
|
||||
if let Some(bound) = generics.params.iter().find(|g| g.is_type() && g.name == arg_s) {
|
||||
let mut ty_generics = Vec::new();
|
||||
for bound in bound.get_bounds().unwrap_or(&[]) {
|
||||
@ -363,6 +369,11 @@ crate fn get_real_types<'tcx>(
|
||||
insert_ty(res, tcx, arg.clone(), ty_generics);
|
||||
}
|
||||
} else {
|
||||
// This is not a type parameter. So for example if we have `T, U: Option<T>`, and we're
|
||||
// looking at `Option`, we enter this "else" condition, otherwise if it's `T`, we don't.
|
||||
//
|
||||
// So in here, we can add it directly and look for its own type parameters (so for `Option`,
|
||||
// we will look for them but not for `T`).
|
||||
let mut ty_generics = Vec::new();
|
||||
if let Some(arg_generics) = arg.generics() {
|
||||
for gen in arg_generics.iter() {
|
||||
|
@ -1,11 +1,8 @@
|
||||
warning: unused macro definition
|
||||
--> $DIR/issue-70041.rs:4:1
|
||||
warning: unused macro definition: `regex`
|
||||
--> $DIR/issue-70041.rs:4:14
|
||||
|
|
||||
LL | / macro_rules! regex {
|
||||
LL | |
|
||||
LL | | () => {};
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | macro_rules! regex {
|
||||
| ^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_macros)]` on by default
|
||||
|
||||
|
@ -1,10 +1,8 @@
|
||||
error: unused macro definition
|
||||
--> $DIR/unused-macro-rules.rs:4:1
|
||||
error: unused macro definition: `unused`
|
||||
--> $DIR/unused-macro-rules.rs:4:14
|
||||
|
|
||||
LL | / macro_rules! unused {
|
||||
LL | | () => {};
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | macro_rules! unused {
|
||||
| ^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused-macro-rules.rs:1:9
|
||||
@ -12,26 +10,17 @@ note: the lint level is defined here
|
||||
LL | #![deny(unused_macros)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: unused macro definition
|
||||
--> $DIR/unused-macro-rules.rs:11:9
|
||||
error: unused macro definition: `m`
|
||||
--> $DIR/unused-macro-rules.rs:11:22
|
||||
|
|
||||
LL | / macro_rules! m {
|
||||
LL | | () => {};
|
||||
LL | | }
|
||||
| |_________^
|
||||
...
|
||||
LL | create_macro!();
|
||||
| --------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `create_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
LL | macro_rules! m {
|
||||
| ^
|
||||
|
||||
error: unused macro definition
|
||||
--> $DIR/unused-macro-rules.rs:24:5
|
||||
error: unused macro definition: `unused`
|
||||
--> $DIR/unused-macro-rules.rs:24:18
|
||||
|
|
||||
LL | / macro_rules! unused {
|
||||
LL | | () => {};
|
||||
LL | | }
|
||||
| |_____^
|
||||
LL | macro_rules! unused {
|
||||
| ^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused-macro-rules.rs:23:12
|
||||
|
@ -1,10 +1,8 @@
|
||||
error: unused macro definition
|
||||
--> $DIR/unused-macro.rs:5:1
|
||||
error: unused macro definition: `unused`
|
||||
--> $DIR/unused-macro.rs:5:7
|
||||
|
|
||||
LL | / macro unused {
|
||||
LL | | () => {}
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | macro unused {
|
||||
| ^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused-macro.rs:2:9
|
||||
@ -12,13 +10,11 @@ note: the lint level is defined here
|
||||
LL | #![deny(unused_macros)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: unused macro definition
|
||||
--> $DIR/unused-macro.rs:15:5
|
||||
error: unused macro definition: `unused`
|
||||
--> $DIR/unused-macro.rs:15:11
|
||||
|
|
||||
LL | / macro unused {
|
||||
LL | | () => {}
|
||||
LL | | }
|
||||
| |_____^
|
||||
LL | macro unused {
|
||||
| ^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused-macro.rs:14:12
|
||||
@ -26,13 +22,11 @@ note: the lint level is defined here
|
||||
LL | #[deny(unused_macros)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: unused macro definition
|
||||
--> $DIR/unused-macro.rs:21:5
|
||||
error: unused macro definition: `unused`
|
||||
--> $DIR/unused-macro.rs:21:22
|
||||
|
|
||||
LL | / pub(crate) macro unused {
|
||||
LL | | () => {}
|
||||
LL | | }
|
||||
| |_____^
|
||||
LL | pub(crate) macro unused {
|
||||
| ^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
// run-pass
|
||||
|
||||
#![allow(dead_code)]
|
||||
#![allow(dead_code, unused_macros)]
|
||||
// aux-build:issue-39889.rs
|
||||
|
||||
extern crate issue_39889;
|
||||
|
Loading…
Reference in New Issue
Block a user