Fix ICE in check_must_not_suspend_ty()
This commit is contained in:
parent
772d51f887
commit
a8daff2724
@ -536,22 +536,28 @@ pub fn check_must_not_suspend_ty<'tcx>(
|
||||
}
|
||||
has_emitted
|
||||
}
|
||||
ty::Tuple(ref tys) => {
|
||||
ty::Tuple(_) => {
|
||||
let mut has_emitted = false;
|
||||
let spans = if let Some(hir::ExprKind::Tup(comps)) = data.expr.map(|e| &e.kind) {
|
||||
debug_assert_eq!(comps.len(), tys.len());
|
||||
comps.iter().map(|e| e.span).collect()
|
||||
} else {
|
||||
vec![]
|
||||
let comps = match data.expr.map(|e| &e.kind) {
|
||||
Some(hir::ExprKind::Tup(comps)) => {
|
||||
debug_assert_eq!(comps.len(), ty.tuple_fields().count());
|
||||
Some(comps)
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
for (i, ty) in tys.iter().map(|k| k.expect_ty()).enumerate() {
|
||||
for (i, ty) in ty.tuple_fields().enumerate() {
|
||||
let descr_post = &format!(" in tuple element {}", i);
|
||||
let span = *spans.get(i).unwrap_or(&data.source_span);
|
||||
let span = comps.and_then(|c| c.get(i)).map(|e| e.span).unwrap_or(data.source_span);
|
||||
if check_must_not_suspend_ty(
|
||||
fcx,
|
||||
ty,
|
||||
hir_id,
|
||||
SuspendCheckData { descr_post, source_span: span, ..data },
|
||||
SuspendCheckData {
|
||||
descr_post,
|
||||
expr: comps.and_then(|comps| comps.get(i)),
|
||||
source_span: span,
|
||||
..data
|
||||
},
|
||||
) {
|
||||
has_emitted = true;
|
||||
}
|
||||
|
10
src/test/ui/typeck/issue-91334.rs
Normal file
10
src/test/ui/typeck/issue-91334.rs
Normal file
@ -0,0 +1,10 @@
|
||||
// Regression test for the ICE described in issue #91334.
|
||||
|
||||
// error-pattern: this file contains an unclosed delimiter
|
||||
// error-pattern: expected one of
|
||||
// error-pattern: mismatched closing delimiter
|
||||
// error-pattern: mismatched types
|
||||
|
||||
#![feature(generators)]
|
||||
|
||||
fn f(){||yield(((){),
|
50
src/test/ui/typeck/issue-91334.stderr
Normal file
50
src/test/ui/typeck/issue-91334.stderr
Normal file
@ -0,0 +1,50 @@
|
||||
error: this file contains an unclosed delimiter
|
||||
--> $DIR/issue-91334.rs:10:23
|
||||
|
|
||||
LL | fn f(){||yield(((){),
|
||||
| - - ^
|
||||
| | |
|
||||
| | unclosed delimiter
|
||||
| unclosed delimiter
|
||||
|
||||
error: this file contains an unclosed delimiter
|
||||
--> $DIR/issue-91334.rs:10:23
|
||||
|
|
||||
LL | fn f(){||yield(((){),
|
||||
| - - ^
|
||||
| | |
|
||||
| | unclosed delimiter
|
||||
| unclosed delimiter
|
||||
|
||||
error: expected one of `)`, `,`, `.`, `?`, or an operator, found `{`
|
||||
--> $DIR/issue-91334.rs:10:19
|
||||
|
|
||||
LL | fn f(){||yield(((){),
|
||||
| ^
|
||||
| |
|
||||
| expected one of `)`, `,`, `.`, `?`, or an operator
|
||||
| help: missing `,`
|
||||
|
||||
error: mismatched closing delimiter: `)`
|
||||
--> $DIR/issue-91334.rs:10:19
|
||||
|
|
||||
LL | fn f(){||yield(((){),
|
||||
| - ^^ mismatched closing delimiter
|
||||
| | |
|
||||
| | unclosed delimiter
|
||||
| closing delimiter possibly meant for this
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-91334.rs:10:8
|
||||
|
|
||||
LL | fn f(){||yield(((){),
|
||||
| -^^^^^^^^^^^^^^^ expected `()`, found generator
|
||||
| |
|
||||
| help: try adding a return type: `-> [generator@$DIR/issue-91334.rs:10:8: 10:23]`
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found generator `[generator@$DIR/issue-91334.rs:10:8: 10:23]`
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
Loading…
x
Reference in New Issue
Block a user