1
Fork 0

Rollup merge of #70043 - mark-i-m:def-kind-more, r=eddyb

Add all remaining `DefKind`s.

r? @eddyb or @Centril

~~I'm not sure if this is what you were thinking of. There are also a few places where I'm not sure what the correct choice is because I don't fully understand the meaning of some variants.~~

~~In general, it feels a bit odd to add some of these as `DefKind`s (e.g. `Arm`) because they don't feel like definitions. Are there things that it makes sense not to add?~~
This commit is contained in:
Dylan DPC 2020-04-26 01:00:13 +02:00 committed by GitHub
commit e51cbc8376
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
40 changed files with 234 additions and 239 deletions

View file

@ -77,6 +77,18 @@ pub enum DefKind {
// Macro namespace // Macro namespace
Macro(MacroKind), Macro(MacroKind),
// Not namespaced (or they are, but we don't treat them so)
ExternCrate,
Use,
ForeignMod,
AnonConst,
Field,
LifetimeParam,
GlobalAsm,
Impl,
Closure,
Generator,
} }
impl DefKind { impl DefKind {
@ -113,6 +125,16 @@ impl DefKind {
DefKind::TyParam => "type parameter", DefKind::TyParam => "type parameter",
DefKind::ConstParam => "const parameter", DefKind::ConstParam => "const parameter",
DefKind::Macro(macro_kind) => macro_kind.descr(), DefKind::Macro(macro_kind) => macro_kind.descr(),
DefKind::LifetimeParam => "lifetime parameter",
DefKind::Use => "import",
DefKind::ForeignMod => "foreign module",
DefKind::AnonConst => "constant expression",
DefKind::Field => "field",
DefKind::Impl => "implementation",
DefKind::Closure => "closure",
DefKind::Generator => "generator",
DefKind::ExternCrate => "extern crate",
DefKind::GlobalAsm => "global assembly block",
} }
} }
@ -124,7 +146,10 @@ impl DefKind {
| DefKind::AssocOpaqueTy | DefKind::AssocOpaqueTy
| DefKind::AssocFn | DefKind::AssocFn
| DefKind::Enum | DefKind::Enum
| DefKind::OpaqueTy => "an", | DefKind::OpaqueTy
| DefKind::Impl
| DefKind::Use
| DefKind::ExternCrate => "an",
DefKind::Macro(macro_kind) => macro_kind.article(), DefKind::Macro(macro_kind) => macro_kind.article(),
_ => "a", _ => "a",
} }
@ -155,6 +180,18 @@ impl DefKind {
| DefKind::AssocConst => ns == Namespace::ValueNS, | DefKind::AssocConst => ns == Namespace::ValueNS,
DefKind::Macro(..) => ns == Namespace::MacroNS, DefKind::Macro(..) => ns == Namespace::MacroNS,
// Not namespaced.
DefKind::AnonConst
| DefKind::Field
| DefKind::LifetimeParam
| DefKind::ExternCrate
| DefKind::Closure
| DefKind::Generator
| DefKind::Use
| DefKind::ForeignMod
| DefKind::GlobalAsm
| DefKind::Impl => false,
} }
} }
} }

View file

