Skip to content

Commit e8851db

Browse files
committed
Don't store defaultness for inherent impl items
1 parent 4ba879d commit e8851db

File tree

6 files changed

+14
-8
lines changed

6 files changed

+14
-8
lines changed

compiler/rustc_metadata/src/rmeta/encoder.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1725,7 +1725,10 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
17251725
let tcx = self.tcx;
17261726
let item = tcx.associated_item(def_id);
17271727

1728-
self.tables.defaultness.set_some(def_id.index, item.defaultness(tcx));
1728+
if matches!(item.container, AssocContainer::Trait | AssocContainer::TraitImpl(_)) {
1729+
self.tables.defaultness.set_some(def_id.index, item.defaultness(tcx));
1730+
}
1731+
17291732
record!(self.tables.assoc_container[def_id] <- item.container);
17301733

17311734
if let AssocContainer::Trait = item.container

compiler/rustc_middle/src/query/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,6 +1858,7 @@ rustc_queries! {
18581858
}
18591859

18601860
/// Returns whether the impl or associated function has the `default` keyword.
1861+
/// Note: This will ICE on inherent impl items. Consider using `AssocItem::defaultness`.
18611862
query defaultness(def_id: DefId) -> hir::Defaultness {
18621863
desc { |tcx| "looking up whether `{}` has `default`", tcx.def_path_str(def_id) }
18631864
separate_provide_extern

compiler/rustc_middle/src/ty/assoc.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@ impl AssocItem {
5353
///
5454
/// [`type_of`]: crate::ty::TyCtxt::type_of
5555
pub fn defaultness(&self, tcx: TyCtxt<'_>) -> hir::Defaultness {
56-
tcx.defaultness(self.def_id)
56+
match self.container {
57+
AssocContainer::InherentImpl => hir::Defaultness::Final,
58+
AssocContainer::Trait | AssocContainer::TraitImpl(_) => tcx.defaultness(self.def_id),
59+
}
5760
}
5861

5962
pub fn expect_trait_impl(&self) -> Result<DefId, ErrorGuaranteed> {

compiler/rustc_ty_utils/src/ty.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,6 @@ fn defaultness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Defaultness {
9393
..
9494
})
9595
| hir::Node::TraitItem(hir::TraitItem { defaultness, .. }) => *defaultness,
96-
hir::Node::ImplItem(hir::ImplItem {
97-
impl_kind: hir::ImplItemImplKind::Inherent { .. },
98-
..
99-
}) => hir::Defaultness::Final,
10096
node => {
10197
bug!("`defaultness` called on {:?}", node);
10298
}

src/librustdoc/clean/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1258,7 +1258,10 @@ pub(crate) fn clean_impl_item<'tcx>(
12581258
})),
12591259
hir::ImplItemKind::Fn(ref sig, body) => {
12601260
let m = clean_function(cx, sig, impl_.generics, ParamsSrc::Body(body));
1261-
let defaultness = cx.tcx.defaultness(impl_.owner_id);
1261+
let defaultness = match impl_.impl_kind {
1262+
hir::ImplItemImplKind::Inherent { .. } => hir::Defaultness::Final,
1263+
hir::ImplItemImplKind::Trait { defaultness, .. } => defaultness,
1264+
};
12621265
MethodItem(m, Some(defaultness))
12631266
}
12641267
hir::ImplItemKind::Type(hir_ty) => {

src/librustdoc/passes/collect_intra_doc_links.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ impl UrlFragment {
210210
&UrlFragment::Item(def_id) => {
211211
let kind = match tcx.def_kind(def_id) {
212212
DefKind::AssocFn => {
213-
if tcx.defaultness(def_id).has_value() {
213+
if tcx.associated_item(def_id).defaultness(tcx).has_value() {
214214
"method."
215215
} else {
216216
"tymethod."

0 commit comments

Comments
 (0)