@@ -626,24 +626,22 @@ pub(super) fn check_opaque_for_cycles<'tcx>(
626
626
///
627
627
/// Without this check the above code is incorrectly accepted: we would ICE if
628
628
/// some tried, for example, to clone an `Option<X<&mut ()>>`.
629
+ #[ instrument( level = "debug" , skip( tcx) ) ]
629
630
fn check_opaque_meets_bounds < ' tcx > (
630
631
tcx : TyCtxt < ' tcx > ,
631
632
def_id : LocalDefId ,
632
633
substs : SubstsRef < ' tcx > ,
633
634
span : Span ,
634
635
origin : & hir:: OpaqueTyOrigin ,
635
636
) {
636
- match origin {
637
- // Checked when type checking the function containing them.
638
- hir:: OpaqueTyOrigin :: FnReturn ( ..) | hir:: OpaqueTyOrigin :: AsyncFn ( ..) => return ,
639
- // Can have different predicates to their defining use
640
- hir:: OpaqueTyOrigin :: TyAlias => { }
641
- }
642
-
643
637
let hir_id = tcx. hir ( ) . local_def_id_to_hir_id ( def_id) ;
644
- let param_env = tcx. param_env ( def_id) ;
638
+ let defining_use_anchor = match * origin {
639
+ hir:: OpaqueTyOrigin :: FnReturn ( did) | hir:: OpaqueTyOrigin :: AsyncFn ( did) => did,
640
+ hir:: OpaqueTyOrigin :: TyAlias => def_id,
641
+ } ;
642
+ let param_env = tcx. param_env ( defining_use_anchor) ;
645
643
646
- tcx. infer_ctxt ( ) . enter ( move |infcx| {
644
+ tcx. infer_ctxt ( ) . with_opaque_type_inference ( defining_use_anchor ) . enter ( move |infcx| {
647
645
let inh = Inherited :: new ( infcx, def_id) ;
648
646
let infcx = & inh. infcx ;
649
647
let opaque_ty = tcx. mk_opaque ( def_id. to_def_id ( ) , substs) ;
@@ -656,16 +654,15 @@ fn check_opaque_meets_bounds<'tcx>(
656
654
657
655
let opaque_type_map = infcx. inner . borrow ( ) . opaque_types . clone ( ) ;
658
656
for ( OpaqueTypeKey { def_id, substs } , opaque_defn) in opaque_type_map {
659
- match infcx
660
- . at ( & misc_cause, param_env)
661
- . eq ( opaque_defn. concrete_ty , tcx. type_of ( def_id) . subst ( tcx, substs) )
662
- {
657
+ let hidden_type = tcx. type_of ( def_id) . subst ( tcx, substs) ;
658
+ trace ! ( ?hidden_type) ;
659
+ match infcx. at ( & misc_cause, param_env) . eq ( opaque_defn. concrete_ty , hidden_type) {
663
660
Ok ( infer_ok) => inh. register_infer_ok_obligations ( infer_ok) ,
664
661
Err ( ty_err) => tcx. sess . delay_span_bug (
665
- opaque_defn . definition_span ,
662
+ span ,
666
663
& format ! (
667
- "could not unify `{}` with revealed type:\n {}" ,
668
- opaque_defn . concrete_ty , ty_err,
664
+ "could not check bounds on revealed type `{}` :\n {}" ,
665
+ hidden_type , ty_err,
669
666
) ,
670
667
) ,
671
668
}
@@ -678,10 +675,17 @@ fn check_opaque_meets_bounds<'tcx>(
678
675
infcx. report_fulfillment_errors ( & errors, None , false ) ;
679
676
}
680
677
681
- // Finally, resolve all regions. This catches wily misuses of
682
- // lifetime parameters.
683
- let fcx = FnCtxt :: new ( & inh, param_env, hir_id) ;
684
- fcx. regionck_item ( hir_id, span, FxHashSet :: default ( ) ) ;
678
+ match origin {
679
+ // Checked when type checking the function containing them.
680
+ hir:: OpaqueTyOrigin :: FnReturn ( ..) | hir:: OpaqueTyOrigin :: AsyncFn ( ..) => return ,
681
+ // Can have different predicates to their defining use
682
+ hir:: OpaqueTyOrigin :: TyAlias => {
683
+ // Finally, resolve all regions. This catches wily misuses of
684
+ // lifetime parameters.
685
+ let fcx = FnCtxt :: new ( & inh, param_env, hir_id) ;
686
+ fcx. regionck_item ( hir_id, span, FxHashSet :: default ( ) ) ;
687
+ }
688
+ }
685
689
} ) ;
686
690
}
687
691
0 commit comments