Skip to content

Commit 7cdc456

Browse files
committed
Track whether an assoc item is in a trait impl or an inherent impl
1 parent 502d57c commit 7cdc456

File tree

14 files changed

+151
-68
lines changed

14 files changed

+151
-68
lines changed

Diff for: compiler/rustc_ast/src/mut_visit.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1318,7 +1318,9 @@ impl WalkItemKind for ItemKind {
13181318
visit_polarity(vis, polarity);
13191319
visit_opt(of_trait, |trait_ref| vis.visit_trait_ref(trait_ref));
13201320
vis.visit_ty(self_ty);
1321-
items.flat_map_in_place(|item| vis.flat_map_assoc_item(item, AssocCtxt::Impl));
1321+
items.flat_map_in_place(|item| {
1322+
vis.flat_map_assoc_item(item, AssocCtxt::Impl { of_trait: of_trait.is_some() })
1323+
});
13221324
}
13231325
ItemKind::Trait(box Trait { safety, is_auto: _, generics, bounds, items }) => {
13241326
visit_safety(vis, safety);

Diff for: compiler/rustc_ast/src/visit.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::ptr::P;
2323
#[derive(Copy, Clone, Debug, PartialEq)]
2424
pub enum AssocCtxt {
2525
Trait,
26-
Impl,
26+
Impl { of_trait: bool },
2727
}
2828

2929
#[derive(Copy, Clone, Debug, PartialEq)]
@@ -422,7 +422,12 @@ impl WalkItemKind for ItemKind {
422422
try_visit!(visitor.visit_generics(generics));
423423
visit_opt!(visitor, visit_trait_ref, of_trait);
424424
try_visit!(visitor.visit_ty(self_ty));
425-
walk_list!(visitor, visit_assoc_item, items, AssocCtxt::Impl);
425+
walk_list!(
426+
visitor,
427+
visit_assoc_item,
428+
items,
429+
AssocCtxt::Impl { of_trait: of_trait.is_some() }
430+
);
426431
}
427432
ItemKind::Struct(struct_definition, generics)
428433
| ItemKind::Union(struct_definition, generics) => {

Diff for: compiler/rustc_ast_lowering/src/item.rs

+8-23
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use rustc_hir::def::{DefKind, Res};
77
use rustc_hir::def_id::{CRATE_DEF_ID, LocalDefId};
88
use rustc_hir::{self as hir, HirId, PredicateOrigin};
99
use rustc_index::{IndexSlice, IndexVec};
10-
use rustc_middle::span_bug;
1110
use rustc_middle::ty::{ResolverAstLowering, TyCtxt};
1211
use rustc_span::edit_distance::find_best_match_for_name;
1312
use rustc_span::{DUMMY_SP, DesugaringKind, Ident, Span, Symbol, kw, sym};
@@ -104,10 +103,7 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
104103
}
105104

106105
fn lower_assoc_item(&mut self, item: &AssocItem, ctxt: AssocCtxt) {
107-
let def_id = self.resolver.node_id_to_def_id[&item.id];
108-
let parent_id = self.tcx.local_parent(def_id);
109-
let parent_hir = self.lower_node(parent_id).unwrap();
110-
self.with_lctx(item.id, |lctx| lctx.lower_assoc_item(item, ctxt, parent_hir))
106+
self.with_lctx(item.id, |lctx| lctx.lower_assoc_item(item, ctxt))
111107
}
112108

113109
fn lower_foreign_item(&mut self, item: &ForeignItem) {
@@ -631,29 +627,18 @@ impl<'hir> LoweringContext<'_, 'hir> {
631627
}
632628
}
633629

634-
fn lower_assoc_item(
635-
&mut self,
636-
item: &AssocItem,
637-
ctxt: AssocCtxt,
638-
parent_hir: &'hir hir::OwnerInfo<'hir>,
639-
) -> hir::OwnerNode<'hir> {
640-
let parent_item = parent_hir.node().expect_item();
641-
match parent_item.kind {
642-
hir::ItemKind::Impl(impl_) => {
643-
self.is_in_trait_impl = impl_.of_trait.is_some();
644-
}
645-
hir::ItemKind::Trait(..) => {}
646-
kind => {
647-
span_bug!(item.span, "assoc item has unexpected kind of parent: {}", kind.descr())
648-
}
649-
}
650-
630+
fn lower_assoc_item(&mut self, item: &AssocItem, ctxt: AssocCtxt) -> hir::OwnerNode<'hir> {
651631
// Evaluate with the lifetimes in `params` in-scope.
652632
// This is used to track which lifetimes have already been defined,
653633
// and which need to be replicated when lowering an async fn.
654634
match ctxt {
655635
AssocCtxt::Trait => hir::OwnerNode::TraitItem(self.lower_trait_item(item)),
656-
AssocCtxt::Impl => hir::OwnerNode::ImplItem(self.lower_impl_item(item)),
636+
AssocCtxt::Impl { of_trait } => {
637+
if of_trait {
638+
self.is_in_trait_impl = of_trait;
639+
}
640+
hir::OwnerNode::ImplItem(self.lower_impl_item(item))
641+
}
657642
}
658643
}
659644

