Expect extern fn with no body when parsing

Also add a test case for inserting a semicolon on extern fns.

Without this fix, we got an error like this:

    error: expected one of `->`, `where`, or `{`, found `}`
     --> chk.rs:3:1
      |
    2 |   fn foo()
      |      ---  - expected one of `->`, `where`, or `{`
      |      |
      |      while parsing this `fn`
    3 | }
      | ^ unexpected token

Since this is inside an extern block, you're required to write function
prototypes with no body. This fixes a regression, and adds a test case
for it.
This commit is contained in:
Michael Howell 2021-12-06 11:07:34 -07:00
parent 61995926d2
commit 6611567f9e
4 changed files with 29 additions and 1 deletions

View File

@ -950,7 +950,7 @@ impl<'a> Parser<'a> {
&mut self,
force_collect: ForceCollect,
) -> PResult<'a, Option<Option<P<ForeignItem>>>> {
let fn_parse_mode = FnParseMode { req_name: |_| true, req_body: true };
let fn_parse_mode = FnParseMode { req_name: |_| true, req_body: false };
Ok(self.parse_item_(fn_parse_mode, force_collect)?.map(
|Item { attrs, id, span, vis, ident, kind, tokens }| {
let kind = match ForeignItemKind::try_from(kind) {

View File

@ -0,0 +1,9 @@
// run-rustfix
#[allow(dead_code)]
extern "C" {
fn foo(); //~ERROR expected `;`
}
fn main() {}

View File

@ -0,0 +1,9 @@
// run-rustfix
#[allow(dead_code)]
extern "C" {
fn foo() //~ERROR expected `;`
}
fn main() {}

View File

@ -0,0 +1,10 @@
error: expected `;`, found `}`
--> $DIR/suggest-semicolon-for-fn-in-extern-block.rs:6:11
|
LL | fn foo()
| ^ help: add `;` here
LL | }
| - unexpected token
error: aborting due to previous error