@@ -33,6 +33,7 @@ enum ConstraintCategory {
33
33
Assignment ,
34
34
AssignmentToUpvar ,
35
35
Return ,
36
+ CallArgumentToUpvar ,
36
37
CallArgument ,
37
38
Other ,
38
39
Boring ,
@@ -45,7 +46,8 @@ impl fmt::Display for ConstraintCategory {
45
46
ConstraintCategory :: AssignmentToUpvar => write ! ( f, "assignment" ) ,
46
47
ConstraintCategory :: Return => write ! ( f, "return" ) ,
47
48
ConstraintCategory :: Cast => write ! ( f, "cast" ) ,
48
- ConstraintCategory :: CallArgument => write ! ( f, "argument" ) ,
49
+ ConstraintCategory :: CallArgument |
50
+ ConstraintCategory :: CallArgumentToUpvar => write ! ( f, "argument" ) ,
49
51
_ => write ! ( f, "free region" ) ,
50
52
}
51
53
}
@@ -133,7 +135,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
133
135
& self ,
134
136
index : ConstraintIndex ,
135
137
mir : & Mir < ' tcx > ,
136
- infcx : & InferCtxt < ' _ , ' _ , ' tcx > ,
138
+ _infcx : & InferCtxt < ' _ , ' _ , ' tcx > ,
137
139
) -> ( ConstraintCategory , Span ) {
138
140
let constraint = self . constraints [ index] ;
139
141
debug ! ( "classify_constraint: constraint={:?}" , constraint) ;
@@ -163,7 +165,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
163
165
match statement. kind {
164
166
StatementKind :: Assign ( ref place, ref rvalue) => {
165
167
debug ! ( "classify_constraint: place={:?} rvalue={:?}" , place, rvalue) ;
166
- let initial_category = if * place == Place :: Local ( mir:: RETURN_PLACE ) {
168
+ if * place == Place :: Local ( mir:: RETURN_PLACE ) {
167
169
ConstraintCategory :: Return
168
170
} else {
169
171
match rvalue {
@@ -172,13 +174,6 @@ impl<'tcx> RegionInferenceContext<'tcx> {
172
174
Rvalue :: Aggregate ( ..) => ConstraintCategory :: Assignment ,
173
175
_ => ConstraintCategory :: Other ,
174
176
}
175
- } ;
176
-
177
- if initial_category == ConstraintCategory :: Assignment
178
- && place. is_upvar_field_projection ( mir, & infcx. tcx ) . is_some ( ) {
179
- ConstraintCategory :: AssignmentToUpvar
180
- } else {
181
- initial_category
182
177
}
183
178
}
184
179
_ => ConstraintCategory :: Other ,
@@ -236,8 +231,22 @@ impl<'tcx> RegionInferenceContext<'tcx> {
236
231
// Get a span
237
232
let ( category, span) = categorized_path. first ( ) . unwrap ( ) ;
238
233
234
+ let category = match (
235
+ category,
236
+ self . universal_regions . is_local_free_region ( fr) ,
237
+ self . universal_regions . is_local_free_region ( outlived_fr) ,
238
+ ) {
239
+ ( ConstraintCategory :: Assignment , true , false ) =>
240
+ & ConstraintCategory :: AssignmentToUpvar ,
241
+ ( ConstraintCategory :: CallArgument , true , false ) =>
242
+ & ConstraintCategory :: CallArgumentToUpvar ,
243
+ ( category, _, _) => category,
244
+ } ;
245
+
246
+ debug ! ( "report_error: category={:?}" , category) ;
239
247
match category {
240
- ConstraintCategory :: AssignmentToUpvar =>
248
+ ConstraintCategory :: AssignmentToUpvar |
249
+ ConstraintCategory :: CallArgumentToUpvar =>
241
250
self . report_closure_error ( mir, infcx, fr, outlived_fr, span) ,
242
251
_ =>
243
252
self . report_general_error ( mir, infcx, mir_def_id, fr, outlived_fr, category, span) ,
0 commit comments