Diff for: compiler/rustc_ast_passes/src/ast_validation.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
860860
this.visit_trait_ref(t);
861861
this.visit_ty(self_ty);
862862

863-
walk_list!(this, visit_assoc_item, items, AssocCtxt::Impl);
863+
walk_list!(this, visit_assoc_item, items, AssocCtxt::Impl { of_trait: true });
864864
});
865865
walk_list!(self, visit_attribute, &item.attrs);
866866
return; // Avoid visiting again.
@@ -913,7 +913,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
913913
|this| this.visit_generics(generics),
914914
);
915915
this.visit_ty(self_ty);
916-
walk_list!(this, visit_assoc_item, items, AssocCtxt::Impl);
916+
walk_list!(this, visit_assoc_item, items, AssocCtxt::Impl { of_trait: false });
917917
});
918918
walk_list!(self, visit_attribute, &item.attrs);
919919
return; // Avoid visiting again.
@@ -1414,7 +1414,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
14141414
self.check_defaultness(item.span, item.kind.defaultness());
14151415
}
14161416

1417-
if ctxt == AssocCtxt::Impl {
1417+
if let AssocCtxt::Impl { .. } = ctxt {
14181418
match &item.kind {
14191419
AssocItemKind::Const(box ConstItem { expr: None, .. }) => {
14201420
self.dcx().emit_err(errors::AssocConstWithoutBody {

Diff for: compiler/rustc_builtin_macros/src/autodiff.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ mod llvm_enzyme {
157157
};
158158
(sig.clone(), false)
159159
}
160-
Annotatable::AssocItem(assoc_item, _) => {
160+
Annotatable::AssocItem(assoc_item, Impl { of_trait: false }) => {
161161
let sig = match &assoc_item.kind {
162162
ast::AssocItemKind::Fn(box ast::Fn { sig, .. }) => sig,
163163
_ => {
@@ -296,7 +296,7 @@ mod llvm_enzyme {
296296
}
297297
Annotatable::Item(iitem.clone())
298298
}
299-
Annotatable::AssocItem(ref mut assoc_item, i @ Impl) => {
299+
Annotatable::AssocItem(ref mut assoc_item, i @ Impl { of_trait: false }) => {
300300
if !assoc_item.attrs.iter().any(|a| same_attribute(&a.kind, &attr.kind)) {
301301
assoc_item.attrs.push(attr);
302302
}
@@ -327,7 +327,7 @@ mod llvm_enzyme {
327327
kind: assoc_item,
328328
tokens: None,
329329
});
330-
Annotatable::AssocItem(d_fn, Impl)
330+
Annotatable::AssocItem(d_fn, Impl { of_trait: false })
331331
} else {
332332
let mut d_fn =
333333
ecx.item(span, d_ident, thin_vec![d_attr, inline_never], ItemKind::Fn(asdf));

Diff for: compiler/rustc_expand/src/base.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ impl Annotatable {
153153

154154
pub fn expect_impl_item(self) -> P<ast::AssocItem> {
155155
match self {
156-
Annotatable::AssocItem(i, AssocCtxt::Impl) => i,
156+
Annotatable::AssocItem(i, AssocCtxt::Impl { .. }) => i,
157157
_ => panic!("expected Item"),
158158
}
159159
}
@@ -403,6 +403,11 @@ pub trait MacResult {
403403
None
404404
}
405405

406+
/// Creates zero or more impl items.
407+
fn make_trait_impl_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
408+
None
409+
}
410+
406411
/// Creates zero or more trait items.
407412
fn make_trait_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
408413
None
@@ -516,6 +521,10 @@ impl MacResult for MacEager {
516521
self.impl_items
517522
}
518523

524+
fn make_trait_impl_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
525+
self.impl_items
526+
}
527+
519528
fn make_trait_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
520529
self.trait_items
521530
}
@@ -613,6 +622,10 @@ impl MacResult for DummyResult {
613622
Some(SmallVec::new())
614623
}
615624

625+
fn make_trait_impl_items(self: Box<DummyResult>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
626+
Some(SmallVec::new())
627+
}
628+
616629
fn make_trait_items(self: Box<DummyResult>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
617630
Some(SmallVec::new())
618631
}

0 commit comments

Comments
 (0)