Skip to content

Commit fe23ffb

Browse files
committed
improve error when self is used as not the first argument
1 parent 646d68f commit fe23ffb

File tree

5 files changed

+30
-13
lines changed

5 files changed

+30
-13
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,6 +1824,14 @@ impl<'a> Parser<'a> {
18241824
fn parse_arg_general(&mut self, require_name: bool) -> PResult<'a, Arg> {
18251825
maybe_whole!(self, NtArg, |x| x);
18261826

1827+
if let Ok(Some(_)) = self.parse_self_arg() {
1828+
let mut err = self.struct_span_err(self.prev_span,
1829+
"unexpected `self` argument in function");
1830+
err.span_label(self.prev_span,
1831+
"`self` is only valid as the first argument of a trait function");
1832+
return Err(err);
1833+
}
1834+
18271835
let (pat, ty) = if require_name || self.is_named_argument() {
18281836
debug!("parse_arg_general parse_pat (require_name:{})",
18291837
require_name);
@@ -5386,14 +5394,7 @@ impl<'a> Parser<'a> {
53865394
fn parse_fn_args(&mut self, named_args: bool, allow_variadic: bool)
53875395
-> PResult<'a, (Vec<Arg> , bool)> {
53885396
self.expect(&token::OpenDelim(token::Paren))?;
5389-
5390-
if let Ok(Some(_)) = self.parse_self_arg() {
5391-
let mut err = self.struct_span_err(self.prev_span
5392-
, "unexpected `self` argument in bare function");
5393-
err.span_label(self.prev_span, "invalid argument in bare function");
5394-
return Err(err);
5395-
}
5396-
5397+
53975398
let sp = self.span;
53985399
let mut variadic = false;
53995400
let args: Vec<Option<Arg>> =

src/test/ui/bare-function-self.rs

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
fn a(&self) { }
2+
//~^ ERROR unexpected `self` argument in function
3+
//~| NOTE `self` is only valid as the first argument of a trait function
4+
5+
fn main() { }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
fn b(foo: u32, &mut self) { }
2+
//~^ ERROR unexpected `self` argument in function
3+
//~| NOTE `self` is only valid as the first argument of a trait function
4+
5+
fn main() { }
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
struct Foo {}
2+
3+
impl Foo {
4+
fn c(foo: u32, self) {}
5+
//~^ ERROR unexpected `self` argument in function
6+
//~| NOTE `self` is only valid as the first argument of a trait function
7+
8+
fn good(&mut self, foo: u32) {}
9+
}
10+
11+
fn main() { }

0 commit comments

Comments
 (0)