@@ -750,7 +750,7 @@ pub(crate) fn clean_generics<'tcx>(
750
750
751
751
fn clean_ty_generics < ' tcx > (
752
752
cx : & mut DocContext < ' tcx > ,
753
- generics : & ty:: Generics ,
753
+ generics : & ' tcx ty:: Generics ,
754
754
predicates : ty:: GenericPredicates < ' tcx > ,
755
755
_item_def_id : DefId ,
756
756
) -> Generics {
@@ -787,10 +787,46 @@ fn clean_ty_generics<'tcx>(
787
787
let mut impl_trait_proj =
788
788
FxHashMap :: < u32 , Vec < ( DefId , PathSegment , ty:: Binder < ' _ , ty:: Term < ' _ > > ) > > :: default ( ) ;
789
789
790
+ let item_span = {
791
+ if !predicates. predicates . is_empty ( ) {
792
+ let span = cx. tcx . def_span ( _item_def_id) ;
793
+ // FIXME: this is not correct if spans come from different expansions!
794
+ let params_sp = {
795
+ let mut params = generics. params . iter ( ) ;
796
+ if let Some ( param) = params. next ( ) {
797
+ let mut sp = cx. tcx . def_ident_span ( param. def_id ) . unwrap ( ) ;
798
+ while let Some ( param) = params. next ( ) {
799
+ sp = sp. to ( cx. tcx . def_ident_span ( param. def_id ) . unwrap ( ) ) ;
800
+ }
801
+ sp
802
+ } else {
803
+ None
804
+ }
805
+ } ;
806
+
807
+ Some ( span)
808
+ } else { None }
809
+ } ;
810
+
790
811
let where_predicates = predicates
791
812
. predicates
792
813
. iter ( )
793
- . flat_map ( |( pred, _) | {
814
+ . flat_map ( |( pred, span) | {
815
+ if !( span. is_dummy ( )
816
+ || span. is_empty ( )
817
+ || span. from_expansion ( )
818
+ || !cx. tcx . sess . source_map ( ) . is_span_accessible ( * span) )
819
+ {
820
+ let mut diag = cx. tcx . dcx ( ) . struct_span_warn ( * span, format ! ( "pred={pred:?}" ) ) ;
821
+
822
+ if let Some ( item_span) = item_span {
823
+ diag. span_note ( item_span, "span" ) ;
824
+ diag. note ( if item_span. contains ( * span) { "<...>" } else { "where ... " } ) ;
825
+ }
826
+
827
+ diag. emit ( ) ;
828
+ }
829
+
794
830
let mut projection = None ;
795
831
let param_idx = ( || {
796
832
let bound_p = pred. kind ( ) ;
0 commit comments