From 6957af770bb92b71485f852beb9071733e5f178b Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 10 Sep 2012 18:00:03 -0700 Subject: [PATCH] Report obsolete trait lists on structs --- src/libsyntax/parse/obsolete.rs | 6 ++++++ src/libsyntax/parse/parser.rs | 8 +++++--- src/test/compile-fail/class-method-missing.rs | 5 ++++- src/test/compile-fail/obsolete-syntax.rs | 4 ++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/libsyntax/parse/obsolete.rs b/src/libsyntax/parse/obsolete.rs index 3dadc90321c..9a2b6474b19 100644 --- a/src/libsyntax/parse/obsolete.rs +++ b/src/libsyntax/parse/obsolete.rs @@ -20,6 +20,7 @@ pub enum ObsoleteSyntax { ObsoleteStructCtor, ObsoleteWith, ObsoleteClassMethod, + ObsoleteClassTraits } impl ObsoleteSyntax : cmp::Eq { @@ -76,6 +77,11 @@ impl parser : ObsoleteReporter { "class method", "methods should be defined inside impls" ), + ObsoleteClassTraits => ( + "class traits", + "implemented traits are specified on the impl, as in \ + `impl foo : bar {`" + ), }; self.report(sp, kind, kind_str, desc); diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index aff662a3f35..49fa14c5b7d 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, ObsoleteClassMethod + ObsoleteWith, ObsoleteClassMethod, ObsoleteClassTraits }; use ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute, bind_by_ref, bind_by_implicit_ref, bind_by_value, bind_by_move, @@ -2648,8 +2648,10 @@ impl parser { let class_name = self.parse_value_ident(); self.parse_region_param(); let ty_params = self.parse_ty_params(); - let traits : ~[@trait_ref] = if self.eat(token::COLON) - { self.parse_trait_ref_list(token::LBRACE) } + let traits : ~[@trait_ref] = if self.eat(token::COLON) { + self.obsolete(copy self.span, ObsoleteClassTraits); + self.parse_trait_ref_list(token::LBRACE) + } else { ~[] }; let mut fields: ~[@struct_field]; diff --git a/src/test/compile-fail/class-method-missing.rs b/src/test/compile-fail/class-method-missing.rs index 955c3e8aa46..642a26e6e9e 100644 --- a/src/test/compile-fail/class-method-missing.rs +++ b/src/test/compile-fail/class-method-missing.rs @@ -3,10 +3,13 @@ trait animal { fn eat(); } -struct cat : animal { +struct cat { meows: uint, } +impl cat : animal { +} + fn cat(in_x : uint) -> cat { cat { meows: in_x diff --git a/src/test/compile-fail/obsolete-syntax.rs b/src/test/compile-fail/obsolete-syntax.rs index 5f147e035f9..9a3939692f5 100644 --- a/src/test/compile-fail/obsolete-syntax.rs +++ b/src/test/compile-fail/obsolete-syntax.rs @@ -27,6 +27,10 @@ struct ss { //~^ ERROR obsolete syntax: class method } +struct q : r { + //~^ ERROR obsolete syntax: class traits +} + fn obsolete_with() { struct S { foo: (),