@@ -13,12 +13,13 @@ use rustc_middle::bug;
1313#[ expect( unused_imports, reason = "used by doc comments" ) ]
1414use rustc_middle:: dep_graph:: DepKindVTable ;
1515use rustc_middle:: dep_graph:: { DepKind , DepNode , DepNodeIndex , DepNodeKey , SerializedDepNodeIndex } ;
16+ use rustc_middle:: query:: erase:: { Erasable , Erased } ;
1617use rustc_middle:: query:: on_disk_cache:: {
1718 AbsoluteBytePos , CacheDecoder , CacheEncoder , EncodedDepNodeIndex ,
1819} ;
1920use rustc_middle:: query:: plumbing:: QueryVTable ;
2021use rustc_middle:: query:: {
21- Key , QueryCache , QueryJobId , QueryStackDeferred , QueryStackFrame , QueryStackFrameExtra ,
22+ Key , QueryCache , QueryJobId , QueryStackDeferred , QueryStackFrame , QueryStackFrameExtra , erase ,
2223} ;
2324use rustc_middle:: ty:: codec:: TyEncoder ;
2425use rustc_middle:: ty:: print:: with_reduced_queries;
@@ -27,7 +28,7 @@ use rustc_middle::ty::{self, TyCtxt};
2728use rustc_serialize:: { Decodable , Encodable } ;
2829use rustc_span:: def_id:: LOCAL_CRATE ;
2930
30- use crate :: QueryDispatcherUnerased ;
31+ use crate :: GetQueryVTable ;
3132use crate :: error:: { QueryOverflow , QueryOverflowNote } ;
3233use crate :: execution:: { all_inactive, force_query} ;
3334use crate :: job:: { QueryJobMap , find_dep_kind_root} ;
@@ -324,15 +325,16 @@ where
324325 QueryStackFrame :: new ( info, kind, def_id, def_id_for_ty_in_cycle)
325326}
326327
327- pub ( crate ) fn encode_query_results < ' a , ' tcx , Q , C : QueryCache > (
328- query : & ' tcx QueryVTable < ' tcx , C > ,
328+ pub ( crate ) fn encode_query_results_inner < ' a , ' tcx , Q , V > (
329329 tcx : TyCtxt < ' tcx > ,
330330 encoder : & mut CacheEncoder < ' a , ' tcx > ,
331331 query_result_index : & mut EncodedDepNodeIndex ,
332332) where
333- Q : QueryDispatcherUnerased < ' tcx , C > ,
334- Q :: UnerasedValue : Encodable < CacheEncoder < ' a , ' tcx > > ,
333+ Q : GetQueryVTable < ' tcx > ,
334+ Q :: Cache : QueryCache < Value = Erased < V > > ,
335+ V : Erasable + Encodable < CacheEncoder < ' a , ' tcx > > ,
335336{
337+ let query = Q :: query_vtable ( tcx) ;
336338 let _timer = tcx. prof . generic_activity_with_arg ( "encode_query_results_for" , query. name ) ;
337339
338340 assert ! ( all_inactive( query. query_state( tcx) ) ) ;
@@ -346,7 +348,7 @@ pub(crate) fn encode_query_results<'a, 'tcx, Q, C: QueryCache>(
346348
347349 // Encode the type check tables with the `SerializedDepNodeIndex`
348350 // as tag.
349- encoder. encode_tagged ( dep_node, & Q :: restore_val ( * value) ) ;
351+ encoder. encode_tagged ( dep_node, & erase :: restore_val :: < V > ( * value) ) ;
350352 }
351353 } ) ;
352354}
@@ -473,7 +475,6 @@ macro_rules! define_queries {
473475
474476 pub ( crate ) mod query_impl { $( pub ( crate ) mod $name {
475477 use super :: super :: * ;
476- use std:: marker:: PhantomData ;
477478 use :: rustc_middle:: query:: erase:: { self , Erased } ;
478479
479480 pub ( crate ) mod get_query_incr {
@@ -607,29 +608,16 @@ macro_rules! define_queries {
607608 }
608609 }
609610
610- #[ derive( Copy , Clone , Default ) ]
611- pub ( crate ) struct QueryType <' tcx> {
612- data: PhantomData <& ' tcx ( ) >
613- }
611+ /// Marker type that implements [`GetQueryVTable`] for this query.
612+ pub ( crate ) enum VTableGetter { }
614613
615- impl <' tcx> QueryDispatcherUnerased <' tcx, queries:: $name:: Storage <' tcx>>
616- for QueryType <' tcx>
617- {
618- type UnerasedValue = queries:: $name:: Value <' tcx>;
614+ impl <' tcx> GetQueryVTable <' tcx> for VTableGetter {
615+ type Cache = rustc_middle:: queries:: $name:: Storage <' tcx>;
619616
620617 #[ inline( always) ]
621- fn query_vtable( tcx: TyCtxt <' tcx>)
622- -> & ' tcx QueryVTable <' tcx, queries:: $name:: Storage <' tcx>>
623- {
618+ fn query_vtable( tcx: TyCtxt <' tcx>) -> & ' tcx QueryVTable <' tcx, Self :: Cache > {
624619 & tcx. query_system. query_vtables. $name
625620 }
626-
627- #[ inline( always) ]
628- fn restore_val( value: <queries:: $name:: Storage <' tcx> as QueryCache >:: Value )
629- -> Self :: UnerasedValue
630- {
631- erase:: restore_val:: <queries:: $name:: Value <' tcx>>( value)
632- }
633621 }
634622
635623 /// Internal per-query plumbing for collecting the set of active jobs for this query.
@@ -683,11 +671,8 @@ macro_rules! define_queries {
683671 encoder: & mut CacheEncoder <' _, ' tcx>,
684672 query_result_index: & mut EncodedDepNodeIndex
685673 ) {
686- $crate:: plumbing:: encode_query_results:: <
687- query_impl:: $name:: QueryType <' tcx>,
688- _
689- > (
690- & tcx. query_system. query_vtables. $name,
674+ use $crate:: query_impl:: $name:: VTableGetter ;
675+ $crate:: plumbing:: encode_query_results_inner:: <VTableGetter , _>(
691676 tcx,
692677 encoder,
693678 query_result_index,
@@ -773,8 +758,8 @@ macro_rules! define_queries {
773758 $(
774759 /// `DepKindVTable` constructor for this query.
775760 pub ( crate ) fn $name<' tcx>( ) -> DepKindVTable <' tcx> {
776- use $crate:: query_impl:: $name:: QueryType ;
777- make_dep_kind_vtable_for_query:: <QueryType < ' tcx> , _ >(
761+ use $crate:: query_impl:: $name:: VTableGetter ;
762+ make_dep_kind_vtable_for_query:: <VTableGetter >(
778763 is_anon!( [ $( $modifiers) * ] ) ,
779764 is_eval_always!( [ $( $modifiers) * ] ) ,
780765 )
0 commit comments