1
Fork 0

Continue parsing function after finding ... arg

When encountering a variadic argument in a function definition that
doesn't accept it, if immediately after there's a closing paren,
continue parsing as normal. Otherwise keep current behavior of emitting
error and stopping.
This commit is contained in:
Esteban Küber 2018-02-11 22:10:35 -08:00
parent d0f1f42816
commit f7cabc6550
3 changed files with 43 additions and 5 deletions

View file

@ -4859,19 +4859,30 @@ impl<'a> Parser<'a> {
|p| {
if p.token == token::DotDotDot {
p.bump();
variadic = true;
if allow_variadic {
if p.token != token::CloseDelim(token::Paren) {
let span = p.span;
p.span_err(span,
"`...` must be last in argument list for variadic function");
}
Ok(None)
} else {
let span = p.span;
p.span_err(span,
"only foreign functions are allowed to be variadic");
let span = p.prev_span;
if p.token == token::CloseDelim(token::Paren) {
// continue parsing to present any further errors
p.struct_span_err(
span,
"only foreign functions are allowed to be variadic"
).emit();
Ok(Some(dummy_arg(span)))
} else {
// this function definition looks beyond recovery, stop parsing
p.span_err(span,
"only foreign functions are allowed to be variadic");
Ok(None)
}
}
variadic = true;
Ok(None)
} else {
match p.parse_arg_general(named_args) {
Ok(arg) => Ok(Some(arg)),

View file

@ -0,0 +1,13 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
extern "C" fn foo(x: u8, ...);
//~^ ERROR only foreign functions are allowed to be variadic
//~| ERROR expected one of `->`, `where`, or `{`, found `;`

View file

@ -0,0 +1,14 @@
error: only foreign functions are allowed to be variadic
--> $DIR/invalid-variadic-function.rs:11:26
|
11 | extern "C" fn foo(x: u8, ...);
| ^^^
error: expected one of `->`, `where`, or `{`, found `;`
--> $DIR/invalid-variadic-function.rs:11:30
|
11 | extern "C" fn foo(x: u8, ...);
| ^ expected one of `->`, `where`, or `{` here
error: aborting due to 2 previous errors