@ -2452,27 +2452,6 @@ pub enum ItemKind<'hir> {
} }
impl ItemKind<'_> { impl ItemKind<'_> {
pub fn descr(&self) -> &str {
match *self {
ItemKind::ExternCrate(..) => "extern crate",
ItemKind::Use(..) => "`use` import",
ItemKind::Static(..) => "static item",
ItemKind::Const(..) => "constant item",
ItemKind::Fn(..) => "function",
ItemKind::Mod(..) => "module",
ItemKind::ForeignMod(..) => "extern block",
ItemKind::GlobalAsm(..) => "global asm item",
ItemKind::TyAlias(..) => "type alias",
ItemKind::OpaqueTy(..) => "opaque type",
ItemKind::Enum(..) => "enum",
ItemKind::Struct(..) => "struct",
ItemKind::Union(..) => "union",
ItemKind::Trait(..) => "trait",
ItemKind::TraitAlias(..) => "trait alias",
ItemKind::Impl { .. } => "implementation",
}
}
pub fn generics(&self) -> Option<&Generics<'_>> { pub fn generics(&self) -> Option<&Generics<'_>> {
Some(match *self { Some(match *self {
ItemKind::Fn(_, ref generics, _) ItemKind::Fn(_, ref generics, _)
@ -2551,16 +2530,6 @@ pub enum ForeignItemKind<'hir> {
Type, Type,
} }
impl ForeignItemKind<'hir> {
pub fn descriptive_variant(&self) -> &str {
match *self {
ForeignItemKind::Fn(..) => "foreign function",
ForeignItemKind::Static(..) => "foreign static item",
ForeignItemKind::Type => "foreign type",
}
}
}
/// A variable captured by a closure. /// A variable captured by a closure.
#[derive(Debug, Copy, Clone, RustcEncodable, RustcDecodable, HashStable_Generic)] #[derive(Debug, Copy, Clone, RustcEncodable, RustcDecodable, HashStable_Generic)]
pub struct Upvar { pub struct Upvar {

View file

@ -207,12 +207,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
.get_opt_name() .get_opt_name()
.map(|parent_symbol| parent_symbol.to_string()); .map(|parent_symbol| parent_symbol.to_string());
let type_parent_desc = self (parent_name, Some(self.tcx.def_kind(parent_def_id).descr(parent_def_id)))
.tcx
.def_kind(parent_def_id)
.map(|parent_def_kind| parent_def_kind.descr(parent_def_id));
(parent_name, type_parent_desc)
} else { } else {
(None, None) (None, None)
}; };

View file

@ -562,8 +562,8 @@ impl MetadataBlob {
} }
impl EntryKind { impl EntryKind {
fn def_kind(&self) -> Option<DefKind> { fn def_kind(&self) -> DefKind {
Some(match *self { match *self {
EntryKind::Const(..) => DefKind::Const, EntryKind::Const(..) => DefKind::Const,
EntryKind::AssocConst(..) => DefKind::AssocConst, EntryKind::AssocConst(..) => DefKind::AssocConst,
EntryKind::ImmStatic EntryKind::ImmStatic
@ -587,14 +587,13 @@ impl EntryKind {
EntryKind::Enum(..) => DefKind::Enum, EntryKind::Enum(..) => DefKind::Enum,
EntryKind::MacroDef(_) => DefKind::Macro(MacroKind::Bang), EntryKind::MacroDef(_) => DefKind::Macro(MacroKind::Bang),
EntryKind::ForeignType => DefKind::ForeignTy, EntryKind::ForeignType => DefKind::ForeignTy,
EntryKind::Impl(_) => DefKind::Impl,
EntryKind::ForeignMod EntryKind::Closure => DefKind::Closure,
| EntryKind::GlobalAsm EntryKind::ForeignMod => DefKind::ForeignMod,
| EntryKind::Impl(_) EntryKind::GlobalAsm => DefKind::GlobalAsm,
| EntryKind::Field EntryKind::Field => DefKind::Field,
| EntryKind::Generator(_) EntryKind::Generator(_) => DefKind::Generator,
| EntryKind::Closure => return None, }
})
} }
} }
@ -679,11 +678,11 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
} }
} }
fn def_kind(&self, index: DefIndex) -> Option<DefKind> { fn def_kind(&self, index: DefIndex) -> DefKind {
if !self.is_proc_macro(index) { if !self.is_proc_macro(index) {
self.kind(index).def_kind() self.kind(index).def_kind()
} else { } else {
Some(DefKind::Macro(macro_kind(self.raw_proc_macro(index)))) DefKind::Macro(macro_kind(self.raw_proc_macro(index)))
} }
} }
@ -1009,20 +1008,19 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
.get(self, child_index) .get(self, child_index)
.unwrap_or(Lazy::empty()); .unwrap_or(Lazy::empty());
for child_index in child_children.decode((self, sess)) { for child_index in child_children.decode((self, sess)) {
if let Some(kind) = self.def_kind(child_index) { let kind = self.def_kind(child_index);
callback(Export { callback(Export {
res: Res::Def(kind, self.local_def_id(child_index)), res: Res::Def(kind, self.local_def_id(child_index)),
ident: self.item_ident(child_index, sess), ident: self.item_ident(child_index, sess),
vis: self.get_visibility(child_index), vis: self.get_visibility(child_index),
span: self span: self
.root .root
.tables .tables
.span .span
.get(self, child_index) .get(self, child_index)
.unwrap() .unwrap()
.decode((self, sess)), .decode((self, sess)),
}); });
}
} }
continue; continue;
} }
@ -1033,10 +1031,8 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
let def_key = self.def_key(child_index); let def_key = self.def_key(child_index);
let span = self.get_span(child_index, sess); let span = self.get_span(child_index, sess);
if let (Some(kind), true) = ( if def_key.disambiguated_data.data.get_opt_name().is_some() {
self.def_kind(child_index), let kind = self.def_kind(child_index);
def_key.disambiguated_data.data.get_opt_name().is_some(),
) {
let ident = self.item_ident(child_index, sess); let ident = self.item_ident(child_index, sess);
let vis = self.get_visibility(child_index); let vis = self.get_visibility(child_index);
let def_id = self.local_def_id(child_index); let def_id = self.local_def_id(child_index);

View file

@ -6,7 +6,7 @@ use crate::ty::TyCtxt;
use rustc_ast::ast::{self, Name, NodeId}; use rustc_ast::ast::{self, Name, NodeId};
use rustc_data_structures::svh::Svh; use rustc_data_structures::svh::Svh;
use rustc_hir::def::{DefKind, Res}; use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE}; use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE};
use rustc_hir::definitions::{DefKey, DefPath, Definitions}; use rustc_hir::definitions::{DefKey, DefPath, Definitions};
use rustc_hir::intravisit; use rustc_hir::intravisit;
use rustc_hir::itemlikevisit::ItemLikeVisitor; use rustc_hir::itemlikevisit::ItemLikeVisitor;
@ -227,10 +227,14 @@ impl<'hir> Map<'hir> {
self.tcx.definitions.opt_local_def_id_to_hir_id(def_id) self.tcx.definitions.opt_local_def_id_to_hir_id(def_id)
} }
pub fn def_kind(&self, hir_id: HirId) -> Option<DefKind> { pub fn def_kind(&self, local_def_id: LocalDefId) -> DefKind {
let node = self.find(hir_id)?; // FIXME(eddyb) support `find` on the crate root.
if local_def_id.to_def_id().index == CRATE_DEF_INDEX {
return DefKind::Mod;
}
Some(match node { let hir_id = self.local_def_id_to_hir_id(local_def_id);
match self.get(hir_id) {
Node::Item(item) => match item.kind { Node::Item(item) => match item.kind {
ItemKind::Static(..) => DefKind::Static, ItemKind::Static(..) => DefKind::Static,
ItemKind::Const(..) => DefKind::Const, ItemKind::Const(..) => DefKind::Const,
@ -243,11 +247,11 @@ impl<'hir> Map<'hir> {
ItemKind::Union(..) => DefKind::Union, ItemKind::Union(..) => DefKind::Union,
ItemKind::Trait(..) => DefKind::Trait, ItemKind::Trait(..) => DefKind::Trait,
ItemKind::TraitAlias(..) => DefKind::TraitAlias, ItemKind::TraitAlias(..) => DefKind::TraitAlias,
ItemKind::ExternCrate(_) ItemKind::ExternCrate(_) => DefKind::ExternCrate,
| ItemKind::Use(..) ItemKind::Use(..) => DefKind::Use,
| ItemKind::ForeignMod(..) ItemKind::ForeignMod(..) => DefKind::ForeignMod,
| ItemKind::GlobalAsm(..) ItemKind::GlobalAsm(..) => DefKind::GlobalAsm,
| ItemKind::Impl { .. } => return None, ItemKind::Impl { .. } => DefKind::Impl,
}, },
Node::ForeignItem(item) => match item.kind { Node::ForeignItem(item) => match item.kind {
ForeignItemKind::Fn(..) => DefKind::Fn, ForeignItemKind::Fn(..) => DefKind::Fn,
@ -268,7 +272,7 @@ impl<'hir> Map<'hir> {
Node::Variant(_) => DefKind::Variant, Node::Variant(_) => DefKind::Variant,
Node::Ctor(variant_data) => { Node::Ctor(variant_data) => {
// FIXME(eddyb) is this even possible, if we have a `Node::Ctor`? // FIXME(eddyb) is this even possible, if we have a `Node::Ctor`?
variant_data.ctor_hir_id()?; assert_ne!(variant_data.ctor_hir_id(), None);
let ctor_of = match self.find(self.get_parent_node(hir_id)) { let ctor_of = match self.find(self.get_parent_node(hir_id)) {
Some(Node::Item(..)) => def::CtorOf::Struct, Some(Node::Item(..)) => def::CtorOf::Struct,
@ -277,10 +281,20 @@ impl<'hir> Map<'hir> {
}; };
DefKind::Ctor(ctor_of, def::CtorKind::from_hir(variant_data)) DefKind::Ctor(ctor_of, def::CtorKind::from_hir(variant_data))
} }
Node::AnonConst(_) Node::AnonConst(_) => DefKind::AnonConst,
| Node::Field(_) Node::Field(_) => DefKind::Field,
| Node::Expr(_) Node::Expr(expr) => match expr.kind {
| Node::Stmt(_) ExprKind::Closure(.., None) => DefKind::Closure,
ExprKind::Closure(.., Some(_)) => DefKind::Generator,
_ => bug!("def_kind: unsupported node: {}", self.node_to_string(hir_id)),
},
Node::MacroDef(_) => DefKind::Macro(MacroKind::Bang),
Node::GenericParam(param) => match param.kind {
GenericParamKind::Lifetime { .. } => DefKind::LifetimeParam,
GenericParamKind::Type { .. } => DefKind::TyParam,
GenericParamKind::Const { .. } => DefKind::ConstParam,
},
Node::Stmt(_)
| Node::PathSegment(_) | Node::PathSegment(_)
| Node::Ty(_) | Node::Ty(_)
| Node::TraitRef(_) | Node::TraitRef(_)
@ -292,14 +306,8 @@ impl<'hir> Map<'hir> {
| Node::Lifetime(_) | Node::Lifetime(_)
| Node::Visibility(_) | Node::Visibility(_)
| Node::Block(_) | Node::Block(_)
| Node::Crate(_) => return None, | Node::Crate(_) => bug!("def_kind: unsupported node: {}", self.node_to_string(hir_id)),
Node::MacroDef(_) => DefKind::Macro(MacroKind::Bang), }
Node::GenericParam(param) => match param.kind {
GenericParamKind::Lifetime { .. } => return None,
GenericParamKind::Type { .. } => DefKind::TyParam,
GenericParamKind::Const { .. } => DefKind::ConstParam,
},
})
} }
fn find_entry(&self, id: HirId) -> Option<Entry<'hir>> { fn find_entry(&self, id: HirId) -> Option<Entry<'hir>> {
@ -1082,6 +1090,5 @@ fn hir_id_to_string(map: &Map<'_>, id: HirId) -> String {
} }
pub fn provide(providers: &mut Providers<'_>) { pub fn provide(providers: &mut Providers<'_>) {
providers.def_kind = providers.def_kind = |tcx, def_id| tcx.hir().def_kind(def_id.expect_local());
|tcx, def_id| tcx.hir().def_kind(tcx.hir().as_local_hir_id(def_id.expect_local()));
} }

View file

@ -246,7 +246,7 @@ pub enum EvalResult {
fn skip_stability_check_due_to_privacy(tcx: TyCtxt<'_>, mut def_id: DefId) -> bool { fn skip_stability_check_due_to_privacy(tcx: TyCtxt<'_>, mut def_id: DefId) -> bool {
// Check if `def_id` is a trait method. // Check if `def_id` is a trait method.
match tcx.def_kind(def_id) { match tcx.def_kind(def_id) {
Some(DefKind::AssocFn) | Some(DefKind::AssocTy) | Some(DefKind::AssocConst) => { DefKind::AssocFn | DefKind::AssocTy | DefKind::AssocConst => {
if let ty::TraitContainer(trait_def_id) = tcx.associated_item(def_id).container { if let ty::TraitContainer(trait_def_id) = tcx.associated_item(def_id).container {
// Trait methods do not declare visibility (even // Trait methods do not declare visibility (even
// for visibility info in cstore). Use containing // for visibility info in cstore). Use containing

View file

@ -620,7 +620,7 @@ rustc_queries! {
cache_on_disk_if { true } cache_on_disk_if { true }
} }
query def_kind(_: DefId) -> Option<DefKind> {} query def_kind(_: DefId) -> DefKind {}
query def_span(_: DefId) -> Span { query def_span(_: DefId) -> Span {
// FIXME(mw): DefSpans are not really inputs since they are derived from // FIXME(mw): DefSpans are not really inputs since they are derived from
// HIR. But at the moment HIR hashing still contains some hacks that allow // HIR. But at the moment HIR hashing still contains some hacks that allow

View file

@ -48,7 +48,7 @@ use rustc_errors::ErrorReported;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{DefKind, Res}; use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId, LOCAL_CRATE}; use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId, LOCAL_CRATE};
use rustc_hir::definitions::{DefPathData, DefPathHash, Definitions}; use rustc_hir::definitions::{DefPathHash, Definitions};
use rustc_hir::lang_items; use rustc_hir::lang_items;
use rustc_hir::lang_items::PanicLocationLangItem; use rustc_hir::lang_items::PanicLocationLangItem;
use rustc_hir::{HirId, Node, TraitCandidate}; use rustc_hir::{HirId, Node, TraitCandidate};
@ -1492,21 +1492,13 @@ impl<'tcx> TyCtxt<'tcx> {
/// Returns a displayable description and article for the given `def_id` (e.g. `("a", "struct")`). /// Returns a displayable description and article for the given `def_id` (e.g. `("a", "struct")`).
pub fn article_and_description(&self, def_id: DefId) -> (&'static str, &'static str) { pub fn article_and_description(&self, def_id: DefId) -> (&'static str, &'static str) {
self.def_kind(def_id) match self.def_kind(def_id) {
.map(|def_kind| (def_kind.article(), def_kind.descr(def_id))) DefKind::Generator => match self.generator_kind(def_id).unwrap() {
.unwrap_or_else(|| match self.def_key(def_id).disambiguated_data.data { rustc_hir::GeneratorKind::Async(..) => ("an", "async closure"),
DefPathData::ClosureExpr => match self.generator_kind(def_id) { rustc_hir::GeneratorKind::Gen => ("a", "generator"),
None => ("a", "closure"), },
Some(rustc_hir::GeneratorKind::Async(..)) => ("an", "async closure"), def_kind => (def_kind.article(), def_kind.descr(def_id)),
Some(rustc_hir::GeneratorKind::Gen) => ("a", "generator"), }
},
DefPathData::LifetimeNs(..) => ("a", "lifetime"),
DefPathData::Impl => ("an", "implementation"),
DefPathData::TypeNs(..) | DefPathData::ValueNs(..) | DefPathData::MacroNs(..) => {
unreachable!()
}
_ => bug!("article_and_description called on def_id {:?}", def_id),
})
} }
} }

View file

@ -2680,7 +2680,7 @@ impl<'tcx> TyCtxt<'tcx> {
} }
} else { } else {
match self.def_kind(def_id) { match self.def_kind(def_id) {
Some(DefKind::AssocConst | DefKind::AssocFn | DefKind::AssocTy) => true, DefKind::AssocConst | DefKind::AssocFn | DefKind::AssocTy => true,
_ => false, _ => false,
} }
}; };

View file

@ -888,7 +888,7 @@ pub trait PrettyPrinter<'tcx>:
p!(write("::{:?}", promoted)); p!(write("::{:?}", promoted));
} else { } else {
match self.tcx().def_kind(did) { match self.tcx().def_kind(did) {
Some(DefKind::Static | DefKind::Const | DefKind::AssocConst) => { DefKind::Static | DefKind::Const | DefKind::AssocConst => {
p!(print_value_path(did, substs)) p!(print_value_path(did, substs))
} }
_ => { _ => {

View file

@ -16,7 +16,6 @@ use rustc_errors::ErrorReported;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_hir::definitions::DefPathData;
use rustc_macros::HashStable; use rustc_macros::HashStable;
use rustc_span::Span; use rustc_span::Span;
use rustc_target::abi::{Integer, Size, TargetDataLayout}; use rustc_target::abi::{Integer, Size, TargetDataLayout};
@ -446,24 +445,24 @@ impl<'tcx> TyCtxt<'tcx> {
/// those are not yet phased out). The parent of the closure's /// those are not yet phased out). The parent of the closure's
/// `DefId` will also be the context where it appears. /// `DefId` will also be the context where it appears.
pub fn is_closure(self, def_id: DefId) -> bool { pub fn is_closure(self, def_id: DefId) -> bool {
self.def_key(def_id).disambiguated_data.data == DefPathData::ClosureExpr matches!(self.def_kind(def_id), DefKind::Closure | DefKind::Generator)
} }
/// Returns `true` if `def_id` refers to a trait (i.e., `trait Foo { ... }`). /// Returns `true` if `def_id` refers to a trait (i.e., `trait Foo { ... }`).
pub fn is_trait(self, def_id: DefId) -> bool { pub fn is_trait(self, def_id: DefId) -> bool {
self.def_kind(def_id) == Some(DefKind::Trait) self.def_kind(def_id) == DefKind::Trait
} }
/// Returns `true` if `def_id` refers to a trait alias (i.e., `trait Foo = ...;`), /// Returns `true` if `def_id` refers to a trait alias (i.e., `trait Foo = ...;`),
/// and `false` otherwise. /// and `false` otherwise.
pub fn is_trait_alias(self, def_id: DefId) -> bool { pub fn is_trait_alias(self, def_id: DefId) -> bool {
self.def_kind(def_id) == Some(DefKind::TraitAlias) self.def_kind(def_id) == DefKind::TraitAlias
} }
/// Returns `true` if this `DefId` refers to the implicit constructor for /// Returns `true` if this `DefId` refers to the implicit constructor for
/// a tuple struct like `struct Foo(u32)`, and `false` otherwise. /// a tuple struct like `struct Foo(u32)`, and `false` otherwise.
pub fn is_constructor(self, def_id: DefId) -> bool { pub fn is_constructor(self, def_id: DefId) -> bool {
self.def_key(def_id).disambiguated_data.data == DefPathData::Ctor matches!(self.def_kind(def_id), DefKind::Ctor(..))
} }
/// Given the def-ID of a fn or closure, returns the def-ID of /// Given the def-ID of a fn or closure, returns the def-ID of

View file

@ -341,7 +341,7 @@ pub fn const_eval_raw_provider<'tcx>(
// because any code that existed before validation could not have failed // because any code that existed before validation could not have failed
// validation thus preventing such a hard error from being a backwards // validation thus preventing such a hard error from being a backwards
// compatibility hazard // compatibility hazard
Some(DefKind::Const | DefKind::AssocConst) => { DefKind::Const | DefKind::AssocConst => {
let hir_id = tcx.hir().as_local_hir_id(def_id.expect_local()); let hir_id = tcx.hir().as_local_hir_id(def_id.expect_local());
err.report_as_lint( err.report_as_lint(
tcx.at(tcx.def_span(def_id)), tcx.at(tcx.def_span(def_id)),

View file

@ -632,7 +632,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
// FIXME: The above is likely untrue. See // FIXME: The above is likely untrue. See
// <https://github.com/rust-lang/rust/pull/70004#issuecomment-602022110>. Is it // <https://github.com/rust-lang/rust/pull/70004#issuecomment-602022110>. Is it
// okay to ignore `StorageDead`/`StorageLive` annotations during CTFE? // okay to ignore `StorageDead`/`StorageLive` annotations during CTFE?
Some(DefKind::Static | DefKind::Const | DefKind::AssocConst) => {} DefKind::Static | DefKind::Const | DefKind::AssocConst => {}
_ => { _ => {
// Mark locals that use `Storage*` annotations as dead on function entry. // Mark locals that use `Storage*` annotations as dead on function entry.
let always_live = AlwaysLiveLocals::new(self.body()); let always_live = AlwaysLiveLocals::new(self.body());

View file

@ -779,7 +779,7 @@ fn compute_codegen_unit_name(
cgu_def_id = Some(DefId { krate: def_id.krate, index: CRATE_DEF_INDEX }); cgu_def_id = Some(DefId { krate: def_id.krate, index: CRATE_DEF_INDEX });
} }
break; break;
} else if tcx.def_kind(current_def_id) == Some(DefKind::Mod) { } else if tcx.def_kind(current_def_id) == DefKind::Mod {
if cgu_def_id.is_none() { if cgu_def_id.is_none() {
cgu_def_id = Some(current_def_id); cgu_def_id = Some(current_def_id);
} }

View file

@ -69,10 +69,7 @@ impl<'tcx> MirPass<'tcx> for ConstProp {
let hir_id = tcx.hir().as_local_hir_id(source.def_id().expect_local()); let hir_id = tcx.hir().as_local_hir_id(source.def_id().expect_local());
let is_fn_like = FnLikeNode::from_node(tcx.hir().get(hir_id)).is_some(); let is_fn_like = FnLikeNode::from_node(tcx.hir().get(hir_id)).is_some();
let is_assoc_const = match tcx.def_kind(source.def_id()) { let is_assoc_const = tcx.def_kind(source.def_id()) == DefKind::AssocConst;
Some(DefKind::AssocConst) => true,
_ => false,
};
// Only run const prop on functions, methods, closures and associated constants // Only run const prop on functions, methods, closures and associated constants
if !is_fn_like && !is_assoc_const { if !is_fn_like && !is_assoc_const {

View file

@ -807,17 +807,17 @@ fn write_mir_sig(
trace!("write_mir_sig: {:?}", src.instance); trace!("write_mir_sig: {:?}", src.instance);
let kind = tcx.def_kind(src.def_id()); let kind = tcx.def_kind(src.def_id());
let is_function = match kind { let is_function = match kind {
Some(DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(..)) => true, DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(..) => true,
_ => tcx.is_closure(src.def_id()), _ => tcx.is_closure(src.def_id()),
}; };
match (kind, src.promoted) { match (kind, src.promoted) {
(_, Some(i)) => write!(w, "{:?} in ", i)?, (_, Some(i)) => write!(w, "{:?} in ", i)?,
(Some(DefKind::Const | DefKind::AssocConst), _) => write!(w, "const ")?, (DefKind::Const | DefKind::AssocConst, _) => write!(w, "const ")?,
(Some(DefKind::Static), _) => { (DefKind::Static, _) => {
write!(w, "static {}", if tcx.is_mutable_static(src.def_id()) { "mut " } else { "" })? write!(w, "static {}", if tcx.is_mutable_static(src.def_id()) { "mut " } else { "" })?
} }
(_, _) if is_function => write!(w, "fn ")?, (_, _) if is_function => write!(w, "fn ")?,
(None, _) => {} // things like anon const, not an item (DefKind::AnonConst, _) => {} // things like anon const, not an item
_ => bug!("Unexpected def kind {:?}", kind), _ => bug!("Unexpected def kind {:?}", kind),
} }

View file

@ -553,12 +553,13 @@ impl DeadVisitor<'tcx> {
id: hir::HirId, id: hir::HirId,
span: rustc_span::Span, span: rustc_span::Span,
name: ast::Name, name: ast::Name,
node_type: &str,
participle: &str, participle: &str,
) { ) {
if !name.as_str().starts_with('_') { if !name.as_str().starts_with('_') {
self.tcx.struct_span_lint_hir(lint::builtin::DEAD_CODE, id, span, |lint| { self.tcx.struct_span_lint_hir(lint::builtin::DEAD_CODE, id, span, |lint| {
lint.build(&format!("{} is never {}: `{}`", node_type, participle, name)).emit() let def_id = self.tcx.hir().local_def_id(id);
let descr = self.tcx.def_kind(def_id).descr(def_id.to_def_id());
lint.build(&format!("{} is never {}: `{}`", descr, participle, name)).emit()
}); });
} }
} }
@ -604,7 +605,7 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
hir::ItemKind::Struct(..) => "constructed", // Issue #52325 hir::ItemKind::Struct(..) => "constructed", // Issue #52325
_ => "used", _ => "used",
}; };
self.warn_dead_code(item.hir_id, span, item.ident.name, item.kind.descr(), participle); self.warn_dead_code(item.hir_id, span, item.ident.name, participle);
} else { } else {
// Only continue if we didn't warn // Only continue if we didn't warn
intravisit::walk_item(self, item); intravisit::walk_item(self, item);
@ -618,13 +619,7 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
id: hir::HirId, id: hir::HirId,
) { ) {
if self.should_warn_about_variant(&variant) { if self.should_warn_about_variant(&variant) {
self.warn_dead_code( self.warn_dead_code(variant.id, variant.span, variant.ident.name, "constructed");
variant.id,
variant.span,
variant.ident.name,
"variant",
"constructed",
);
} else { } else {
intravisit::walk_variant(self, variant, g, id); intravisit::walk_variant(self, variant, g, id);
} }
@ -632,20 +627,14 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
fn visit_foreign_item(&mut self, fi: &'tcx hir::ForeignItem<'tcx>) { fn visit_foreign_item(&mut self, fi: &'tcx hir::ForeignItem<'tcx>) {
if self.should_warn_about_foreign_item(fi) { if self.should_warn_about_foreign_item(fi) {
self.warn_dead_code( self.warn_dead_code(fi.hir_id, fi.span, fi.ident.name, "used");
fi.hir_id,
fi.span,
fi.ident.name,
fi.kind.descriptive_variant(),
"used",
);
} }
intravisit::walk_foreign_item(self, fi); intravisit::walk_foreign_item(self, fi);
} }
fn visit_struct_field(&mut self, field: &'tcx hir::StructField<'tcx>) { fn visit_struct_field(&mut self, field: &'tcx hir::StructField<'tcx>) {
if self.should_warn_about_field(&field) { if self.should_warn_about_field(&field) {
self.warn_dead_code(field.hir_id, field.span, field.ident.name, "field", "read"); self.warn_dead_code(field.hir_id, field.span, field.ident.name, "read");
} }
intravisit::walk_struct_field(self, field); intravisit::walk_struct_field(self, field);
} }
@ -658,7 +647,6 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
impl_item.hir_id, impl_item.hir_id,
impl_item.span, impl_item.span,
impl_item.ident.name, impl_item.ident.name,
"associated const",
"used", "used",
); );
} }
@ -667,13 +655,7 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
hir::ImplItemKind::Fn(_, body_id) => { hir::ImplItemKind::Fn(_, body_id) => {
if !self.symbol_is_live(impl_item.hir_id) { if !self.symbol_is_live(impl_item.hir_id) {
let span = self.tcx.sess.source_map().guess_head_span(impl_item.span); let span = self.tcx.sess.source_map().guess_head_span(impl_item.span);
self.warn_dead_code( self.warn_dead_code(impl_item.hir_id, span, impl_item.ident.name, "used");
impl_item.hir_id,
span,
impl_item.ident.name,
"method",
"used",
);
} }
self.visit_nested_body(body_id) self.visit_nested_body(body_id)
} }

View file

@ -337,12 +337,14 @@ struct MissingStabilityAnnotations<'a, 'tcx> {
} }
impl<'a, 'tcx> MissingStabilityAnnotations<'a, 'tcx> { impl<'a, 'tcx> MissingStabilityAnnotations<'a, 'tcx> {
fn check_missing_stability(&self, hir_id: HirId, span: Span, name: &str) { fn check_missing_stability(&self, hir_id: HirId, span: Span) {
let stab = self.tcx.stability().local_stability(hir_id); let stab = self.tcx.stability().local_stability(hir_id);
let is_error = let is_error =
!self.tcx.sess.opts.test && stab.is_none() && self.access_levels.is_reachable(hir_id); !self.tcx.sess.opts.test && stab.is_none() && self.access_levels.is_reachable(hir_id);
if is_error { if is_error {
self.tcx.sess.span_err(span, &format!("{} has missing stability attribute", name)); let def_id = self.tcx.hir().local_def_id(hir_id);
let descr = self.tcx.def_kind(def_id).descr(def_id.to_def_id());
self.tcx.sess.span_err(span, &format!("{} has missing stability attribute", descr));
} }
} }
} }
@ -362,42 +364,42 @@ impl<'a, 'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'a, 'tcx> {
// optional. They inherit stability from their parents when unannotated. // optional. They inherit stability from their parents when unannotated.
hir::ItemKind::Impl { of_trait: None, .. } | hir::ItemKind::ForeignMod(..) => {} hir::ItemKind::Impl { of_trait: None, .. } | hir::ItemKind::ForeignMod(..) => {}
_ => self.check_missing_stability(i.hir_id, i.span, i.kind.descr()), _ => self.check_missing_stability(i.hir_id, i.span),
} }
intravisit::walk_item(self, i) intravisit::walk_item(self, i)
} }
fn visit_trait_item(&mut self, ti: &'tcx hir::TraitItem<'tcx>) { fn visit_trait_item(&mut self, ti: &'tcx hir::TraitItem<'tcx>) {
self.check_missing_stability(ti.hir_id, ti.span, "item"); self.check_missing_stability(ti.hir_id, ti.span);
intravisit::walk_trait_item(self, ti); intravisit::walk_trait_item(self, ti);
} }
fn visit_impl_item(&mut self, ii: &'tcx hir::ImplItem<'tcx>) { fn visit_impl_item(&mut self, ii: &'tcx hir::ImplItem<'tcx>) {
let impl_def_id = self.tcx.hir().local_def_id(self.tcx.hir().get_parent_item(ii.hir_id)); let impl_def_id = self.tcx.hir().local_def_id(self.tcx.hir().get_parent_item(ii.hir_id));
if self.tcx.impl_trait_ref(impl_def_id).is_none() { if self.tcx.impl_trait_ref(impl_def_id).is_none() {
self.check_missing_stability(ii.hir_id, ii.span, "item"); self.check_missing_stability(ii.hir_id, ii.span);
} }
intravisit::walk_impl_item(self, ii); intravisit::walk_impl_item(self, ii);
} }
fn visit_variant(&mut self, var: &'tcx Variant<'tcx>, g: &'tcx Generics<'tcx>, item_id: HirId) { fn visit_variant(&mut self, var: &'tcx Variant<'tcx>, g: &'tcx Generics<'tcx>, item_id: HirId) {
self.check_missing_stability(var.id, var.span, "variant"); self.check_missing_stability(var.id, var.span);
intravisit::walk_variant(self, var, g, item_id); intravisit::walk_variant(self, var, g, item_id);
} }
fn visit_struct_field(&mut self, s: &'tcx StructField<'tcx>) { fn visit_struct_field(&mut self, s: &'tcx StructField<'tcx>) {
self.check_missing_stability(s.hir_id, s.span, "field"); self.check_missing_stability(s.hir_id, s.span);
intravisit::walk_struct_field(self, s); intravisit::walk_struct_field(self, s);
} }
fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem<'tcx>) { fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem<'tcx>) {
self.check_missing_stability(i.hir_id, i.span, i.kind.descriptive_variant()); self.check_missing_stability(i.hir_id, i.span);
intravisit::walk_foreign_item(self, i); intravisit::walk_foreign_item(self, i);
} }
fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef<'tcx>) { fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef<'tcx>) {
self.check_missing_stability(md.hir_id, md.span, "macro"); self.check_missing_stability(md.hir_id, md.span);
} }
} }
@ -585,7 +587,7 @@ pub fn check_unused_or_stable_features(tcx: TyCtxt<'_>) {
if tcx.stability().staged_api[&LOCAL_CRATE] { if tcx.stability().staged_api[&LOCAL_CRATE] {
let krate = tcx.hir().krate(); let krate = tcx.hir().krate();
let mut missing = MissingStabilityAnnotations { tcx, access_levels }; let mut missing = MissingStabilityAnnotations { tcx, access_levels };
missing.check_missing_stability(hir::CRATE_HIR_ID, krate.item.span, "crate"); missing.check_missing_stability(hir::CRATE_HIR_ID, krate.item.span);
intravisit::walk_crate(&mut missing, krate); intravisit::walk_crate(&mut missing, krate);
krate.visit_all_item_likes(&mut missing.as_deep_visitor()); krate.visit_all_item_likes(&mut missing.as_deep_visitor());
} }

View file

@ -1,6 +1,7 @@
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/")] #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")]
#![feature(in_band_lifetimes)] #![feature(in_band_lifetimes)]
#![feature(nll)] #![feature(nll)]
#![feature(or_patterns)]
#![recursion_limit = "256"] #![recursion_limit = "256"]
use rustc_ast::ast::Ident; use rustc_ast::ast::Ident;
@ -537,11 +538,10 @@ impl EmbargoVisitor<'tcx> {
for item_id in module.item_ids { for item_id in module.item_ids {
let hir_id = item_id.id; let hir_id = item_id.id;
let item_def_id = self.tcx.hir().local_def_id(hir_id); let item_def_id = self.tcx.hir().local_def_id(hir_id);
if let Some(def_kind) = self.tcx.def_kind(item_def_id) { let def_kind = self.tcx.def_kind(item_def_id);
let item = self.tcx.hir().expect_item(hir_id); let item = self.tcx.hir().expect_item(hir_id);
let vis = ty::Visibility::from_hir(&item.vis, hir_id, self.tcx); let vis = ty::Visibility::from_hir(&item.vis, hir_id, self.tcx);
self.update_macro_reachable_def(hir_id, def_kind, vis, defining_mod); self.update_macro_reachable_def(hir_id, def_kind, vis, defining_mod);
}
} }
if let Some(exports) = self.tcx.module_exports(module_def_id) { if let Some(exports) = self.tcx.module_exports(module_def_id) {
for export in exports { for export in exports {
@ -613,7 +613,7 @@ impl EmbargoVisitor<'tcx> {
} }
// These have type privacy, so are not reachable unless they're // These have type privacy, so are not reachable unless they're
// public // public, or are not namespaced at all.
DefKind::AssocConst DefKind::AssocConst
| DefKind::AssocTy | DefKind::AssocTy
| DefKind::AssocOpaqueTy | DefKind::AssocOpaqueTy
@ -626,7 +626,17 @@ impl EmbargoVisitor<'tcx> {
| DefKind::AssocFn | DefKind::AssocFn
| DefKind::Trait | DefKind::Trait
| DefKind::TyParam | DefKind::TyParam
| DefKind::Variant => (), | DefKind::Variant
| DefKind::LifetimeParam
| DefKind::ExternCrate
| DefKind::Use
| DefKind::ForeignMod
| DefKind::AnonConst
| DefKind::Field
| DefKind::GlobalAsm
| DefKind::Impl
| DefKind::Closure
| DefKind::Generator => (),
} }
} }

View file

@ -906,7 +906,21 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
Res::Def(DefKind::Macro(..), _) | Res::NonMacroAttr(..) => { Res::Def(DefKind::Macro(..), _) | Res::NonMacroAttr(..) => {
self.r.define(parent, ident, MacroNS, (res, vis, span, expansion)) self.r.define(parent, ident, MacroNS, (res, vis, span, expansion))
} }
Res::Def(DefKind::TyParam | DefKind::ConstParam, _) Res::Def(
DefKind::TyParam
| DefKind::ConstParam
| DefKind::ExternCrate
| DefKind::Use
| DefKind::ForeignMod
| DefKind::AnonConst
| DefKind::Field
| DefKind::LifetimeParam
| DefKind::GlobalAsm
| DefKind::Closure
| DefKind::Impl
| DefKind::Generator,
_,
)
| Res::Local(..) | Res::Local(..)
| Res::SelfTy(..) | Res::SelfTy(..)
| Res::SelfCtor(..) | Res::SelfCtor(..)

View file

@ -2504,10 +2504,8 @@ impl<'a> Resolver<'a> {
} }
let container = match parent.kind { let container = match parent.kind {
ModuleKind::Def(DefKind::Mod, _, _) => "module", ModuleKind::Def(kind, _, _) => kind.descr(parent.def_id().unwrap()),
ModuleKind::Def(DefKind::Trait, _, _) => "trait",
ModuleKind::Block(..) => "block", ModuleKind::Block(..) => "block",
_ => "enum",
}; };
let old_noun = match old_binding.is_import() { let old_noun = match old_binding.is_import() {

View file

@ -760,9 +760,23 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> {
Res::Def(HirDefKind::Mod, def_id) => { Res::Def(HirDefKind::Mod, def_id) => {
Some(Ref { kind: RefKind::Mod, span, ref_id: id_from_def_id(def_id) }) Some(Ref { kind: RefKind::Mod, span, ref_id: id_from_def_id(def_id) })
} }
Res::PrimTy(..)
Res::Def(
HirDefKind::Macro(..)
| HirDefKind::ExternCrate
| HirDefKind::ForeignMod
| HirDefKind::LifetimeParam
| HirDefKind::AnonConst
| HirDefKind::Use
| HirDefKind::Field
| HirDefKind::GlobalAsm
| HirDefKind::Impl
| HirDefKind::Closure
| HirDefKind::Generator,
_,
)
| Res::PrimTy(..)
| Res::SelfTy(..) | Res::SelfTy(..)
| Res::Def(HirDefKind::Macro(..), _)
| Res::ToolMod | Res::ToolMod
| Res::NonMacroAttr(..) | Res::NonMacroAttr(..)
| Res::SelfCtor(..) | Res::SelfCtor(..)

View file

@ -1487,7 +1487,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
// ``` // ```
debug!("parent_def_kind: {:?}", self.tcx.def_kind(parent_did)); debug!("parent_def_kind: {:?}", self.tcx.def_kind(parent_did));
let is_raw_borrow_inside_fn_like_call = match self.tcx.def_kind(parent_did) { let is_raw_borrow_inside_fn_like_call = match self.tcx.def_kind(parent_did) {
Some(DefKind::Fn | DefKind::Ctor(..)) => target_ty.is_unsafe_ptr(), DefKind::Fn | DefKind::Ctor(..) => target_ty.is_unsafe_ptr(),
_ => false, _ => false,
}; };

View file

@ -150,10 +150,10 @@ crate fn program_clauses_for(tcx: TyCtxt<'_>, def_id: DefId) -> Clauses<'_> {
// FIXME(eddyb) this should only be using `def_kind`. // FIXME(eddyb) this should only be using `def_kind`.
match tcx.def_key(def_id).disambiguated_data.data { match tcx.def_key(def_id).disambiguated_data.data {
DefPathData::TypeNs(..) => match tcx.def_kind(def_id) { DefPathData::TypeNs(..) => match tcx.def_kind(def_id) {
Some(DefKind::Trait | DefKind::TraitAlias) => program_clauses_for_trait(tcx, def_id), DefKind::Trait | DefKind::TraitAlias => program_clauses_for_trait(tcx, def_id),
// FIXME(eddyb) deduplicate this `associated_item` call with // FIXME(eddyb) deduplicate this `associated_item` call with
// `program_clauses_for_associated_type_{value,def}`. // `program_clauses_for_associated_type_{value,def}`.
Some(DefKind::AssocTy) => match tcx.associated_item(def_id).container { DefKind::AssocTy => match tcx.associated_item(def_id).container {
ty::AssocItemContainer::ImplContainer(_) => { ty::AssocItemContainer::ImplContainer(_) => {
program_clauses_for_associated_type_value(tcx, def_id) program_clauses_for_associated_type_value(tcx, def_id)
} }
@ -161,13 +161,11 @@ crate fn program_clauses_for(tcx: TyCtxt<'_>, def_id: DefId) -> Clauses<'_> {
program_clauses_for_associated_type_def(tcx, def_id) program_clauses_for_associated_type_def(tcx, def_id)
} }
}, },
Some( DefKind::Struct
DefKind::Struct | DefKind::Enum
| DefKind::Enum | DefKind::TyAlias
| DefKind::TyAlias | DefKind::Union
| DefKind::Union | DefKind::OpaqueTy => program_clauses_for_type_def(tcx, def_id),
| DefKind::OpaqueTy,
) => program_clauses_for_type_def(tcx, def_id),
_ => List::empty(), _ => List::empty(),
}, },
DefPathData::Impl => program_clauses_for_impl(tcx, def_id), DefPathData::Impl => program_clauses_for_impl(tcx, def_id),

View file

@ -94,10 +94,7 @@ fn ensure_drop_params_and_item_params_correspond<'tcx>(
} }
Err(_) => { Err(_) => {
let item_span = tcx.def_span(self_type_did); let item_span = tcx.def_span(self_type_did);
let self_descr = tcx let self_descr = tcx.def_kind(self_type_did).descr(self_type_did);
.def_kind(self_type_did)
.map(|kind| kind.descr(self_type_did))
.unwrap_or("type");
struct_span_err!( struct_span_err!(
tcx.sess, tcx.sess,
drop_impl_span, drop_impl_span,
@ -244,10 +241,7 @@ fn ensure_drop_predicates_are_implied_by_item_defn<'tcx>(
if !assumptions_in_impl_context.iter().any(predicate_matches_closure) { if !assumptions_in_impl_context.iter().any(predicate_matches_closure) {
let item_span = tcx.hir().span(self_type_hir_id); let item_span = tcx.hir().span(self_type_hir_id);
let self_descr = tcx let self_descr = tcx.def_kind(self_type_did).descr(self_type_did.to_def_id());
.def_kind(self_type_did)
.map(|kind| kind.descr(self_type_did.to_def_id()))
.unwrap_or("type");
struct_span_err!( struct_span_err!(
tcx.sess, tcx.sess,
*predicate_sp, *predicate_sp,

View file

@ -1564,10 +1564,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
base_did: DefId, base_did: DefId,
) { ) {
let struct_path = self.tcx().def_path_str(base_did); let struct_path = self.tcx().def_path_str(base_did);
let kind_name = match self.tcx().def_kind(base_did) { let kind_name = self.tcx().def_kind(base_did).descr(base_did);
Some(def_kind) => def_kind.descr(base_did),
_ => " ",
};
let mut err = struct_span_err!( let mut err = struct_span_err!(
self.tcx().sess, self.tcx().sess,
field.span, field.span,

View file

@ -831,6 +831,13 @@ fn primary_body_of(
} }
fn has_typeck_tables(tcx: TyCtxt<'_>, def_id: DefId) -> bool { fn has_typeck_tables(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
// FIXME(#71104) some `LocalDefId` do not seem to have a corresponding `HirId`.
if let Some(def_id) = def_id.as_local() {
if tcx.hir().opt_local_def_id_to_hir_id(def_id).is_none() {
return false;
}
}
// Closures' tables come from their outermost function, // Closures' tables come from their outermost function,
// as they are part of the same "inference environment". // as they are part of the same "inference environment".
let outer_def_id = tcx.closure_base_def_id(def_id); let outer_def_id = tcx.closure_base_def_id(def_id);
@ -838,11 +845,8 @@ fn has_typeck_tables(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
return tcx.has_typeck_tables(outer_def_id); return tcx.has_typeck_tables(outer_def_id);
} }
// FIXME(#71104) Should really be using just `as_local_hir_id` but if let Some(def_id) = def_id.as_local() {
// some `LocalDefId` do not seem to have a corresponding HirId. let id = tcx.hir().local_def_id_to_hir_id(def_id);
if let Some(id) =
def_id.as_local().and_then(|def_id| tcx.hir().opt_local_def_id_to_hir_id(def_id))
{
primary_body_of(tcx, id).is_some() primary_body_of(tcx, id).is_some()
} else { } else {
false false
@ -4971,15 +4975,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
Some(Node::Ctor(hir::VariantData::Tuple(fields, _))) => { Some(Node::Ctor(hir::VariantData::Tuple(fields, _))) => {
sugg_call = fields.iter().map(|_| "_").collect::<Vec<_>>().join(", "); sugg_call = fields.iter().map(|_| "_").collect::<Vec<_>>().join(", ");
match def_id match def_id.as_local().map(|def_id| hir.def_kind(def_id)) {
.as_local() Some(DefKind::Ctor(hir::def::CtorOf::Variant, _)) => {
.map(|def_id| hir.as_local_hir_id(def_id))
.and_then(|hir_id| hir.def_kind(hir_id))
{
Some(hir::def::DefKind::Ctor(hir::def::CtorOf::Variant, _)) => {
msg = "instantiate this tuple variant"; msg = "instantiate this tuple variant";
} }
Some(hir::def::DefKind::Ctor(hir::def::CtorOf::Struct, _)) => { Some(DefKind::Ctor(CtorOf::Struct, _)) => {
msg = "instantiate this tuple struct"; msg = "instantiate this tuple struct";
} }
_ => {} _ => {}

View file

@ -278,7 +278,7 @@ fn build_type_alias_type(cx: &DocContext<'_>, did: DefId) -> Option<clean::Type>
} }
pub fn build_ty(cx: &DocContext, did: DefId) -> Option<clean::Type> { pub fn build_ty(cx: &DocContext, did: DefId) -> Option<clean::Type> {
match cx.tcx.def_kind(did)? { match cx.tcx.def_kind(did) {
DefKind::Struct | DefKind::Union | DefKind::Enum | DefKind::Const | DefKind::Static => { DefKind::Struct | DefKind::Union | DefKind::Enum | DefKind::Const | DefKind::Static => {
Some(cx.tcx.type_of(did).clean(cx)) Some(cx.tcx.type_of(did).clean(cx))
} }

View file

@ -2135,7 +2135,7 @@ impl Clean<Vec<Item>> for doctree::Impl<'_> {
let for_ = self.for_.clean(cx); let for_ = self.for_.clean(cx);
let type_alias = for_.def_id().and_then(|did| match cx.tcx.def_kind(did) { let type_alias = for_.def_id().and_then(|did| match cx.tcx.def_kind(did) {
Some(DefKind::TyAlias) => Some(cx.tcx.type_of(did).clean(cx)), DefKind::TyAlias => Some(cx.tcx.type_of(did).clean(cx)),
_ => None, _ => None,
}); });
let make_item = |trait_: Option<Type>, for_: Type, items: Vec<Item>| Item { let make_item = |trait_: Option<Type>, for_: Type, items: Vec<Item>| Item {

View file

@ -209,7 +209,7 @@ pub fn get_real_types(
res.extend(adds); res.extend(adds);
} else if !ty.is_full_generic() { } else if !ty.is_full_generic() {
if let Some(kind) = if let Some(kind) =
ty.def_id().and_then(|did| cx.tcx.def_kind(did).clean(cx)) ty.def_id().map(|did| cx.tcx.def_kind(did).clean(cx))
{ {
res.insert((ty, kind)); res.insert((ty, kind));
} }
@ -226,9 +226,7 @@ pub fn get_real_types(
if !adds.is_empty() { if !adds.is_empty() {
res.extend(adds); res.extend(adds);
} else if !ty.is_full_generic() { } else if !ty.is_full_generic() {
if let Some(kind) = if let Some(kind) = ty.def_id().map(|did| cx.tcx.def_kind(did).clean(cx)) {
ty.def_id().and_then(|did| cx.tcx.def_kind(did).clean(cx))
{
res.insert((ty.clone(), kind)); res.insert((ty.clone(), kind));
} }
} }
@ -236,7 +234,7 @@ pub fn get_real_types(
} }
} }
} else { } else {
if let Some(kind) = arg.def_id().and_then(|did| cx.tcx.def_kind(did).clean(cx)) { if let Some(kind) = arg.def_id().map(|did| cx.tcx.def_kind(did).clean(cx)) {
res.insert((arg.clone(), kind)); res.insert((arg.clone(), kind));
} }
if let Some(gens) = arg.generics() { if let Some(gens) = arg.generics() {
@ -246,9 +244,7 @@ pub fn get_real_types(
if !adds.is_empty() { if !adds.is_empty() {
res.extend(adds); res.extend(adds);
} }
} else if let Some(kind) = } else if let Some(kind) = gen.def_id().map(|did| cx.tcx.def_kind(did).clean(cx)) {
gen.def_id().and_then(|did| cx.tcx.def_kind(did).clean(cx))
{
res.insert((gen.clone(), kind)); res.insert((gen.clone(), kind));
} }
} }
@ -275,7 +271,7 @@ pub fn get_all_types(
if !args.is_empty() { if !args.is_empty() {
all_types.extend(args); all_types.extend(args);
} else { } else {
if let Some(kind) = arg.type_.def_id().and_then(|did| cx.tcx.def_kind(did).clean(cx)) { if let Some(kind) = arg.type_.def_id().map(|did| cx.tcx.def_kind(did).clean(cx)) {
all_types.insert((arg.type_.clone(), kind)); all_types.insert((arg.type_.clone(), kind));
} }
} }
@ -285,9 +281,7 @@ pub fn get_all_types(
FnRetTy::Return(ref return_type) => { FnRetTy::Return(ref return_type) => {
let mut ret = get_real_types(generics, &return_type, cx, 0); let mut ret = get_real_types(generics, &return_type, cx, 0);
if ret.is_empty() { if ret.is_empty() {
if let Some(kind) = if let Some(kind) = return_type.def_id().map(|did| cx.tcx.def_kind(did).clean(cx)) {
return_type.def_id().and_then(|did| cx.tcx.def_kind(did).clean(cx))
{
ret.insert((return_type.clone(), kind)); ret.insert((return_type.clone(), kind));
} }
} }

View file

@ -4,7 +4,7 @@ struct MyFoo;
impl MyFoo { impl MyFoo {
const BAR: u32 = 1; const BAR: u32 = 1;
//~^ ERROR associated const is never used: `BAR` //~^ ERROR associated constant is never used: `BAR`
} }
fn main() { fn main() {

View file

@ -1,4 +1,4 @@
error: associated const is never used: `BAR` error: associated constant is never used: `BAR`
--> $DIR/associated-const-dead-code.rs:6:5 --> $DIR/associated-const-dead-code.rs:6:5
| |
LL | const BAR: u32 = 1; LL | const BAR: u32 = 1;

View file

@ -3,6 +3,6 @@
const foo: isize = 3; const foo: isize = 3;
//~^ ERROR: should have an upper case name //~^ ERROR: should have an upper case name
//~^^ ERROR: constant item is never used //~^^ ERROR: constant is never used
fn main() {} fn main() {}

View file

@ -1,4 +1,4 @@
error: constant item is never used: `foo` error: constant is never used: `foo`
--> $DIR/issue-17718-const-naming.rs:4:1 --> $DIR/issue-17718-const-naming.rs:4:1
| |
LL | const foo: isize = 3; LL | const foo: isize = 3;

View file

@ -17,14 +17,14 @@ mod foo2 {
} }
pub static pub_static: isize = 0; pub static pub_static: isize = 0;
static priv_static: isize = 0; //~ ERROR: static item is never used static priv_static: isize = 0; //~ ERROR: static is never used
const used_static: isize = 0; const used_static: isize = 0;
pub static used_static2: isize = used_static; pub static used_static2: isize = used_static;
const USED_STATIC: isize = 0; const USED_STATIC: isize = 0;
const STATIC_USED_IN_ENUM_DISCRIMINANT: isize = 10; const STATIC_USED_IN_ENUM_DISCRIMINANT: isize = 10;
pub const pub_const: isize = 0; pub const pub_const: isize = 0;
const priv_const: isize = 0; //~ ERROR: constant item is never used const priv_const: isize = 0; //~ ERROR: constant is never used
const used_const: isize = 0; const used_const: isize = 0;
pub const used_const2: isize = used_const; pub const used_const2: isize = used_const;
const USED_CONST: isize = 1; const USED_CONST: isize = 1;

View file

@ -10,13 +10,13 @@ note: the lint level is defined here
LL | #![deny(dead_code)] LL | #![deny(dead_code)]
| ^^^^^^^^^ | ^^^^^^^^^
error: static item is never used: `priv_static` error: static is never used: `priv_static`
--> $DIR/lint-dead-code-1.rs:20:1 --> $DIR/lint-dead-code-1.rs:20:1
| |
LL | static priv_static: isize = 0; LL | static priv_static: isize = 0;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: constant item is never used: `priv_const` error: constant is never used: `priv_const`
--> $DIR/lint-dead-code-1.rs:27:1 --> $DIR/lint-dead-code-1.rs:27:1
| |
LL | const priv_const: isize = 0; LL | const priv_const: isize = 0;

View file

@ -12,7 +12,7 @@ extern {
struct Foo; //~ ERROR: struct is never constructed struct Foo; //~ ERROR: struct is never constructed
impl Foo { impl Foo {
fn foo(&self) { //~ ERROR: method is never used fn foo(&self) { //~ ERROR: associated function is never used
bar() bar()
} }
} }
@ -58,7 +58,7 @@ mod blah {
enum c_void {} //~ ERROR: enum is never used enum c_void {} //~ ERROR: enum is never used
extern { extern {
fn free(p: *const c_void); //~ ERROR: foreign function is never used fn free(p: *const c_void); //~ ERROR: function is never used
} }
// Check provided method // Check provided method

View file

@ -10,7 +10,7 @@ note: the lint level is defined here
LL | #![deny(dead_code)] LL | #![deny(dead_code)]
| ^^^^^^^^^ | ^^^^^^^^^
error: method is never used: `foo` error: associated function is never used: `foo`
--> $DIR/lint-dead-code-3.rs:15:5 --> $DIR/lint-dead-code-3.rs:15:5
| |
LL | fn foo(&self) { LL | fn foo(&self) {
@ -28,7 +28,7 @@ error: enum is never used: `c_void`
LL | enum c_void {} LL | enum c_void {}
| ^^^^^^ | ^^^^^^
error: foreign function is never used: `free` error: function is never used: `free`
--> $DIR/lint-dead-code-3.rs:61:5 --> $DIR/lint-dead-code-3.rs:61:5
| |
LL | fn free(p: *const c_void); LL | fn free(p: *const c_void);

View file

@ -1,4 +1,4 @@
#![feature(staged_api)] #![feature(staged_api)]
//~^ ERROR crate has missing stability attribute //~^ ERROR module has missing stability attribute
fn main() {} fn main() {}

View file

@ -1,4 +1,4 @@
error: crate has missing stability attribute error: module has missing stability attribute
--> $DIR/missing-stability-attr-at-top-level.rs:1:1 --> $DIR/missing-stability-attr-at-top-level.rs:1:1
| |
LL | / #![feature(staged_api)] LL | / #![feature(staged_api)]