@@ -4,7 +4,9 @@ use rustc_hir as hir;
44use rustc_hir:: def:: DefKind ;
55use rustc_hir:: def_id:: { DefId , LocalDefId } ;
66use rustc_hir:: intravisit:: { self , Visitor } ;
7- use rustc_middle:: ty:: { self , GenericPredicates , ImplTraitInTraitData , Ty , TyCtxt , Upcast } ;
7+ use rustc_middle:: ty:: {
8+ self , GenericPredicates , ImplTraitInTraitData , Ty , TyCtxt , TypeVisitableExt , Upcast ,
9+ } ;
810use rustc_middle:: { bug, span_bug} ;
911use rustc_span:: symbol:: Ident ;
1012use rustc_span:: { Span , DUMMY_SP } ;
@@ -86,6 +88,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
8688 parent : Some ( tcx. parent ( def_id. to_def_id ( ) ) ) ,
8789 predicates : tcx. arena . alloc_from_iter ( predicates) ,
8890 effects_min_tys : ty:: List :: empty ( ) ,
91+ errored_due_to_unconstrained_params : Ok ( ( ) ) ,
8992 } ;
9093 }
9194
@@ -108,6 +111,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
108111 parent : Some ( impl_def_id) ,
109112 predicates : tcx. arena . alloc_from_iter ( impl_predicates) ,
110113 effects_min_tys : ty:: List :: empty ( ) ,
114+ errored_due_to_unconstrained_params : trait_assoc_predicates
115+ . errored_due_to_unconstrained_params ,
111116 } ;
112117 }
113118
@@ -128,6 +133,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
128133 // Preserving the order of insertion is important here so as not to break UI tests.
129134 let mut predicates: FxIndexSet < ( ty:: Clause < ' _ > , Span ) > = FxIndexSet :: default ( ) ;
130135 let mut effects_min_tys = Vec :: new ( ) ;
136+ let mut errored_due_to_unconstrained_params = Ok ( ( ) ) ;
131137
132138 let hir_generics = node. generics ( ) . unwrap_or ( NO_GENERICS ) ;
133139 if let Node :: Item ( item) = node {
@@ -291,11 +297,16 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
291297 if let Node :: Item ( & Item { kind : ItemKind :: Impl { .. } , .. } ) = node {
292298 let self_ty = tcx. type_of ( def_id) . instantiate_identity ( ) ;
293299 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) ,
300+ let mut input_parameters = cgp:: parameters_for_impl ( tcx, self_ty, trait_ref) ;
301+ cgp:: setup_constraining_predicates ( tcx, & mut predicates, trait_ref, & mut input_parameters) ;
302+ errored_due_to_unconstrained_params = errored_due_to_unconstrained_params. and (
303+ self_ty. error_reported ( ) . and ( trait_ref. error_reported ( ) ) . and_then ( |( ) | {
304+ crate :: impl_wf_check:: enforce_impl_params_are_constrained (
305+ tcx,
306+ def_id,
307+ input_parameters,
308+ )
309+ } ) ,
299310 ) ;
300311 }
301312
@@ -338,6 +349,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
338349 parent : generics. parent ,
339350 predicates : tcx. arena . alloc_from_iter ( predicates) ,
340351 effects_min_tys : tcx. mk_type_list ( & effects_min_tys) ,
352+ errored_due_to_unconstrained_params,
341353 }
342354}
343355
@@ -489,6 +501,8 @@ pub(super) fn explicit_predicates_of<'tcx>(
489501 parent : predicates_and_bounds. parent ,
490502 predicates : tcx. arena . alloc_slice ( & predicates) ,
491503 effects_min_tys : predicates_and_bounds. effects_min_tys ,
504+ errored_due_to_unconstrained_params : predicates_and_bounds
505+ . errored_due_to_unconstrained_params ,
492506 }
493507 }
494508 } else {
@@ -541,6 +555,8 @@ pub(super) fn explicit_predicates_of<'tcx>(
541555 parent : parent_preds. parent ,
542556 predicates : { tcx. arena . alloc_from_iter ( filtered_predicates) } ,
543557 effects_min_tys : parent_preds. effects_min_tys ,
558+ errored_due_to_unconstrained_params : parent_preds
559+ . errored_due_to_unconstrained_params ,
544560 } ;
545561 }
546562 gather_explicit_predicates_of ( tcx, def_id)
@@ -653,6 +669,7 @@ pub(super) fn implied_predicates_with_filter(
653669 parent : None ,
654670 predicates : implied_bounds,
655671 effects_min_tys : ty:: List :: empty ( ) ,
672+ errored_due_to_unconstrained_params : Ok ( ( ) ) ,
656673 }
657674}
658675
@@ -688,7 +705,12 @@ pub(super) fn type_param_predicates(
688705 let icx = ItemCtxt :: new ( tcx, parent) ;
689706 icx. probe_ty_param_bounds ( DUMMY_SP , def_id, assoc_name)
690707 } )
691- . unwrap_or_default ( ) ;
708+ . unwrap_or ( GenericPredicates {
709+ parent : None ,
710+ predicates : & [ ] ,
711+ effects_min_tys : ty:: List :: empty ( ) ,
712+ errored_due_to_unconstrained_params : Ok ( ( ) ) ,
713+ } ) ;
692714 let mut extend = None ;
693715
694716 let item_hir_id = tcx. local_def_id_to_hir_id ( item_def_id) ;
0 commit comments