diff options
| author | Jonas Schievink <jonas.schievink@ferrous-systems.com> | 2022-03-31 16:03:27 +0200 |
|---|---|---|
| committer | Jonas Schievink <jonas.schievink@ferrous-systems.com> | 2022-03-31 16:03:27 +0200 |
| commit | 42ecf406e8b57f43da2edeb420c163e94e0ca352 (patch) | |
| tree | 0268ca843d099216cdd1dec6a9a48d4bce0c426a | |
| parent | 9b000b544b9d51c5448bc377fcffb951781926f3 (diff) | |
| download | rust-42ecf406e8b57f43da2edeb420c163e94e0ca352.tar.gz rust-42ecf406e8b57f43da2edeb420c163e94e0ca352.zip | |
Remove parser restriction on varargs positioning
5 files changed, 37 insertions, 28 deletions
diff --git a/crates/parser/src/grammar/params.rs b/crates/parser/src/grammar/params.rs index a000f515cc0..c2e633fdb0b 100644 --- a/crates/parser/src/grammar/params.rs +++ b/crates/parser/src/grammar/params.rs @@ -71,13 +71,10 @@ fn list_(p: &mut Parser, flavor: Flavor) { m.abandon(p); break; } - let param = param(p, m, flavor); + param(p, m, flavor); if !p.at(ket) { p.expect(T![,]); } - if let Variadic(true) = param { - break; - } } if let Some(m) = param_marker { @@ -90,27 +87,24 @@ fn list_(p: &mut Parser, flavor: Flavor) { const PARAM_FIRST: TokenSet = patterns::PATTERN_FIRST.union(types::TYPE_FIRST); -struct Variadic(bool); - -fn param(p: &mut Parser, m: Marker, flavor: Flavor) -> Variadic { - let mut res = Variadic(false); +fn param(p: &mut Parser, m: Marker, flavor: Flavor) { match flavor { // test param_list_vararg - // extern "C" { fn printf(format: *const i8, ...) -> i32; } - Flavor::FnDef | Flavor::FnPointer if p.eat(T![...]) => res = Variadic(true), + // extern "C" { fn printf(format: *const i8, ..., _: u8) -> i32; } + Flavor::FnDef | Flavor::FnPointer if p.eat(T![...]) => {} // test fn_def_param - // fn foo((x, y): (i32, i32)) {} + // fn foo(..., (x, y): (i32, i32)) {} Flavor::FnDef => { patterns::pattern(p); - if variadic_param(p) { - res = Variadic(true); - } else if p.at(T![:]) { - types::ascription(p); - } else { - // test_err missing_fn_param_type - // fn f(x y: i32, z, t: i32) {} - p.error("missing type for function parameter"); + if !variadic_param(p) { + if p.at(T![:]) { + types::ascription(p); + } else { + // test_err missing_fn_param_type + // fn f(x y: i32, z, t: i32) {} + p.error("missing type for function parameter"); + } } } // test value_parameters_no_patterns @@ -127,12 +121,12 @@ fn param(p: &mut Parser, m: Marker, flavor: Flavor) -> Variadic { Flavor::FnPointer => { if (p.at(IDENT) || p.at(UNDERSCORE)) && p.nth(1) == T![:] && !p.nth_at(1, T![::]) { patterns::pattern_single(p); - if variadic_param(p) { - res = Variadic(true); - } else if p.at(T![:]) { - types::ascription(p); - } else { - p.error("missing type for function parameter"); + if !variadic_param(p) { + if p.at(T![:]) { + types::ascription(p); + } else { + p.error("missing type for function parameter"); + } } } else { types::type_(p); @@ -150,7 +144,6 @@ fn param(p: &mut Parser, m: Marker, flavor: Flavor) -> Variadic { } } m.complete(p, PARAM); - res } fn variadic_param(p: &mut Parser) -> bool { diff --git a/crates/parser/test_data/parser/inline/ok/0123_param_list_vararg.rast b/crates/parser/test_data/parser/inline/ok/0123_param_list_vararg.rast index c86cf18bbe9..338d53995ae 100644 --- a/crates/parser/test_data/parser/inline/ok/0123_param_list_vararg.rast +++ b/crates/parser/test_data/parser/inline/ok/0123_param_list_vararg.rast @@ -34,6 +34,18 @@ SOURCE_FILE WHITESPACE " " PARAM DOT3 "..." + COMMA "," + WHITESPACE " " + PARAM + WILDCARD_PAT + UNDERSCORE "_" + COLON ":" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "u8" R_PAREN ")" WHITESPACE " " RET_TYPE diff --git a/crates/parser/test_data/parser/inline/ok/0123_param_list_vararg.rs b/crates/parser/test_data/parser/inline/ok/0123_param_list_vararg.rs index c59addaf420..533096cd5bb 100644 --- a/crates/parser/test_data/parser/inline/ok/0123_param_list_vararg.rs +++ b/crates/parser/test_data/parser/inline/ok/0123_param_list_vararg.rs @@ -1 +1 @@ -extern "C" { fn printf(format: *const i8, ...) -> i32; } +extern "C" { fn printf(format: *const i8, ..., _: u8) -> i32; } diff --git a/crates/parser/test_data/parser/inline/ok/0156_fn_def_param.rast b/crates/parser/test_data/parser/inline/ok/0156_fn_def_param.rast index 7511877aa8d..ce425a1afde 100644 --- a/crates/parser/test_data/parser/inline/ok/0156_fn_def_param.rast +++ b/crates/parser/test_data/parser/inline/ok/0156_fn_def_param.rast @@ -7,6 +7,10 @@ SOURCE_FILE PARAM_LIST L_PAREN "(" PARAM + DOT3 "..." + COMMA "," + WHITESPACE " " + PARAM TUPLE_PAT L_PAREN "(" IDENT_PAT diff --git a/crates/parser/test_data/parser/inline/ok/0156_fn_def_param.rs b/crates/parser/test_data/parser/inline/ok/0156_fn_def_param.rs index 7b277c16b15..7b4c6265829 100644 --- a/crates/parser/test_data/parser/inline/ok/0156_fn_def_param.rs +++ b/crates/parser/test_data/parser/inline/ok/0156_fn_def_param.rs @@ -1 +1 @@ -fn foo((x, y): (i32, i32)) {} +fn foo(..., (x, y): (i32, i32)) {} |
