Auto merge of #18073 - alibektas:immutable_tree_panics, r=lnicola

fix: Immutable tree panic in `generate_delegate_trait`

fixes #17835
This commit is contained in:
bors 2024-09-13 09:44:28 +00:00
commit 4221354a8f

View file

@ -282,8 +282,11 @@ fn generate_impl(
ai.assoc_items() ai.assoc_items()
.filter(|item| matches!(item, AssocItem::MacroCall(_)).not()) .filter(|item| matches!(item, AssocItem::MacroCall(_)).not())
.for_each(|item| { .for_each(|item| {
let assoc = let assoc = process_assoc_item(
process_assoc_item(item, qualified_path_type.clone(), field_name); item.clone_for_update(),
qualified_path_type.clone(),
field_name,
);
if let Some(assoc) = assoc { if let Some(assoc) = assoc {
delegate_assoc_items.add_item(assoc); delegate_assoc_items.add_item(assoc);
} }
@ -1797,4 +1800,40 @@ impl T for B {
"#, "#,
); );
} }
#[test]
fn assoc_items_attributes_mutably_cloned() {
check_assist(
generate_delegate_trait,
r#"
pub struct A;
pub trait C<D> {
#[allow(clippy::dead_code)]
fn a_funk(&self) -> &D;
}
pub struct B<T: C<A>> {
has_dr$0ain: T,
}
"#,
r#"
pub struct A;
pub trait C<D> {
#[allow(clippy::dead_code)]
fn a_funk(&self) -> &D;
}
pub struct B<T: C<A>> {
has_drain: T,
}
impl<D, T: C<A>> C<D> for B<T> {
#[allow(clippy::dead_code)]
fn a_funk(&self) -> &D {
<T as C<D>>::a_funk(&self.has_drain)
}
}
"#,
)
}
} }