Delegation: fix ICE on duplicated associative items
This commit is contained in:
parent
6639672554
commit
b2ed9d0911
@ -373,6 +373,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
(trait_ref, lowered_ty)
|
||||
});
|
||||
|
||||
self.is_in_trait_impl = trait_ref.is_some();
|
||||
let new_impl_items = self
|
||||
.arena
|
||||
.alloc_from_iter(impl_items.iter().map(|item| self.lower_impl_item_ref(item)));
|
||||
@ -978,13 +979,6 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
}
|
||||
|
||||
fn lower_impl_item_ref(&mut self, i: &AssocItem) -> hir::ImplItemRef {
|
||||
let trait_item_def_id = self
|
||||
.resolver
|
||||
.get_partial_res(i.id)
|
||||
.map(|r| r.expect_full_res().opt_def_id())
|
||||
.unwrap_or(None);
|
||||
self.is_in_trait_impl = trait_item_def_id.is_some();
|
||||
|
||||
hir::ImplItemRef {
|
||||
id: hir::ImplItemId { owner_id: hir::OwnerId { def_id: self.local_def_id(i.id) } },
|
||||
ident: self.lower_ident(i.ident),
|
||||
@ -1000,7 +994,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
},
|
||||
AssocItemKind::MacCall(..) => unimplemented!(),
|
||||
},
|
||||
trait_item_def_id,
|
||||
trait_item_def_id: self
|
||||
.resolver
|
||||
.get_partial_res(i.id)
|
||||
.map(|r| r.expect_full_res().opt_def_id())
|
||||
.unwrap_or(None),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,23 @@
|
||||
#![feature(fn_delegation)]
|
||||
//~^ WARN the feature `fn_delegation` is incomplete
|
||||
|
||||
trait Trait {
|
||||
fn foo(&self) -> u32 { 0 }
|
||||
}
|
||||
|
||||
struct F;
|
||||
struct S;
|
||||
|
||||
mod to_reuse {
|
||||
use crate::S;
|
||||
|
||||
pub fn foo(_: &S) -> u32 { 0 }
|
||||
}
|
||||
|
||||
impl Trait for S {
|
||||
reuse to_reuse::foo { self }
|
||||
reuse Trait::foo;
|
||||
//~^ ERROR duplicate definitions with name `foo`
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,23 @@
|
||||
error[E0201]: duplicate definitions with name `foo`:
|
||||
--> $DIR/duplicate-definition-inside-trait-impl.rs:19:5
|
||||
|
|
||||
LL | fn foo(&self) -> u32 { 0 }
|
||||
| -------------------------- item in trait
|
||||
...
|
||||
LL | reuse to_reuse::foo { self }
|
||||
| ---------------------------- previous definition here
|
||||
LL | reuse Trait::foo;
|
||||
| ^^^^^^^^^^^^^^^^^ duplicate definition
|
||||
|
||||
warning: the feature `fn_delegation` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/duplicate-definition-inside-trait-impl.rs:1:12
|
||||
|
|
||||
LL | #![feature(fn_delegation)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #118212 <https://github.com/rust-lang/rust/issues/118212> for more information
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
error: aborting due to 1 previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0201`.
|
Loading…
x
Reference in New Issue
Block a user