@@ -34,7 +34,7 @@ use rustc_middle::infer::unify_key::{ConstVariableOrigin, ConstVariableOriginKin
34
34
use rustc_middle:: infer:: unify_key:: { ConstVidKey , EffectVidKey } ;
35
35
use rustc_middle:: mir:: interpret:: { ErrorHandled , EvalToValTreeResult } ;
36
36
use rustc_middle:: mir:: ConstraintCategory ;
37
- use rustc_middle:: traits:: { select, DefiningAnchor } ;
37
+ use rustc_middle:: traits:: select;
38
38
use rustc_middle:: ty:: error:: { ExpectedFound , TypeError } ;
39
39
use rustc_middle:: ty:: fold:: BoundVarReplacerDelegate ;
40
40
use rustc_middle:: ty:: fold:: { TypeFoldable , TypeFolder , TypeSuperFoldable } ;
@@ -243,18 +243,8 @@ impl<'tcx> InferCtxtInner<'tcx> {
243
243
pub struct InferCtxt < ' tcx > {
244
244
pub tcx : TyCtxt < ' tcx > ,
245
245
246
- /// The `DefId` of the item in whose context we are performing inference or typeck.
247
- /// It is used to check whether an opaque type use is a defining use.
248
- ///
249
- /// If it is `DefiningAnchor::Bubble`, we can't resolve opaque types here and need to bubble up
250
- /// the obligation. This frequently happens for
251
- /// short lived InferCtxt within queries. The opaque type obligations are forwarded
252
- /// to the outside until the end up in an `InferCtxt` for typeck or borrowck.
253
- ///
254
- /// Its default value is `DefiningAnchor::Bind(&[])`, which means no opaque types may be defined.
255
- /// This way it is easier to catch errors that
256
- /// might come up during inference or typeck.
257
- pub defining_use_anchor : DefiningAnchor < ' tcx > ,
246
+ /// The `DefIds` of the opaque types that may have their hidden types constrained.
247
+ defining_opaque_types : & ' tcx ty:: List < LocalDefId > ,
258
248
259
249
/// Whether this inference context should care about region obligations in
260
250
/// the root universe. Most notably, this is used during hir typeck as region
@@ -401,6 +391,10 @@ impl<'tcx> ty::InferCtxtLike for InferCtxt<'tcx> {
401
391
fn probe_ct_var ( & self , vid : ConstVid ) -> Option < ty:: Const < ' tcx > > {
402
392
self . probe_const_var ( vid) . ok ( )
403
393
}
394
+
395
+ fn defining_opaque_types ( & self ) -> & ' tcx ty:: List < LocalDefId > {
396
+ self . defining_opaque_types
397
+ }
404
398
}
405
399
406
400
/// See the `error_reporting` module for more details.
@@ -615,7 +609,7 @@ impl fmt::Display for FixupError {
615
609
/// Used to configure inference contexts before their creation.
616
610
pub struct InferCtxtBuilder < ' tcx > {
617
611
tcx : TyCtxt < ' tcx > ,
618
- defining_use_anchor : DefiningAnchor < ' tcx > ,
612
+ defining_opaque_types : & ' tcx ty :: List < LocalDefId > ,
619
613
considering_regions : bool ,
620
614
skip_leak_check : bool ,
621
615
/// Whether we are in coherence mode.
@@ -630,7 +624,7 @@ impl<'tcx> TyCtxt<'tcx> {
630
624
fn infer_ctxt ( self ) -> InferCtxtBuilder < ' tcx > {
631
625
InferCtxtBuilder {
632
626
tcx : self ,
633
- defining_use_anchor : DefiningAnchor :: Bind ( ty:: List :: empty ( ) ) ,
627
+ defining_opaque_types : ty:: List :: empty ( ) ,
634
628
considering_regions : true ,
635
629
skip_leak_check : false ,
636
630
intercrate : false ,
@@ -646,8 +640,16 @@ impl<'tcx> InferCtxtBuilder<'tcx> {
646
640
/// It is only meant to be called in two places, for typeck
647
641
/// (via `Inherited::build`) and for the inference context used
648
642
/// in mir borrowck.
649
- pub fn with_opaque_type_inference ( mut self , defining_use_anchor : DefiningAnchor < ' tcx > ) -> Self {
650
- self . defining_use_anchor = defining_use_anchor;
643
+ pub fn with_opaque_type_inference ( mut self , defining_anchor : LocalDefId ) -> Self {
644
+ self . defining_opaque_types = self . tcx . opaque_types_defined_by ( defining_anchor) ;
645
+ self
646
+ }
647
+
648
+ pub fn with_defining_opaque_types (
649
+ mut self ,
650
+ defining_opaque_types : & ' tcx ty:: List < LocalDefId > ,
651
+ ) -> Self {
652
+ self . defining_opaque_types = defining_opaque_types;
651
653
self
652
654
}
653
655
@@ -679,30 +681,30 @@ impl<'tcx> InferCtxtBuilder<'tcx> {
679
681
/// the bound values in `C` to their instantiated values in `V`
680
682
/// (in other words, `S(C) = V`).
681
683
pub fn build_with_canonical < T > (
682
- & mut self ,
684
+ self ,
683
685
span : Span ,
684
686
canonical : & Canonical < ' tcx , T > ,
685
687
) -> ( InferCtxt < ' tcx > , T , CanonicalVarValues < ' tcx > )
686
688
where
687
689
T : TypeFoldable < TyCtxt < ' tcx > > ,
688
690
{
689
- let infcx = self . build ( ) ;
691
+ let infcx = self . with_defining_opaque_types ( canonical . defining_opaque_types ) . build ( ) ;
690
692
let ( value, args) = infcx. instantiate_canonical ( span, canonical) ;
691
693
( infcx, value, args)
692
694
}
693
695
694
696
pub fn build ( & mut self ) -> InferCtxt < ' tcx > {
695
697
let InferCtxtBuilder {
696
698
tcx,
697
- defining_use_anchor ,
699
+ defining_opaque_types ,
698
700
considering_regions,
699
701
skip_leak_check,
700
702
intercrate,
701
703
next_trait_solver,
702
704
} = * self ;
703
705
InferCtxt {
704
706
tcx,
705
- defining_use_anchor ,
707
+ defining_opaque_types ,
706
708
considering_regions,
707
709
skip_leak_check,
708
710
inner : RefCell :: new ( InferCtxtInner :: new ( ) ) ,
@@ -1230,6 +1232,12 @@ impl<'tcx> InferCtxt<'tcx> {
1230
1232
self . inner . borrow ( ) . opaque_type_storage . opaque_types . clone ( )
1231
1233
}
1232
1234
1235
+ #[ inline( always) ]
1236
+ pub fn can_define_opaque_ty ( & self , id : impl Into < DefId > ) -> bool {
1237
+ let Some ( id) = id. into ( ) . as_local ( ) else { return false } ;
1238
+ self . defining_opaque_types . contains ( & id)
1239
+ }
1240
+
1233
1241
pub fn ty_to_string ( & self , t : Ty < ' tcx > ) -> String {
1234
1242
self . resolve_vars_if_possible ( t) . to_string ( )
1235
1243
}
0 commit comments