@@ -8,7 +8,7 @@ use rustc_hir as hir;
88use rustc_hir:: def:: DefKind ;
99use rustc_hir:: def_id:: { DefId , LocalDefId } ;
1010use rustc_hir:: intravisit:: { self , Visitor } ;
11- use rustc_middle:: ty:: { self , Ty , TyCtxt } ;
11+ use rustc_middle:: ty:: { self , Ty , TyCtxt , TypeVisitableExt } ;
1212use rustc_middle:: ty:: { GenericPredicates , ImplTraitInTraitData , Upcast } ;
1313use rustc_middle:: { bug, span_bug} ;
1414use rustc_span:: symbol:: Ident ;
@@ -86,6 +86,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
8686 parent : Some ( tcx. parent ( def_id. to_def_id ( ) ) ) ,
8787 predicates : tcx. arena . alloc_from_iter ( predicates) ,
8888 effects_min_tys : ty:: List :: empty ( ) ,
89+ errored_due_to_unconstrained_params : Ok ( ( ) ) ,
8990 } ;
9091 }
9192
@@ -108,6 +109,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
108109 parent : Some ( impl_def_id) ,
109110 predicates : tcx. arena . alloc_from_iter ( impl_predicates) ,
110111 effects_min_tys : ty:: List :: empty ( ) ,
112+ errored_due_to_unconstrained_params : trait_assoc_predicates
113+ . errored_due_to_unconstrained_params ,
111114 } ;
112115 }
113116
@@ -128,6 +131,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
128131 // Preserving the order of insertion is important here so as not to break UI tests.
129132 let mut predicates: FxIndexSet < ( ty:: Clause < ' _ > , Span ) > = FxIndexSet :: default ( ) ;
130133 let mut effects_min_tys = Vec :: new ( ) ;
134+ let mut errored_due_to_unconstrained_params = Ok ( ( ) ) ;
131135
132136 let hir_generics = node. generics ( ) . unwrap_or ( NO_GENERICS ) ;
133137 if let Node :: Item ( item) = node {
@@ -291,11 +295,16 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
291295 if let Node :: Item ( & Item { kind : ItemKind :: Impl { .. } , .. } ) = node {
292296 let self_ty = tcx. type_of ( def_id) . instantiate_identity ( ) ;
293297 let trait_ref = tcx. impl_trait_ref ( def_id) . map ( ty:: EarlyBinder :: instantiate_identity) ;
294- cgp:: setup_constraining_predicates (
295- tcx,
296- & mut predicates,
297- trait_ref,
298- & mut cgp:: parameters_for_impl ( tcx, self_ty, trait_ref) ,
298+ let mut input_parameters = cgp:: parameters_for_impl ( tcx, self_ty, trait_ref) ;
299+ cgp:: setup_constraining_predicates ( tcx, & mut predicates, trait_ref, & mut input_parameters) ;
300+ errored_due_to_unconstrained_params = errored_due_to_unconstrained_params. and (
301+ self_ty. error_reported ( ) . and ( trait_ref. error_reported ( ) ) . and_then ( |( ) | {
302+ crate :: impl_wf_check:: enforce_impl_params_are_constrained (
303+ tcx,
304+ def_id,
305+ input_parameters,
306+ )
307+ } ) ,
299308 ) ;
300309 }
301310
@@ -338,6 +347,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
338347 parent : generics. parent ,
339348 predicates : tcx. arena . alloc_from_iter ( predicates) ,
340349 effects_min_tys : tcx. mk_type_list ( & effects_min_tys) ,
350+ errored_due_to_unconstrained_params,
341351 }
342352}
343353
@@ -489,6 +499,8 @@ pub(super) fn explicit_predicates_of<'tcx>(
489499 parent : predicates_and_bounds. parent ,
490500 predicates : tcx. arena . alloc_slice ( & predicates) ,
491501 effects_min_tys : predicates_and_bounds. effects_min_tys ,
502+ errored_due_to_unconstrained_params : predicates_and_bounds
503+ . errored_due_to_unconstrained_params ,
492504 }
493505 }
494506 } else {
@@ -541,6 +553,8 @@ pub(super) fn explicit_predicates_of<'tcx>(
541553 parent : parent_preds. parent ,
542554 predicates : { tcx. arena . alloc_from_iter ( filtered_predicates) } ,
543555 effects_min_tys : parent_preds. effects_min_tys ,
556+ errored_due_to_unconstrained_params : parent_preds
557+ . errored_due_to_unconstrained_params ,
544558 } ;
545559 }
546560 gather_explicit_predicates_of ( tcx, def_id)
@@ -653,6 +667,7 @@ pub(super) fn implied_predicates_with_filter(
653667 parent : None ,
654668 predicates : implied_bounds,
655669 effects_min_tys : ty:: List :: empty ( ) ,
670+ errored_due_to_unconstrained_params : Ok ( ( ) ) ,
656671 }
657672}
658673
@@ -688,7 +703,12 @@ pub(super) fn type_param_predicates(
688703 let icx = ItemCtxt :: new ( tcx, parent) ;
689704 icx. probe_ty_param_bounds ( DUMMY_SP , def_id, assoc_name)
690705 } )
691- . unwrap_or_default ( ) ;
706+ . unwrap_or ( GenericPredicates {
707+ parent : None ,
708+ predicates : & [ ] ,
709+ effects_min_tys : ty:: List :: empty ( ) ,
710+ errored_due_to_unconstrained_params : Ok ( ( ) ) ,
711+ } ) ;
692712 let mut extend = None ;
693713
694714 let item_hir_id = tcx. local_def_id_to_hir_id ( item_def_id) ;
0 commit comments