Fix type checking of return expressions outside fn bodies

This commit is contained in:
Fabian Wolff 2021-06-11 01:20:00 +02:00
parent 40c1623b16
commit bdddaebd76
8 changed files with 206 additions and 32 deletions

View file

@ -1,13 +1,21 @@
fn main() {
//~^ NOTE: not the enclosing function body
//~| NOTE: not the enclosing function body
//~| NOTE: not the enclosing function body
//~| NOTE: not the enclosing function body
|_: [_; return || {}] | {};
//~^ ERROR return statement outside of function body
//~^ ERROR: return statement outside of function body [E0572]
//~| NOTE: the return is part of this body...
[(); return || {}];
//~^ ERROR return statement outside of function body
//~^ ERROR: return statement outside of function body [E0572]
//~| NOTE: the return is part of this body...
[(); return |ice| {}];
//~^ ERROR return statement outside of function body
//~^ ERROR: return statement outside of function body [E0572]
//~| NOTE: the return is part of this body...
[(); return while let Some(n) = Some(0) {}];
//~^ ERROR return statement outside of function body
//~^ ERROR: return statement outside of function body [E0572]
//~| NOTE: the return is part of this body...
}

View file

@ -1,26 +1,62 @@
error[E0572]: return statement outside of function body
--> $DIR/issue-51714.rs:2:14
--> $DIR/issue-51714.rs:6:14
|
LL | |_: [_; return || {}] | {};
| ^^^^^^^^^^^^
LL | / fn main() {
LL | |
LL | |
LL | |
LL | |
LL | | |_: [_; return || {}] | {};
| | ^^^^^^^^^^^^ the return is part of this body...
... |
LL | |
LL | | }
| |_- ...not the enclosing function body
error[E0572]: return statement outside of function body
--> $DIR/issue-51714.rs:5:10
--> $DIR/issue-51714.rs:10:10
|
LL | [(); return || {}];
| ^^^^^^^^^^^^
LL | / fn main() {
LL | |
LL | |
LL | |
... |
LL | | [(); return || {}];
| | ^^^^^^^^^^^^ the return is part of this body...
... |
LL | |
LL | | }
| |_- ...not the enclosing function body
error[E0572]: return statement outside of function body
--> $DIR/issue-51714.rs:8:10
--> $DIR/issue-51714.rs:14:10
|
LL | [(); return |ice| {}];
| ^^^^^^^^^^^^^^^
LL | / fn main() {
LL | |
LL | |
LL | |
... |
LL | | [(); return |ice| {}];
| | ^^^^^^^^^^^^^^^ the return is part of this body...
... |
LL | |
LL | | }
| |_- ...not the enclosing function body
error[E0572]: return statement outside of function body
--> $DIR/issue-51714.rs:11:10
--> $DIR/issue-51714.rs:18:10
|
LL | [(); return while let Some(n) = Some(0) {}];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | / fn main() {
LL | |
LL | |
LL | |
... |
LL | | [(); return while let Some(n) = Some(0) {}];
| | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the return is part of this body...
LL | |
LL | |
LL | | }
| |_- ...not the enclosing function body
error: aborting due to 4 previous errors

View file

@ -0,0 +1,22 @@
// Due to a compiler bug, if a return occurs outside of a function body
// (e.g. in an AnonConst body), the return value expression would not be
// type-checked, leading to an ICE. This test checks that the ICE no
// longer happens, and that an appropriate error message is issued that
// also explains why the return is considered "outside of a function body"
// if it seems to be inside one, as in the main function below.
const C: [(); 42] = {
[(); return || {
//~^ ERROR: return statement outside of function body [E0572]
let tx;
}]
};
fn main() {
//~^ NOTE: ...not the enclosing function body
[(); return || {
//~^ ERROR: return statement outside of function body [E0572]
//~| NOTE: the return is part of this body...
let tx;
}];
}

View file

@ -0,0 +1,28 @@
error[E0572]: return statement outside of function body
--> $DIR/issue-86188-return-not-in-fn-body.rs:9:10
|
LL | [(); return || {
| __________^
LL | |
LL | | let tx;
LL | | }]
| |_____^
error[E0572]: return statement outside of function body
--> $DIR/issue-86188-return-not-in-fn-body.rs:17:10
|
LL | / fn main() {
LL | |
LL | | [(); return || {
| |__________^
LL | ||
LL | ||
LL | || let tx;
LL | || }];
| ||_____^ the return is part of this body...
LL | | }
| |_- ...not the enclosing function body
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0572`.

View file

@ -1,10 +1,19 @@
fn main() {
//~^ NOTE: not the enclosing function body
//~| NOTE: not the enclosing function body
//~| NOTE: not the enclosing function body
[(); return match 0 { n => n }];
//~^ ERROR: return statement outside of function body
//~^ ERROR: return statement outside of function body [E0572]
//~| NOTE: the return is part of this body...
[(); return match 0 { 0 => 0 }];
//~^ ERROR: return statement outside of function body
//~^ ERROR: return statement outside of function body [E0572]
//~| NOTE: the return is part of this body...
[(); return match () { 'a' => 0, _ => 0 }];
//~^ ERROR: return statement outside of function body
//~^ ERROR: return statement outside of function body [E0572]
//~| NOTE: the return is part of this body...
//~| ERROR: mismatched types [E0308]
//~| NOTE: expected `()`, found `char`
//~| NOTE: this expression has type `()`
}

View file

@ -1,21 +1,56 @@
error[E0572]: return statement outside of function body
--> $DIR/return-match-array-const.rs:2:10
|
LL | [(); return match 0 { n => n }];
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0572]: return statement outside of function body
--> $DIR/return-match-array-const.rs:5:10
|
LL | [(); return match 0 { 0 => 0 }];
| ^^^^^^^^^^^^^^^^^^^^^^^^^
LL | / fn main() {
LL | |
LL | |
LL | |
LL | | [(); return match 0 { n => n }];
| | ^^^^^^^^^^^^^^^^^^^^^^^^^ the return is part of this body...
... |
LL | |
LL | | }
| |_- ...not the enclosing function body
error[E0572]: return statement outside of function body
--> $DIR/return-match-array-const.rs:8:10
--> $DIR/return-match-array-const.rs:9:10
|
LL | / fn main() {
LL | |
LL | |
LL | |
... |
LL | | [(); return match 0 { 0 => 0 }];
| | ^^^^^^^^^^^^^^^^^^^^^^^^^ the return is part of this body...
... |
LL | |
LL | | }
| |_- ...not the enclosing function body
error[E0572]: return statement outside of function body
--> $DIR/return-match-array-const.rs:13:10
|
LL | / fn main() {
LL | |
LL | |
LL | |
... |
LL | | [(); return match () { 'a' => 0, _ => 0 }];
| | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the return is part of this body...
... |
LL | |
LL | | }
| |_- ...not the enclosing function body
error[E0308]: mismatched types
--> $DIR/return-match-array-const.rs:13:28
|
LL | [(); return match () { 'a' => 0, _ => 0 }];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| -- ^^^ expected `()`, found `char`
| |
| this expression has type `()`
error: aborting due to 3 previous errors
error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0572`.
Some errors have detailed explanations: E0308, E0572.
For more information about an error, try `rustc --explain E0308`.