Move Const from rustc_middle to rustc_type_ir - #162628
Jamesbarford wants to merge 5 commits into
Conversation
|
Some changes occurred to MIR optimizations cc @rust-lang/wg-mir-opt Some changes occurred in compiler/rustc_sanitizers cc @rcvalle Some changes occurred in match lowering cc @Nadrieril Some changes occurred in match checking cc @Nadrieril
cc @rust-lang/clippy Some changes occurred to the CTFE machinery Some changes occurred in cc @BoxyUwU Some changes occurred in exhaustiveness checking cc @Nadrieril changes to the core type system cc @lcnr Some changes occurred to the CTFE / Miri interpreter cc @rust-lang/miri HIR ty lowering was modified cc @fmease |
| // its pointee is valid for the entire lifetime of the target `TyCtxt`. | ||
| unsafe { mem::transmute(self) } | ||
| } | ||
| } |
There was a problem hiding this comment.
why do we need manual impls instead of the macro here again?
There was a problem hiding this comment.
nop_lift does;
assert!(tcx.interners.$set.contains_pointer_to(&InternedInSet(&*self.0.0)));Whereas we need;
assert!(tcx.interners.const_.contains_pointer_to(&InternedInSet(&*self.0)));There was a problem hiding this comment.
hmm, why does moving Const change this access pattern from .0.0 to just .0 🤔 that's not immediately obvious to me.
Please add that as a comment if it can't be avoided
There was a problem hiding this comment.
I'm not sure why;
nop_lift! { const_; Const<'a> => Const<'tcx> }Given the following definitions
// rustc_type_ir/src/sty/consts.rs
pub struct Const<I: Interner>(pub I::InternedConstKind);
// rustc_middle/rustc_middle/src/ty/context/impl_interner.rs
type InternedConstKind = Interned<'tcx, WithCachedTypeInfo<ty::ConstKind<'tcx>>>;
// rustc_middle/src/ty/consts.rs
pub type Const<'tcx> = ir::Const<TyCtxt<'tcx>>;Walking through how I think the above would work, which could be wrong, I'd have thought the following code snippet would be true;
pub type Const<'tcx> = struct Const<TyCtxt<'tcx>>(pub TyCtxt<'tcx>::InternedConst);
// which in turn becomes
pub type Const<'tcx> = struct Const<TyCtxt<'tcx>>(pub Interned<'tcx, WithCachedTypeInfo<ty::ConstKind<'tcx>>>);Which is the same as what we have before all be it the definition is composed from different modules and associated types. The rust-analyser LSP I have setup agrees with with me that my intuition is correct.
However I get a bunch of cascading errors. Of which this one seems the most likely culprit. So I did what the compiler error told me to do; implement Lift for WithCachedTypeInfo<...>.
error[E0277]: the trait bound `Interned<'tcx, _>: Lift<TyCtxt<'tcx>>` is not satisfied
--> compiler/rustc_middle/src/ty/context.rs:1894:54
|
1894 | struct InternedInSet<'tcx, T: ?Sized + PointeeSized>(&'tcx T);
| ^^^^^^^ unsatisfied trait bound
|
help: the trait `Lift<TyCtxt<'tcx>>` is not implemented for `Interned<'tcx, rustc_type_ir::WithCachedTypeInfo<rustc_type_ir::ConstKind<context::TyCtxt<'tcx>>>>`
but trait `Lift<TyCtxt<'_>>` is implemented for `Interned<'_, rustc_type_ir::RegionKind<context::TyCtxt<'_>>>`
--> compiler/rustc_middle/src/ty/context.rs:1721:1
There was a problem hiding this comment.
3b8480e adds the comment;
// `rustc_type_ir::Const<I>` is only the generic wrapper; lifting it delegates
// to `I::InternedConstKind`, so the concrete interned const representation
// must itself implement `Lift`.
It's interesting that when I expanded the macro rust-analyser was able to pick up self.0.0. This confused me probably more than it should have done.
There was a problem hiding this comment.
hmm, confusing. Can you change this to a "FIXME: unclear why exactly the macro doesn't work"?
|
|
||
| // Things stored inside of tys | ||
| type ErrorGuaranteed: Copy + Debug + Hash + Eq; | ||
| type ErrorGuaranteed: Copy + Debug + Hash + Eq + TypeVisitable<Self>; |
There was a problem hiding this comment.
instead mark with type_visitable(ignored) 🤔
There was a problem hiding this comment.
I was able to completely get rid of it
There was a problem hiding this comment.
why does this bound then exist
There was a problem hiding this comment.
I think I was wrong, I've detailed it here; #162628 (comment), but will also comment in the code
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
cc @bjorn3
|
63b89a3 to
0e986ed
Compare
This comment has been minimized.
This comment has been minimized.
0e986ed to
cd5d852
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
c843bc1 to
ae129f3
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
ae129f3 to
8a720e3
Compare
This comment has been minimized.
This comment has been minimized.
8a720e3 to
4be24bc
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
3b8480e to
d482705
Compare
|
So from one of the rebases I've done, I was getting a lot of failing UI tests (narrowed to one error I've pasted in below). Tracing the error to the changes, the only implementation changes were in the implementation of
Putting the implementation back for |
This comment has been minimized.
This comment has been minimized.
1fc8d5e to
0c1d173
Compare
|
This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
3549cb8 to
eb64306
Compare
| type Consts: Copy + Debug + Hash + Eq + SliceLike<Item = Const<Self>> + Default; | ||
| type ParamConst: Copy + Debug + Hash + Eq + ParamLike; | ||
| type ValueConst: ValueConst<Self>; | ||
| type ValueConst: ValueConst<Self> + TypeFoldable<Self> + Display; |
There was a problem hiding this comment.
and this bound, instead of a type_visible(skip)
There was a problem hiding this comment.
I'm not sure I follow here?
The type needs to be foldable so we can implement TypeSuperFoldable<I> for Const<I>, which is done manually. I've grepped the codebase and can't find type_visible, is this a new thing that I should add?
If I remove TypeFoldable<Self> declaring the type as;
type ValueConst: ValueConst<Self> + Display;And remove the branch in the code for folding ValueConst I get an error (below). Maybe there's something I'm missing?
error: internal compiler error: compiler/rustc_borrowck/src/universal_regions.rs:970:36: cannot convert `'{erased}` to a region vid
thread 'rustc' (280854) panicked at compiler/rustc_borrowck/src/universal_regions.rs:970:36:
cannot convert `'{erased}` to a region vid
stack backtrace:
0: __rustc::rust_begin_unwind
1: core::panicking::panic_fmt
2: rustc_span::macros::bug_impl
3: rustc_borrowck::universal_regions::UniversalRegionIndices::to_region_vid::{{closure}}
4: rustc_borrowck::universal_regions::UniversalRegions::to_region_vid
5: <rustc_borrowck::type_check::relate_tys::NllTypeRelating as rustc_type_ir::relate::TypeRelation<rustc_middle::ty::context::TyCtxt>>::regions
6: rustc_type_ir::relate::structurally_relate_tys
7: rustc_type_ir::relate::combine::super_combine_tys
8: <rustc_borrowck::type_check::relate_tys::NllTypeRelating as rustc_type_ir::relate::TypeRelation<rustc_middle::ty::context::TyCtxt>>::tys
9: rustc_borrowck::type_check::relate_tys::<impl rustc_borrowck::type_check::TypeChecker>::relate_types
10: <rustc_borrowck::type_check::TypeChecker as rustc_middle::mir::visit::Visitor>::visit_terminator
11: <rustc_borrowck::type_check::TypeChecker as rustc_middle::mir::visit::Visitor>::visit_body
12: rustc_borrowck::type_check::type_check
13: rustc_borrowck::borrowck_collect_region_constraints
14: rustc_borrowck::root_cx::BorrowCheckRootCtxt::do_mir_borrowck
15: rustc_borrowck::mir_borrowck
[... omitted 2 frames ...]
16: rustc_middle::query::calls::query_ensure_ok
17: rustc_middle::hir::map::<impl rustc_middle::ty::context::TyCtxt>::par_hir_body_owners::{{closure}}
18: rustc_data_structures::sync::parallel::par_for_each_in
19: rustc_session::utils::<impl rustc_session::session::Session>::time
20: rustc_interface::passes::analysis
[... omitted 2 frames ...]
21: std::thread::local::LocalKey<T>::with
22: rustc_middle::ty::context::TyCtxt::create_global_ctxt
23: rustc_interface::passes::create_and_enter_global_ctxt
24: scoped_tls::ScopedKey<T>::set
25: rustc_span::create_session_globals_then
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
error: the compiler unexpectedly panicked. This is a bug
note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md
note: please make sure that you have updated to the latest nightly
note: please attach the file at `/data_nvme1n1/Documents/aux/rust/rustc-ice-2026-09-17T13_20_45-280839.txt` to your bug report
note: rustc 1.100.0-dev running on x86_64-unknown-linux-gnu
note: compiler flags: --crate-type lib -Z embed-metadata=no -C opt-level=3 -C embed-bitcode=no -C codegen-units=1 -C embed-bitcode=yes -Z unstable-options -C force-frame-pointers=non-leaf -C debug-assertions=on -C overflow-checks=off -C symbol-mangling-version=legacy -Z annotate-moves -Z unstable-options -Z macro-backtrace -C split-debuginfo=off -C force-frame-pointers=true -C prefer-dynamic -C llvm-args=-import-instr-limit=10 -Z inline-mir -Z inline-mir-preserve-debug -Z mir_strip_debuginfo=locals-in-tiny-functions -C link-args=-Wl,-z,origin -C link-args=-Wl,-rpath,$ORIGIN/../lib -C lto=off -Z crate-attr=doc(html_root_url="https://doc.rust-lang.org/nightly/") -Z binary-dep-depinfo -Z force-unstable-if-unmarked
note: some of the compiler flags provided by cargo are hidden
query stack during panic:
#0 [mir_borrowck] borrow-checking `str::traits::<impl at library/core/src/str/traits.rs:897:1: 897:22>::from_str`
#1 [analysis] running analysis passes on crate `core`
end of query stack
error: could not compile `core` (lib)
View all comments
Split by commit;
I::Const->Const<I>ConstExtin all places that require the extension trait methods in compilerConstExtin all places that require the extension trait methods in clippyr? @lcnr