From 7ab38b80eb2b7f60a691b00534b6e7736f01c0e5 Mon Sep 17 00:00:00 2001 From: "Celina G. Val" Date: Tue, 19 Dec 2023 15:03:57 -0800 Subject: [PATCH] Add `ItemKind::Ctor` to stable mir --- compiler/rustc_smir/src/rustc_smir/mod.rs | 16 +++++++--------- compiler/stable_mir/src/lib.rs | 7 +++++++ tests/ui-fulldeps/stable-mir/check_item_kind.rs | 10 ++++++++-- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/compiler/rustc_smir/src/rustc_smir/mod.rs b/compiler/rustc_smir/src/rustc_smir/mod.rs index f434a1d63b89a..e1ee40c0b60ee 100644 --- a/compiler/rustc_smir/src/rustc_smir/mod.rs +++ b/compiler/rustc_smir/src/rustc_smir/mod.rs @@ -7,7 +7,7 @@ //! //! For now, we are developing everything inside `rustc`, thus, we keep this module private. -use rustc_hir::def::{CtorKind, DefKind}; +use rustc_hir::def::DefKind; use rustc_middle::mir; use rustc_middle::mir::interpret::AllocId; use rustc_middle::ty::{self, Instance, Ty, TyCtxt}; @@ -15,7 +15,7 @@ use rustc_span::def_id::{CrateNum, DefId, LOCAL_CRATE}; use stable_mir::abi::Layout; use stable_mir::mir::mono::InstanceDef; use stable_mir::ty::{ConstId, Span}; -use stable_mir::ItemKind; +use stable_mir::{CtorKind, ItemKind}; use std::ops::RangeInclusive; use tracing::debug; @@ -91,15 +91,13 @@ pub(crate) fn new_item_kind(kind: DefKind) -> ItemKind { | DefKind::GlobalAsm => { unreachable!("Not a valid item kind: {kind:?}"); } - DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure | DefKind::AssocFn | DefKind::Fn => { - ItemKind::Fn + DefKind::Closure | DefKind::AssocFn | DefKind::Fn => ItemKind::Fn, + DefKind::Const | DefKind::InlineConst | DefKind::AssocConst | DefKind::AnonConst => { + ItemKind::Const } - DefKind::Ctor(_, CtorKind::Const) - | DefKind::Const - | DefKind::InlineConst - | DefKind::AssocConst - | DefKind::AnonConst => ItemKind::Const, DefKind::Static(_) => ItemKind::Static, + DefKind::Ctor(_, rustc_hir::def::CtorKind::Const) => ItemKind::Ctor(CtorKind::Const), + DefKind::Ctor(_, rustc_hir::def::CtorKind::Fn) => ItemKind::Ctor(CtorKind::Fn), } } diff --git a/compiler/stable_mir/src/lib.rs b/compiler/stable_mir/src/lib.rs index 4941e54fe4b7e..9194f1e6bdb5e 100644 --- a/compiler/stable_mir/src/lib.rs +++ b/compiler/stable_mir/src/lib.rs @@ -91,6 +91,13 @@ pub enum ItemKind { Fn, Static, Const, + Ctor(CtorKind), +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash)] +pub enum CtorKind { + Const, + Fn, } pub type Filename = String; diff --git a/tests/ui-fulldeps/stable-mir/check_item_kind.rs b/tests/ui-fulldeps/stable-mir/check_item_kind.rs index 59614f1d417b5..72e0e09e6e363 100644 --- a/tests/ui-fulldeps/stable-mir/check_item_kind.rs +++ b/tests/ui-fulldeps/stable-mir/check_item_kind.rs @@ -29,12 +29,13 @@ const CRATE_NAME: &str = "input"; /// This function uses the Stable MIR APIs to get information about the test crate. fn test_item_kind(_tcx: TyCtxt<'_>) -> ControlFlow<()> { let items = stable_mir::all_local_items(); - assert_eq!(items.len(), 3); + assert_eq!(items.len(), 4); // Constructor item. for item in items { let expected_kind = match item.name().as_str() { - "Dummy" => ItemKind::Fn, + "Dummy" => ItemKind::Ctor(CtorKind::Fn), "dummy" => ItemKind::Fn, + "unit" => ItemKind::Fn, "DUMMY_CONST" => ItemKind::Const, name => unreachable!("Unexpected item {name}"), }; @@ -68,10 +69,15 @@ fn generate_input(path: &str) -> std::io::Result<()> { r#" pub struct Dummy(u32); pub const DUMMY_CONST: Dummy = Dummy(0); + pub struct DummyUnit; pub fn dummy() -> Dummy {{ Dummy(5) }} + + pub fn unit() -> DummyUnit {{ + DummyUnit + }} "# )?; Ok(())