@@ -1031,13 +1031,10 @@ impl<'a> Parser<'a> {
10311031 let pat = self . mk_pat_ident ( ty. span , bm, ident) ;
10321032 ( pat, ty)
10331033 }
1034+ // If this is a C-variadic argument and we hit an error, return the error.
1035+ Err ( err) if self . token == token:: DotDotDot => return Err ( err) ,
1036+ // Recover from attempting to parse the argument as a type without pattern.
10341037 Err ( mut err) => {
1035- // If this is a C-variadic argument and we hit an error, return the
1036- // error.
1037- if self . token == token:: DotDotDot {
1038- return Err ( err) ;
1039- }
1040- // Recover from attempting to parse the argument as a type without pattern.
10411038 err. cancel ( ) ;
10421039 mem:: replace ( self , parser_snapshot_before_ty) ;
10431040 self . recover_arg_parse ( ) ?
@@ -1200,42 +1197,44 @@ impl<'a> Parser<'a> {
12001197
12011198 }
12021199
1203- fn parse_fn_params ( & mut self , named_params : bool , allow_c_variadic : bool )
1204- -> PResult < ' a , Vec < Param > > {
1200+ fn parse_fn_params (
1201+ & mut self ,
1202+ named_params : bool ,
1203+ allow_c_variadic : bool ,
1204+ ) -> PResult < ' a , Vec < Param > > {
12051205 let sp = self . token . span ;
1206+ let do_not_enforce_named_params_for_c_variadic = |token : & token:: Token | {
1207+ match token. kind {
1208+ token:: DotDotDot => false ,
1209+ _ => named_params,
1210+ }
1211+ } ;
12061212 let mut c_variadic = false ;
1207- let ( params, _) : ( Vec < Option < Param > > , _ ) = self . parse_paren_comma_seq ( |p| {
1208- let do_not_enforce_named_arguments_for_c_variadic =
1209- |token : & token:: Token | -> bool {
1210- if token == & token:: DotDotDot {
1211- false
1212- } else {
1213- named_params
1214- }
1215- } ;
1213+ let ( params, _) = self . parse_paren_comma_seq ( |p| {
12161214 match p. parse_param_general (
12171215 false ,
12181216 false ,
12191217 allow_c_variadic,
1220- do_not_enforce_named_arguments_for_c_variadic
1218+ do_not_enforce_named_params_for_c_variadic ,
12211219 ) {
1222- Ok ( param) => {
1220+ Ok ( param) => Ok (
12231221 if let TyKind :: CVarArgs = param. ty . kind {
12241222 c_variadic = true ;
12251223 if p. token != token:: CloseDelim ( token:: Paren ) {
1226- let span = p. token . span ;
1227- p. span_err ( span,
1228- "`...` must be the last argument of a C-variadic function" ) ;
1224+ p. span_err (
1225+ p. token . span ,
1226+ "`...` must be the last argument of a C-variadic function" ,
1227+ ) ;
12291228 // FIXME(eddyb) this should probably still push `CVarArgs`.
12301229 // Maybe AST validation/HIR lowering should emit the above error?
1231- Ok ( None )
1230+ None
12321231 } else {
1233- Ok ( Some ( param) )
1232+ Some ( param)
12341233 }
12351234 } else {
1236- Ok ( Some ( param) )
1235+ Some ( param)
12371236 }
1238- } ,
1237+ ) ,
12391238 Err ( mut e) => {
12401239 e. emit ( ) ;
12411240 let lo = p. prev_span ;
@@ -1251,8 +1250,10 @@ impl<'a> Parser<'a> {
12511250 let params: Vec < _ > = params. into_iter ( ) . filter_map ( |x| x) . collect ( ) ;
12521251
12531252 if c_variadic && params. len ( ) <= 1 {
1254- self . span_err ( sp,
1255- "C-variadic function must be declared with at least one named argument" ) ;
1253+ self . span_err (
1254+ sp,
1255+ "C-variadic function must be declared with at least one named argument" ,
1256+ ) ;
12561257 }
12571258
12581259 Ok ( params)
0 commit comments