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