mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Rollup merge of #118681 - celinval:fix-foreign-item, r=ouz-a
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`. I also added a method to check if the instance has body, since the function already existed and it just wasn't exposed via public APIs. This makes it much cheaper for the user to check if the instance has body. ## 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`. r? `@ouz-a`
This commit is contained in:
commit
3c1357ca6b
@ -187,9 +187,9 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
|
|||||||
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 @@ impl CrateItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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<()> {
|
||||||
|
@ -39,9 +39,16 @@ impl Instance {
|
|||||||
with(|context| context.instance_body(self.def))
|
with(|context| context.instance_body(self.def))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check whether this instance has a body available.
|
||||||
|
///
|
||||||
|
/// This call is much cheaper than `instance.body().is_some()`, since it doesn't try to build
|
||||||
|
/// the StableMIR body.
|
||||||
|
pub fn has_body(&self) -> bool {
|
||||||
|
with(|cx| cx.has_body(self.def.def_id()))
|
||||||
|
}
|
||||||
|
|
||||||
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.
|
||||||
|
@ -64,8 +64,12 @@ fn test_body(body: mir::Body) {
|
|||||||
let RigidTy::FnDef(def, args) = ty else { unreachable!() };
|
let RigidTy::FnDef(def, args) = ty else { unreachable!() };
|
||||||
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();
|
assert!(instance.has_body() || (mangled_name == "setpwent"), "Failed: {func:?}");
|
||||||
assert!(body.is_some() || mangled_name == "setpwent", "Failed: {func:?}");
|
assert!(instance.has_body() ^ instance.is_foreign_item());
|
||||||
|
if instance.has_body() {
|
||||||
|
let body = instance.body().unwrap();
|
||||||
|
assert!(!body.locals().is_empty(), "Body must at least have a return local");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Goto { .. } | Assert { .. } | SwitchInt { .. } | Return | Drop { .. } => {
|
Goto { .. } | Assert { .. } | SwitchInt { .. } | Return | Drop { .. } => {
|
||||||
/* Do nothing */
|
/* Do nothing */
|
||||||
|
Loading…
Reference in New Issue
Block a user