Skip to content

Commit

Permalink
Account for macros
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Oct 9, 2023
1 parent c30d57b commit d23dc20
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 1 deletion.
2 changes: 1 addition & 1 deletion compiler/rustc_passes/src/loops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ impl<'a, 'hir> CheckLoopVisitor<'a, 'hir> {
AsyncClosure(closure_span) => {
self.sess.emit_err(BreakInsideAsyncBlock { span, closure_span, name });
}
UnlabeledBlock(block_span) if is_break => {
UnlabeledBlock(block_span) if is_break && block_span.ctxt() == break_span.ctxt() => {
let suggestion = Some(OutsideLoopSuggestion { block_span, break_span });
self.sess.emit_err(OutsideLoop { span, name, is_break, suggestion });
}
Expand Down
43 changes: 43 additions & 0 deletions tests/ui/parser/break-in-unlabeled-block-in-macro.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
macro_rules! foo {
() => {
break (); //~ ERROR `break` outside of a loop or labeled block
};
($e: expr) => {
break $e; //~ ERROR `break` outside of a loop or labeled block
};
(stmt $s: stmt) => {
$s
};
(@ $e: expr) => {
{ break $e; } //~ ERROR `break` outside of a loop or labeled block
};
(=> $s: stmt) => {
{ $s }
};
}

fn main() {
{
foo!();
}
{
foo!(());
}
{
foo!(stmt break ()); //~ ERROR `break` outside of a loop or labeled block
}
{
foo!(@ ());
}
{
foo!(=> break ()); //~ ERROR `break` outside of a loop or labeled block
}
{
macro_rules! bar {
() => {
break () //~ ERROR `break` outside of a loop or labeled block
};
}
bar!()
}
}
69 changes: 69 additions & 0 deletions tests/ui/parser/break-in-unlabeled-block-in-macro.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
error[E0268]: `break` outside of a loop or labeled block
--> $DIR/break-in-unlabeled-block-in-macro.rs:3:9
|
LL | break ();
| ^^^^^^^^ cannot `break` outside of a loop or labeled block
...
LL | foo!();
| ------ in this macro invocation
|
= note: this error originates in the macro `foo` (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0268]: `break` outside of a loop or labeled block
--> $DIR/break-in-unlabeled-block-in-macro.rs:6:9
|
LL | break $e;
| ^^^^^^^^ cannot `break` outside of a loop or labeled block
...
LL | foo!(());
| -------- in this macro invocation
|
= note: this error originates in the macro `foo` (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0268]: `break` outside of a loop or labeled block
--> $DIR/break-in-unlabeled-block-in-macro.rs:27:19
|
LL | foo!(stmt break ());
| ^^^^^^^^ cannot `break` outside of a loop or labeled block
|
help: consider labeling this block to be able to break within it
|
LL ~ 'block: {
LL ~ foo!(stmt break 'block ());
|

error[E0268]: `break` outside of a loop or labeled block
--> $DIR/break-in-unlabeled-block-in-macro.rs:12:11
|
LL | { break $e; }
| ^^^^^^^^ cannot `break` outside of a loop or labeled block
...
LL | foo!(@ ());
| ---------- in this macro invocation
|
= note: this error originates in the macro `foo` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider labeling this block to be able to break within it
|
LL | 'block: { break 'block $e; }
| +++++++ ++++++

error[E0268]: `break` outside of a loop or labeled block
--> $DIR/break-in-unlabeled-block-in-macro.rs:33:17
|
LL | foo!(=> break ());
| ^^^^^^^^ cannot `break` outside of a loop or labeled block

error[E0268]: `break` outside of a loop or labeled block
--> $DIR/break-in-unlabeled-block-in-macro.rs:38:17
|
LL | break ()
| ^^^^^^^^ cannot `break` outside of a loop or labeled block
...
LL | bar!()
| ------ in this macro invocation
|
= note: this error originates in the macro `bar` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 6 previous errors

For more information about this error, try `rustc --explain E0268`.

0 comments on commit d23dc20

Please sign in to comment.