@@ -16,8 +16,8 @@ use errors::Applicability;
1616enum Context {
1717 Normal ,
1818 Loop ( hir:: LoopSource ) ,
19- Closure ,
20- AsyncClosure ,
19+ Closure ( Span ) ,
20+ AsyncClosure ( Span ) ,
2121 LabeledBlock ,
2222 AnonConst ,
2323}
@@ -58,11 +58,11 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
5858 hir:: ExprKind :: Loop ( ref b, _, source) => {
5959 self . with_context ( Loop ( source) , |v| v. visit_block ( & b) ) ;
6060 }
61- hir:: ExprKind :: Closure ( _, ref function_decl, b, _ , movability) => {
61+ hir:: ExprKind :: Closure ( _, ref function_decl, b, span , movability) => {
6262 let cx = if let Some ( GeneratorMovability :: Static ) = movability {
63- AsyncClosure
63+ AsyncClosure ( span )
6464 } else {
65- Closure
65+ Closure ( span )
6666 } ;
6767 self . visit_fn_decl ( & function_decl) ;
6868 self . with_context ( cx, |v| v. visit_nested_body ( b) ) ;
@@ -170,23 +170,22 @@ impl<'a, 'hir> CheckLoopVisitor<'a, 'hir> {
170170 }
171171
172172 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) )
178177 . 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 ) ,
185184 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 ) )
188187 . emit ( ) ;
189- }
188+ } ,
190189 }
191190 }
192191
0 commit comments