@@ -16,8 +16,8 @@ use errors::Applicability;
16
16
enum Context {
17
17
Normal ,
18
18
Loop ( hir:: LoopSource ) ,
19
- Closure ,
20
- AsyncClosure ,
19
+ Closure ( Span ) ,
20
+ AsyncClosure ( Span ) ,
21
21
LabeledBlock ,
22
22
AnonConst ,
23
23
}
@@ -58,11 +58,11 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
58
58
hir:: ExprKind :: Loop ( ref b, _, source) => {
59
59
self . with_context ( Loop ( source) , |v| v. visit_block ( & b) ) ;
60
60
}
61
- hir:: ExprKind :: Closure ( _, ref function_decl, b, _ , movability) => {
61
+ hir:: ExprKind :: Closure ( _, ref function_decl, b, span , movability) => {
62
62
let cx = if let Some ( GeneratorMovability :: Static ) = movability {
63
- AsyncClosure
63
+ AsyncClosure ( span )
64
64
} else {
65
- Closure
65
+ Closure ( span )
66
66
} ;
67
67
self . visit_fn_decl ( & function_decl) ;
68
68
self . with_context ( cx, |v| v. visit_nested_body ( b) ) ;
@@ -170,23 +170,22 @@ impl<'a, 'hir> CheckLoopVisitor<'a, 'hir> {
170
170
}
171
171
172
172
fn require_break_cx ( & self , name : & str , span : Span ) {
173
- match self . cx {
174
- LabeledBlock | Loop ( _) => { }
175
- Closure => {
176
- struct_span_err ! ( self . sess, span, E0267 , "`{}` inside of a closure" , name)
177
- . span_label ( span, "cannot break inside of a closure" )
173
+ let err_inside_of = |article, r#type, closure_span| {
174
+ struct_span_err ! ( self . sess, span, E0267 , "`{}` inside of {} {}" , name, article, r#type)
175
+ . span_label ( span, format ! ( "cannot `{}` inside of {} {}" , name, article, r#type) )
176
+ . span_label ( closure_span, & format ! ( "enclosing {}" , r#type) )
178
177
. emit ( ) ;
179
- }
180
- AsyncClosure => {
181
- struct_span_err ! ( self . sess , span , E0267 , "`{}` inside of an async block" , name )
182
- . span_label ( span , "cannot break inside of an async block" )
183
- . emit ( ) ;
184
- }
178
+ } ;
179
+
180
+ match self . cx {
181
+ LabeledBlock | Loop ( _ ) => { } ,
182
+ Closure ( closure_span ) => err_inside_of ( "a" , "closure" , closure_span ) ,
183
+ AsyncClosure ( closure_span ) => err_inside_of ( "an" , "`async` block" , closure_span ) ,
185
184
Normal | AnonConst => {
186
- struct_span_err ! ( self . sess, span, E0268 , "`{}` outside of loop" , name)
187
- . span_label ( span, "cannot break outside of a loop" )
185
+ struct_span_err ! ( self . sess, span, E0268 , "`{}` outside of a loop" , name)
186
+ . span_label ( span, format ! ( "cannot `{}` outside of a loop" , name ) )
188
187
. emit ( ) ;
189
- }
188
+ } ,
190
189
}
191
190
}
192
191
0 commit comments