Skip to content

Commit

Permalink
Rollup merge of rust-lang#96379 - PrestonFrom:issue_96335, r=compiler…
Browse files Browse the repository at this point in the history
…-errors

delay bug when adjusting `NeverToAny` twice during diagnostic code

Addresses Issue 96335 (rust-lang#96335) by using `delay_span_bug` instead of an assert and returning an error type from `check_expr_meets_expectation_or_error`.

Fixes rust-lang#96335
  • Loading branch information
GuillaumeGomez authored Apr 25, 2022
2 parents cf5066c + 5165295 commit 517ae3c
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 4 deletions.
16 changes: 12 additions & 4 deletions compiler/rustc_typeck/src/check/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// While we don't allow *arbitrary* coercions here, we *do* allow
// coercions from ! to `expected`.
if ty.is_never() {
assert!(
!self.typeck_results.borrow().adjustments().contains_key(expr.hir_id),
"expression with never type wound up being adjusted"
);
if let Some(adjustments) = self.typeck_results.borrow().adjustments().get(expr.hir_id) {
self.tcx().sess.delay_span_bug(
expr.span,
"expression with never type wound up being adjusted",
);
return if let [Adjustment { kind: Adjust::NeverToAny, target }] = &adjustments[..] {
target.to_owned()
} else {
self.tcx().ty_error()
};
}

let adj_ty = self.next_ty_var(TypeVariableOrigin {
kind: TypeVariableOriginKind::AdjustmentType,
span: expr.span,
Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/never_type/issue-96335.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
fn main() {
0.....{loop{}1};
//~^ ERROR unexpected token
//~| ERROR mismatched types
}
35 changes: 35 additions & 0 deletions src/test/ui/never_type/issue-96335.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
error: unexpected token: `...`
--> $DIR/issue-96335.rs:2:6
|
LL | 0.....{loop{}1};
| ^^^
|
help: use `..` for an exclusive range
|
LL | 0....{loop{}1};
| ~~
help: or `..=` for an inclusive range
|
LL | 0..=..{loop{}1};
| ~~~

error[E0308]: mismatched types
--> $DIR/issue-96335.rs:2:9
|
LL | 0.....{loop{}1};
| ----^^^^^^^^^^^
| | |
| | expected integer, found struct `RangeTo`
| arguments to this function are incorrect
|
= note: expected type `{integer}`
found struct `RangeTo<{integer}>`
note: associated function defined here
--> $SRC_DIR/core/src/ops/range.rs:LL:COL
|
LL | pub const fn new(start: Idx, end: Idx) -> Self {
| ^^^

error: aborting due to 2 previous errors

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

0 comments on commit 517ae3c

Please sign in to comment.