diff --git a/src/libsyntax/parse/obsolete.rs b/src/libsyntax/parse/obsolete.rs index 1a4c08747bfa..3dadc90321ca 100644 --- a/src/libsyntax/parse/obsolete.rs +++ b/src/libsyntax/parse/obsolete.rs @@ -18,7 +18,8 @@ pub enum ObsoleteSyntax { ObsoleteLet, ObsoleteFieldTerminator, ObsoleteStructCtor, - ObsoleteWith + ObsoleteWith, + ObsoleteClassMethod, } impl ObsoleteSyntax : cmp::Eq { @@ -71,6 +72,10 @@ impl parser : ObsoleteReporter { "record update is done with `..`, e.g. \ `MyStruct { foo: bar, .. baz }`" ), + ObsoleteClassMethod => ( + "class method", + "methods should be defined inside impls" + ), }; self.report(sp, kind, kind_str, desc); diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index e597d33a836d..aff662a3f359 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -19,7 +19,7 @@ use obsolete::{ ObsoleteReporter, ObsoleteSyntax, ObsoleteLowerCaseKindBounds, ObsoleteLet, ObsoleteFieldTerminator, ObsoleteStructCtor, - ObsoleteWith + ObsoleteWith, ObsoleteClassMethod }; use ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute, bind_by_ref, bind_by_implicit_ref, bind_by_value, bind_by_move, @@ -2778,25 +2778,35 @@ impl parser { let obsolete_let = self.eat_obsolete_ident("let"); if obsolete_let { self.obsolete(copy self.last_span, ObsoleteLet) } - let a_var = self.parse_instance_var(vis); - match self.token { - token::SEMI => { - self.obsolete(copy self.span, ObsoleteFieldTerminator); - self.bump(); - } - token::COMMA => { - self.bump(); - } - token::RBRACE => {} - _ => { - self.span_fatal(copy self.span, - fmt!("expected `;`, `,`, or '}' but \ - found `%s`", - token_to_str(self.reader, - self.token))); - } + let parse_obsolete_method = + !((obsolete_let || self.is_keyword(~"mut") || + !self.is_any_keyword(copy self.token)) + && !self.token_is_pound_or_doc_comment(copy self.token)); + + if !parse_obsolete_method { + let a_var = self.parse_instance_var(vis); + match self.token { + token::SEMI => { + self.obsolete(copy self.span, ObsoleteFieldTerminator); + self.bump(); + } + token::COMMA => { + self.bump(); + } + token::RBRACE => {} + _ => { + self.span_fatal(copy self.span, + fmt!("expected `;`, `,`, or '}' but \ + found `%s`", + token_to_str(self.reader, + self.token))); + } + } + return a_var; + } else { + self.obsolete(copy self.span, ObsoleteClassMethod); + return @method_member(self.parse_method(vis)); } - return a_var; } fn parse_dtor(attrs: ~[attribute]) -> class_contents { diff --git a/src/test/compile-fail/obsolete-syntax.rs b/src/test/compile-fail/obsolete-syntax.rs index a6665ddbfd57..5f147e035f97 100644 --- a/src/test/compile-fail/obsolete-syntax.rs +++ b/src/test/compile-fail/obsolete-syntax.rs @@ -19,6 +19,14 @@ struct s { //~^ ERROR obsolete syntax: struct constructor } +struct ss { + fn foo() { } + //~^ ERROR obsolete syntax: class method + #[whatever] + fn foo() { } + //~^ ERROR obsolete syntax: class method +} + fn obsolete_with() { struct S { foo: (),