Skip to content

Commit a1d684e

Browse files
bors[bot]Jonas Schievink
and
Jonas Schievink
authored
Merge #11863
11863: fix: allow varargs in any param position r=jonas-schievink a=jonas-schievink Fixes #3578 and aligns us with the Rust reference. bors r+ Co-authored-by: Jonas Schievink <jonas.schievink@ferrous-systems.com>
2 parents 9b000b5 + 42ecf40 commit a1d684e

File tree

5 files changed

+37
-28
lines changed

5 files changed

+37
-28
lines changed

crates/parser/src/grammar/params.rs

+19-26
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,10 @@ fn list_(p: &mut Parser, flavor: Flavor) {
7171
m.abandon(p);
7272
break;
7373
}
74-
let param = param(p, m, flavor);
74+
param(p, m, flavor);
7575
if !p.at(ket) {
7676
p.expect(T![,]);
7777
}
78-
if let Variadic(true) = param {
79-
break;
80-
}
8178
}
8279

8380
if let Some(m) = param_marker {
@@ -90,27 +87,24 @@ fn list_(p: &mut Parser, flavor: Flavor) {
9087

9188
const PARAM_FIRST: TokenSet = patterns::PATTERN_FIRST.union(types::TYPE_FIRST);
9289

93-
struct Variadic(bool);
94-
95-
fn param(p: &mut Parser, m: Marker, flavor: Flavor) -> Variadic {
96-
let mut res = Variadic(false);
90+
fn param(p: &mut Parser, m: Marker, flavor: Flavor) {
9791
match flavor {
9892
// test param_list_vararg
99-
// extern "C" { fn printf(format: *const i8, ...) -> i32; }
100-
Flavor::FnDef | Flavor::FnPointer if p.eat(T![...]) => res = Variadic(true),
93+
// extern "C" { fn printf(format: *const i8, ..., _: u8) -> i32; }
94+
Flavor::FnDef | Flavor::FnPointer if p.eat(T![...]) => {}
10195

10296
// test fn_def_param
103-
// fn foo((x, y): (i32, i32)) {}
97+
// fn foo(..., (x, y): (i32, i32)) {}
10498
Flavor::FnDef => {
10599
patterns::pattern(p);
106-
if variadic_param(p) {
107-
res = Variadic(true);
108-
} else if p.at(T![:]) {
109-
types::ascription(p);
110-
} else {
111-
// test_err missing_fn_param_type
112-
// fn f(x y: i32, z, t: i32) {}
113-
p.error("missing type for function parameter");
100+
if !variadic_param(p) {
101+
if p.at(T![:]) {
102+
types::ascription(p);
103+
} else {
104+
// test_err missing_fn_param_type
105+
// fn f(x y: i32, z, t: i32) {}
106+
p.error("missing type for function parameter");
107+
}
114108
}
115109
}
116110
// test value_parameters_no_patterns
@@ -127,12 +121,12 @@ fn param(p: &mut Parser, m: Marker, flavor: Flavor) -> Variadic {
127121
Flavor::FnPointer => {
128122
if (p.at(IDENT) || p.at(UNDERSCORE)) && p.nth(1) == T![:] && !p.nth_at(1, T![::]) {
129123
patterns::pattern_single(p);
130-
if variadic_param(p) {
131-
res = Variadic(true);
132-
} else if p.at(T![:]) {
133-
types::ascription(p);
134-
} else {
135-
p.error("missing type for function parameter");
124+
if !variadic_param(p) {
125+
if p.at(T![:]) {
126+
types::ascription(p);
127+
} else {
128+
p.error("missing type for function parameter");
129+
}
136130
}
137131
} else {
138132
types::type_(p);
@@ -150,7 +144,6 @@ fn param(p: &mut Parser, m: Marker, flavor: Flavor) -> Variadic {
150144
}
151145
}
152146
m.complete(p, PARAM);
153-
res
154147
}
155148

156149
fn variadic_param(p: &mut Parser) -> bool {

crates/parser/test_data/parser/inline/ok/0123_param_list_vararg.rast

+12
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@ SOURCE_FILE
3434
WHITESPACE " "
3535
PARAM
3636
DOT3 "..."
37+
COMMA ","
38+
WHITESPACE " "
39+
PARAM
40+
WILDCARD_PAT
41+
UNDERSCORE "_"
42+
COLON ":"
43+
WHITESPACE " "
44+
PATH_TYPE
45+
PATH
46+
PATH_SEGMENT
47+
NAME_REF
48+
IDENT "u8"
3749
R_PAREN ")"
3850
WHITESPACE " "
3951
RET_TYPE
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
extern "C" { fn printf(format: *const i8, ...) -> i32; }
1+
extern "C" { fn printf(format: *const i8, ..., _: u8) -> i32; }

crates/parser/test_data/parser/inline/ok/0156_fn_def_param.rast

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ SOURCE_FILE
66
IDENT "foo"
77
PARAM_LIST
88
L_PAREN "("
9+
PARAM
10+
DOT3 "..."
11+
COMMA ","
12+
WHITESPACE " "
913
PARAM
1014
TUPLE_PAT
1115
L_PAREN "("
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
fn foo((x, y): (i32, i32)) {}
1+
fn foo(..., (x, y): (i32, i32)) {}

0 commit comments

Comments
 (0)