Fix is_foreign_item
for StableMIR instance
Change the implementation of `Instance::is_foreign_item` to directly query the compiler for the instance `def_id` instead of incorrectly relying on the conversion to `CrateItem`. Background: - In pull https://github.com/rust-lang/rust/pull/118524, I fixed the conversion from Instance to CrateItem to avoid the conversion if the instance didn't have a body available. This broke the `is_foreign_item`.
This commit is contained in:
parent
f32d29837d
commit
1bcd162465
@ -187,9 +187,9 @@ fn item_kind(&self, item: CrateItem) -> ItemKind {
|
|||||||
new_item_kind(tables.tcx.def_kind(tables[item.0]))
|
new_item_kind(tables.tcx.def_kind(tables[item.0]))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_foreign_item(&self, item: CrateItem) -> bool {
|
fn is_foreign_item(&self, item: DefId) -> bool {
|
||||||
let tables = self.0.borrow();
|
let tables = self.0.borrow();
|
||||||
tables.tcx.is_foreign_item(tables[item.0])
|
tables.tcx.is_foreign_item(tables[item])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn adt_kind(&self, def: AdtDef) -> AdtKind {
|
fn adt_kind(&self, def: AdtDef) -> AdtKind {
|
||||||
|
@ -60,7 +60,7 @@ pub trait Context {
|
|||||||
fn item_kind(&self, item: CrateItem) -> ItemKind;
|
fn item_kind(&self, item: CrateItem) -> ItemKind;
|
||||||
|
|
||||||
/// Returns whether this is a foreign item.
|
/// Returns whether this is a foreign item.
|
||||||
fn is_foreign_item(&self, item: CrateItem) -> bool;
|
fn is_foreign_item(&self, item: DefId) -> bool;
|
||||||
|
|
||||||
/// Returns the kind of a given algebraic data type
|
/// Returns the kind of a given algebraic data type
|
||||||
fn adt_kind(&self, def: AdtDef) -> AdtKind;
|
fn adt_kind(&self, def: AdtDef) -> AdtKind;
|
||||||
|
@ -120,7 +120,7 @@ pub fn ty(&self) -> Ty {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_foreign_item(&self) -> bool {
|
pub fn is_foreign_item(&self) -> bool {
|
||||||
with(|cx| cx.is_foreign_item(*self))
|
with(|cx| cx.is_foreign_item(self.0))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dump<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
|
pub fn dump<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
|
||||||
|
@ -40,8 +40,7 @@ pub fn body(&self) -> Option<Body> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_foreign_item(&self) -> bool {
|
pub fn is_foreign_item(&self) -> bool {
|
||||||
let item = CrateItem::try_from(*self);
|
with(|cx| cx.is_foreign_item(self.def.def_id()))
|
||||||
item.as_ref().is_ok_and(CrateItem::is_foreign_item)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the instance type with generic substitutions applied and lifetimes erased.
|
/// Get the instance type with generic substitutions applied and lifetimes erased.
|
||||||
|
@ -65,7 +65,8 @@ fn test_body(body: mir::Body) {
|
|||||||
let instance = Instance::resolve(def, &args).unwrap();
|
let instance = Instance::resolve(def, &args).unwrap();
|
||||||
let mangled_name = instance.mangled_name();
|
let mangled_name = instance.mangled_name();
|
||||||
let body = instance.body();
|
let body = instance.body();
|
||||||
assert!(body.is_some() || mangled_name == "setpwent", "Failed: {func:?}");
|
assert!(body.is_some() || (mangled_name == "setpwent"), "Failed: {func:?}");
|
||||||
|
assert!(body.is_some() ^ instance.is_foreign_item());
|
||||||
}
|
}
|
||||||
Goto { .. } | Assert { .. } | SwitchInt { .. } | Return | Drop { .. } => {
|
Goto { .. } | Assert { .. } | SwitchInt { .. } | Return | Drop { .. } => {
|
||||||
/* Do nothing */
|
/* Do nothing */
|
||||||
|
Loading…
Reference in New Issue
Block a user