@@ -378,28 +378,14 @@ impl<'tcx> InferCtxt<'tcx> {
378378 /// in its defining scope.
379379 #[ instrument( skip( self ) , level = "trace" , ret) ]
380380 pub fn opaque_type_origin ( & self , def_id : LocalDefId ) -> Option < OpaqueTyOrigin > {
381- let opaque_hir_id = self . tcx . local_def_id_to_hir_id ( def_id) ;
382- let parent_def_id = match self . defining_use_anchor {
381+ let defined_opaque_types = match self . defining_use_anchor {
383382 DefiningAnchor :: Bubble | DefiningAnchor :: Error => return None ,
384383 DefiningAnchor :: Bind ( bind) => bind,
385384 } ;
386385
387386 let origin = self . tcx . opaque_type_origin ( def_id) ;
388- let in_definition_scope = match origin {
389- // Async `impl Trait`
390- hir:: OpaqueTyOrigin :: AsyncFn ( parent) => parent == parent_def_id,
391- // Anonymous `impl Trait`
392- hir:: OpaqueTyOrigin :: FnReturn ( parent) => parent == parent_def_id,
393- // Named `type Foo = impl Bar;`
394- hir:: OpaqueTyOrigin :: TyAlias { in_assoc_ty } => {
395- if in_assoc_ty {
396- self . tcx . opaque_types_defined_by ( parent_def_id) . contains ( & def_id)
397- } else {
398- may_define_opaque_type ( self . tcx , parent_def_id, opaque_hir_id)
399- }
400- }
401- } ;
402- in_definition_scope. then_some ( origin)
387+
388+ defined_opaque_types. contains ( & def_id) . then_some ( origin)
403389 }
404390}
405391
@@ -656,43 +642,3 @@ impl<'tcx> InferCtxt<'tcx> {
656642 }
657643 }
658644}
659-
660- /// Returns `true` if `opaque_hir_id` is a sibling or a child of a sibling of `def_id`.
661- ///
662- /// Example:
663- /// ```ignore UNSOLVED (is this a bug?)
664- /// # #![feature(type_alias_impl_trait)]
665- /// pub mod foo {
666- /// pub mod bar {
667- /// pub trait Bar { /* ... */ }
668- /// pub type Baz = impl Bar;
669- ///
670- /// # impl Bar for () {}
671- /// fn f1() -> Baz { /* ... */ }
672- /// }
673- /// fn f2() -> bar::Baz { /* ... */ }
674- /// }
675- /// ```
676- ///
677- /// Here, `def_id` is the `LocalDefId` of the defining use of the opaque type (e.g., `f1` or `f2`),
678- /// and `opaque_hir_id` is the `HirId` of the definition of the opaque type `Baz`.
679- /// For the above example, this function returns `true` for `f1` and `false` for `f2`.
680- fn may_define_opaque_type ( tcx : TyCtxt < ' _ > , def_id : LocalDefId , opaque_hir_id : hir:: HirId ) -> bool {
681- let mut hir_id = tcx. local_def_id_to_hir_id ( def_id) ;
682-
683- // Named opaque types can be defined by any siblings or children of siblings.
684- let scope = tcx. hir ( ) . get_defining_scope ( opaque_hir_id) ;
685- // We walk up the node tree until we hit the root or the scope of the opaque type.
686- while hir_id != scope && hir_id != hir:: CRATE_HIR_ID {
687- hir_id = tcx. hir ( ) . get_parent_item ( hir_id) . into ( ) ;
688- }
689- // Syntactically, we are allowed to define the concrete type if:
690- let res = hir_id == scope;
691- trace ! (
692- "may_define_opaque_type(def={:?}, opaque_node={:?}) = {}" ,
693- tcx. hir_node( hir_id) ,
694- tcx. hir_node( opaque_hir_id) ,
695- res
696- ) ;
697- res
698- }
0 commit comments