@@ -8,7 +8,7 @@ use rustc_hir as hir;
8
8
use rustc_hir:: def:: DefKind ;
9
9
use rustc_hir:: def_id:: { DefId , LocalDefId } ;
10
10
use rustc_hir:: intravisit:: { self , Visitor } ;
11
- use rustc_middle:: ty:: { self , Ty , TyCtxt } ;
11
+ use rustc_middle:: ty:: { self , Ty , TyCtxt , TypeVisitableExt } ;
12
12
use rustc_middle:: ty:: { GenericPredicates , ImplTraitInTraitData , Upcast } ;
13
13
use rustc_middle:: { bug, span_bug} ;
14
14
use rustc_span:: symbol:: Ident ;
@@ -86,6 +86,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
86
86
parent : Some ( tcx. parent ( def_id. to_def_id ( ) ) ) ,
87
87
predicates : tcx. arena . alloc_from_iter ( predicates) ,
88
88
effects_min_tys : ty:: List :: empty ( ) ,
89
+ errored_due_to_unconstrained_params : Ok ( ( ) ) ,
89
90
} ;
90
91
}
91
92
@@ -108,6 +109,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
108
109
parent : Some ( impl_def_id) ,
109
110
predicates : tcx. arena . alloc_from_iter ( impl_predicates) ,
110
111
effects_min_tys : ty:: List :: empty ( ) ,
112
+ errored_due_to_unconstrained_params : trait_assoc_predicates
113
+ . errored_due_to_unconstrained_params ,
111
114
} ;
112
115
}
113
116
@@ -128,6 +131,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
128
131
// Preserving the order of insertion is important here so as not to break UI tests.
129
132
let mut predicates: FxIndexSet < ( ty:: Clause < ' _ > , Span ) > = FxIndexSet :: default ( ) ;
130
133
let mut effects_min_tys = Vec :: new ( ) ;
134
+ let mut errored_due_to_unconstrained_params = Ok ( ( ) ) ;
131
135
132
136
let hir_generics = node. generics ( ) . unwrap_or ( NO_GENERICS ) ;
133
137
if let Node :: Item ( item) = node {
@@ -291,11 +295,16 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
291
295
if let Node :: Item ( & Item { kind : ItemKind :: Impl { .. } , .. } ) = node {
292
296
let self_ty = tcx. type_of ( def_id) . instantiate_identity ( ) ;
293
297
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
+ } ) ,
299
308
) ;
300
309
}
301
310
@@ -338,6 +347,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
338
347
parent : generics. parent ,
339
348
predicates : tcx. arena . alloc_from_iter ( predicates) ,
340
349
effects_min_tys : tcx. mk_type_list ( & effects_min_tys) ,
350
+ errored_due_to_unconstrained_params,
341
351
}
342
352
}
343
353
@@ -489,6 +499,8 @@ pub(super) fn explicit_predicates_of<'tcx>(
489
499
parent : predicates_and_bounds. parent ,
490
500
predicates : tcx. arena . alloc_slice ( & predicates) ,
491
501
effects_min_tys : predicates_and_bounds. effects_min_tys ,
502
+ errored_due_to_unconstrained_params : predicates_and_bounds
503
+ . errored_due_to_unconstrained_params ,
492
504
}
493
505
}
494
506
} else {
@@ -541,6 +553,8 @@ pub(super) fn explicit_predicates_of<'tcx>(
541
553
parent : parent_preds. parent ,
542
554
predicates : { tcx. arena . alloc_from_iter ( filtered_predicates) } ,
543
555
effects_min_tys : parent_preds. effects_min_tys ,
556
+ errored_due_to_unconstrained_params : parent_preds
557
+ . errored_due_to_unconstrained_params ,
544
558
} ;
545
559
}
546
560
gather_explicit_predicates_of ( tcx, def_id)
@@ -653,6 +667,7 @@ pub(super) fn implied_predicates_with_filter(
653
667
parent : None ,
654
668
predicates : implied_bounds,
655
669
effects_min_tys : ty:: List :: empty ( ) ,
670
+ errored_due_to_unconstrained_params : Ok ( ( ) ) ,
656
671
}
657
672
}
658
673
@@ -688,7 +703,12 @@ pub(super) fn type_param_predicates(
688
703
let icx = ItemCtxt :: new ( tcx, parent) ;
689
704
icx. probe_ty_param_bounds ( DUMMY_SP , def_id, assoc_name)
690
705
} )
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
+ } ) ;
692
712
let mut extend = None ;
693
713
694
714
let item_hir_id = tcx. local_def_id_to_hir_id ( item_def_id) ;
0 commit comments