@@ -153,22 +153,28 @@ impl<'tcx> InferCtxt<'tcx> {
153
153
. try_collect ( )
154
154
. map_err ( |e| ( e, SubregionOrigin :: AscribeUserTypeProvePredicate ( DUMMY_SP ) ) ) ?;
155
155
156
- let my_region_obligations = self . take_registered_region_obligations ( ) ;
157
-
158
- for RegionObligation { sup_type, sub_region, origin } in my_region_obligations {
159
- let sup_type =
160
- deeply_normalize_ty ( sup_type, origin. clone ( ) ) . map_err ( |e| ( e, origin. clone ( ) ) ) ?;
161
- debug ! ( ?sup_type, ?sub_region, ?origin) ;
162
-
163
- let outlives = & mut TypeOutlives :: new (
164
- self ,
165
- self . tcx ,
166
- outlives_env. region_bound_pairs ( ) ,
167
- None ,
168
- & normalized_caller_bounds,
169
- ) ;
170
- let category = origin. to_constraint_category ( ) ;
171
- outlives. type_must_outlive ( origin, sup_type, sub_region, category) ;
156
+ // Must loop since the process of normalizing may itself register region obligations.
157
+ loop {
158
+ let my_region_obligations = self . take_registered_region_obligations ( ) ;
159
+ if my_region_obligations. is_empty ( ) {
160
+ break ;
161
+ }
162
+
163
+ for RegionObligation { sup_type, sub_region, origin } in my_region_obligations {
164
+ let sup_type = deeply_normalize_ty ( sup_type, origin. clone ( ) )
165
+ . map_err ( |e| ( e, origin. clone ( ) ) ) ?;
166
+ debug ! ( ?sup_type, ?sub_region, ?origin) ;
167
+
168
+ let outlives = & mut TypeOutlives :: new (
169
+ self ,
170
+ self . tcx ,
171
+ outlives_env. region_bound_pairs ( ) ,
172
+ None ,
173
+ & normalized_caller_bounds,
174
+ ) ;
175
+ let category = origin. to_constraint_category ( ) ;
176
+ outlives. type_must_outlive ( origin, sup_type, sub_region, category) ;
177
+ }
172
178
}
173
179
174
180
Ok ( ( ) )
0 commit comments