fn parse_arg_general(&mut self, require_name: bool) -> PResult<'a, Arg> {
maybe_whole!(self, NtArg, |x| x);
+ if let Ok(Some(_)) = self.parse_self_arg() {
+ let mut err = self.struct_span_err(self.prev_span,
+ "unexpected `self` argument in function");
+ err.span_label(self.prev_span,
+ "`self` is only valid as the first argument of a trait function");
+ return Err(err);
+ }
+
let (pat, ty) = if require_name || self.is_named_argument() {
debug!("parse_arg_general parse_pat (require_name:{})",
require_name);
fn parse_fn_args(&mut self, named_args: bool, allow_variadic: bool)
-> PResult<'a, (Vec<Arg> , bool)> {
self.expect(&token::OpenDelim(token::Paren))?;
-
- if let Ok(Some(_)) = self.parse_self_arg() {
- let mut err = self.struct_span_err(self.prev_span
- , "unexpected `self` argument in bare function");
- err.span_label(self.prev_span, "invalid argument in bare function");
- return Err(err);
- }
-
+
let sp = self.span;
let mut variadic = false;
let args: Vec<Option<Arg>> =
--- /dev/null
+struct Foo {}
+
+impl Foo {
+ fn c(foo: u32, self) {}
+ //~^ ERROR unexpected `self` argument in function
+ //~| NOTE `self` is only valid as the first argument of a trait function
+
+ fn good(&mut self, foo: u32) {}
+}
+
+fn main() { }