@@ -675,36 +675,57 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
675675 )
676676 }
677677
678- fn instantiate_poly_trait_ref_inner (
678+ /// Given a trait bound like `Debug`, applies that trait bound the given self-type to construct
679+ /// a full trait reference. The resulting trait reference is returned. This may also generate
680+ /// auxiliary bounds, which are added to `bounds`.
681+ ///
682+ /// Example:
683+ ///
684+ /// ```ignore (illustrative)
685+ /// poly_trait_ref = Iterator<Item = u32>
686+ /// self_ty = Foo
687+ /// ```
688+ ///
689+ /// this would return `Foo: Iterator` and add `<Foo as Iterator>::Item = u32` into `bounds`.
690+ ///
691+ /// **A note on binders:** against our usual convention, there is an implied binder around
692+ /// the `self_ty` and `poly_trait_ref` parameters here. So they may reference bound regions.
693+ /// If for example you had `for<'a> Foo<'a>: Bar<'a>`, then the `self_ty` would be `Foo<'a>`
694+ /// where `'a` is a bound region at depth 0. Similarly, the `poly_trait_ref` would be
695+ /// `Bar<'a>`. The returned poly-trait-ref will have this binder instantiated explicitly,
696+ /// however.
697+ #[ instrument( level = "debug" , skip( self , span, constness, bounds, speculative) ) ]
698+ pub ( crate ) fn instantiate_poly_trait_ref (
679699 & self ,
680- hir_id : hir:: HirId ,
700+ trait_ref : & hir:: TraitRef < ' _ > ,
681701 span : Span ,
682- binding_span : Option < Span > ,
683702 constness : ty:: BoundConstness ,
684703 polarity : ty:: ImplPolarity ,
704+ self_ty : Ty < ' tcx > ,
685705 bounds : & mut Bounds < ' tcx > ,
686706 speculative : bool ,
687- trait_ref_span : Span ,
688- trait_def_id : DefId ,
689- trait_segment : & hir:: PathSegment < ' _ > ,
690- args : & GenericArgs < ' _ > ,
691- infer_args : bool ,
692- self_ty : Ty < ' tcx > ,
693707 only_self_bounds : OnlySelfBounds ,
694708 ) -> GenericArgCountResult {
709+ let trait_def_id = trait_ref. trait_def_id ( ) . unwrap_or_else ( || FatalError . raise ( ) ) ;
710+ let trait_segment = trait_ref. path . segments . last ( ) . unwrap ( ) ;
711+ let args = trait_segment. args ( ) ;
712+
713+ self . prohibit_generics ( trait_ref. path . segments . split_last ( ) . unwrap ( ) . 1 . iter ( ) , |_| { } ) ;
714+ self . complain_about_internal_fn_trait ( span, trait_def_id, trait_segment, false ) ;
715+
695716 let ( generic_args, arg_count) = self . create_args_for_ast_path (
696- trait_ref_span ,
717+ trait_ref . path . span ,
697718 trait_def_id,
698719 & [ ] ,
699720 trait_segment,
700721 args,
701- infer_args,
722+ trait_segment . infer_args ,
702723 Some ( self_ty) ,
703724 constness,
704725 ) ;
705726
706727 let tcx = self . tcx ( ) ;
707- let bound_vars = tcx. late_bound_vars ( hir_id ) ;
728+ let bound_vars = tcx. late_bound_vars ( trait_ref . hir_ref_id ) ;
708729 debug ! ( ?bound_vars) ;
709730
710731 let assoc_bindings = self . create_assoc_bindings_for_generic_args ( args) ;
@@ -732,13 +753,13 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
732753
733754 // Specify type to assert that error was already reported in `Err` case.
734755 let _: Result < _ , ErrorGuaranteed > = self . add_predicates_for_ast_type_binding (
735- hir_id ,
756+ trait_ref . hir_ref_id ,
736757 poly_trait_ref,
737758 binding,
738759 bounds,
739760 speculative,
740761 & mut dup_bindings,
741- binding_span . unwrap_or ( binding. span ) ,
762+ binding. span ,
742763 constness,
743764 only_self_bounds,
744765 polarity,
@@ -749,67 +770,6 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
749770 arg_count
750771 }
751772
752- /// Given a trait bound like `Debug`, applies that trait bound the given self-type to construct
753- /// a full trait reference. The resulting trait reference is returned. This may also generate
754- /// auxiliary bounds, which are added to `bounds`.
755- ///
756- /// Example:
757- ///
758- /// ```ignore (illustrative)
759- /// poly_trait_ref = Iterator<Item = u32>
760- /// self_ty = Foo
761- /// ```
762- ///
763- /// this would return `Foo: Iterator` and add `<Foo as Iterator>::Item = u32` into `bounds`.
764- ///
765- /// **A note on binders:** against our usual convention, there is an implied bounder around
766- /// the `self_ty` and `poly_trait_ref` parameters here. So they may reference bound regions.
767- /// If for example you had `for<'a> Foo<'a>: Bar<'a>`, then the `self_ty` would be `Foo<'a>`
768- /// where `'a` is a bound region at depth 0. Similarly, the `poly_trait_ref` would be
769- /// `Bar<'a>`. The returned poly-trait-ref will have this binder instantiated explicitly,
770- /// however.
771- #[ instrument( level = "debug" , skip( self , span, constness, bounds, speculative) ) ]
772- pub ( crate ) fn instantiate_poly_trait_ref (
773- & self ,
774- trait_ref : & hir:: TraitRef < ' _ > ,
775- span : Span ,
776- constness : ty:: BoundConstness ,
777- polarity : ty:: ImplPolarity ,
778- self_ty : Ty < ' tcx > ,
779- bounds : & mut Bounds < ' tcx > ,
780- speculative : bool ,
781- only_self_bounds : OnlySelfBounds ,
782- ) -> GenericArgCountResult {
783- let hir_id = trait_ref. hir_ref_id ;
784- let binding_span = None ;
785- let trait_ref_span = trait_ref. path . span ;
786- let trait_def_id = trait_ref. trait_def_id ( ) . unwrap_or_else ( || FatalError . raise ( ) ) ;
787- let trait_segment = trait_ref. path . segments . last ( ) . unwrap ( ) ;
788- let args = trait_segment. args ( ) ;
789- let infer_args = trait_segment. infer_args ;
790-
791- self . prohibit_generics ( trait_ref. path . segments . split_last ( ) . unwrap ( ) . 1 . iter ( ) , |_| { } ) ;
792- self . complain_about_internal_fn_trait ( span, trait_def_id, trait_segment, false ) ;
793-
794- // TODO: inline
795- self . instantiate_poly_trait_ref_inner (
796- hir_id,
797- span,
798- binding_span,
799- constness,
800- polarity,
801- bounds,
802- speculative,
803- trait_ref_span,
804- trait_def_id,
805- trait_segment,
806- args,
807- infer_args,
808- self_ty,
809- only_self_bounds,
810- )
811- }
812-
813773 fn ast_path_to_mono_trait_ref (
814774 & self ,
815775 span : Span ,
0 commit comments