Skip to content

Commit 8ddb8b7

Browse files
committed
Auto merge of rust-lang#13183 - Veykril:break-break, r=Veykril
Fix nested break expressions, expecting unknown types
2 parents afa374e + 020f689 commit 8ddb8b7

File tree

2 files changed

+35
-22
lines changed

2 files changed

+35
-22
lines changed

crates/hir-ty/src/infer/expr.rs

+21-22
Original file line numberDiff line numberDiff line change
@@ -382,36 +382,35 @@ impl<'a> InferenceContext<'a> {
382382
TyKind::Never.intern(Interner)
383383
}
384384
Expr::Break { expr, label } => {
385-
let mut coerce = match find_breakable(&mut self.breakables, label.as_ref()) {
386-
Some(ctxt) => {
387-
// avoiding the borrowck
388-
mem::replace(
389-
&mut ctxt.coerce,
390-
CoerceMany::new(self.result.standard_types.unknown.clone()),
391-
)
392-
}
393-
None => CoerceMany::new(self.result.standard_types.unknown.clone()),
394-
};
395-
396385
let val_ty = if let Some(expr) = *expr {
397386
self.infer_expr(expr, &Expectation::none())
398387
} else {
399388
TyBuilder::unit()
400389
};
401390

402-
// FIXME: create a synthetic `()` during lowering so we have something to refer to here?
403-
coerce.coerce(self, *expr, &val_ty);
391+
match find_breakable(&mut self.breakables, label.as_ref()) {
392+
Some(ctxt) => {
393+
// avoiding the borrowck
394+
let mut coerce = mem::replace(
395+
&mut ctxt.coerce,
396+
CoerceMany::new(self.result.standard_types.unknown.clone()),
397+
);
404398

405-
if let Some(ctxt) = find_breakable(&mut self.breakables, label.as_ref()) {
406-
ctxt.coerce = coerce;
407-
ctxt.may_break = true;
408-
} else {
409-
self.push_diagnostic(InferenceDiagnostic::BreakOutsideOfLoop {
410-
expr: tgt_expr,
411-
is_break: true,
412-
});
413-
};
399+
// FIXME: create a synthetic `()` during lowering so we have something to refer to here?
400+
coerce.coerce(self, *expr, &val_ty);
414401

402+
let ctxt = find_breakable(&mut self.breakables, label.as_ref())
403+
.expect("breakable stack changed during coercion");
404+
ctxt.coerce = coerce;
405+
ctxt.may_break = true;
406+
}
407+
None => {
408+
self.push_diagnostic(InferenceDiagnostic::BreakOutsideOfLoop {
409+
expr: tgt_expr,
410+
is_break: true,
411+
});
412+
}
413+
}
415414
TyKind::Never.intern(Interner)
416415
}
417416
Expr::Return { expr } => {

crates/hir-ty/src/tests/simple.rs

+14
Original file line numberDiff line numberDiff line change
@@ -3069,3 +3069,17 @@ fn main() {
30693069
"#,
30703070
);
30713071
}
3072+
3073+
#[test]
3074+
fn nested_break() {
3075+
check_no_mismatches(
3076+
r#"
3077+
fn func() {
3078+
let int = loop {
3079+
break 0;
3080+
break (break 0);
3081+
};
3082+
}
3083+
"#,
3084+
);
3085+
}

0 commit comments

Comments
 (0)