Skip to content

Commit

Permalink
Tell the compiler to tell us that deriving is dead.
Browse files Browse the repository at this point in the history
I'm beginning to suspect it's impossible to avoid accidentally writing
`#[deriving]` at least once in every program, and it results in
non-intuitive error messages: "Foo doesn't have any method in scope
`clone`" despite there being a `#[deriv...(Clone)]` attribute!

Also, lots of documentation around the internet uses `#[deriving]` so
providing this guidance is very helpful (lots of people ask in #rust
about this error).

Fixes #21166.
  • Loading branch information
huonw committed Jan 24, 2015
1 parent 4be79d6 commit ae4e1a1
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/libsyntax/ext/base.rs
Expand Up @@ -467,6 +467,8 @@ fn initial_syntax_expander_table(ecfg: &expand::ExpansionConfig) -> SyntaxEnv {
ext::log_syntax::expand_syntax_ext));
syntax_expanders.insert(intern("derive"),
Decorator(box ext::deriving::expand_meta_derive));
syntax_expanders.insert(intern("deriving"),
Decorator(box ext::deriving::expand_deprecated_deriving));

if ecfg.enable_quotes {
// Quasi-quoting expanders
Expand Down
8 changes: 8 additions & 0 deletions src/libsyntax/ext/deriving/mod.rs
Expand Up @@ -40,6 +40,14 @@ pub mod totalord;

pub mod generic;

pub fn expand_deprecated_deriving(cx: &mut ExtCtxt,
span: Span,
_: &MetaItem,
_: &Item,
_: Box<FnMut(P<Item>)>) {
cx.span_err(span, "`deriving` has been renamed to `derive`");
}

pub fn expand_meta_derive(cx: &mut ExtCtxt,
_span: Span,
mitem: &MetaItem,
Expand Down
15 changes: 15 additions & 0 deletions src/test/compile-fail/deriving-is-deprecated.rs
@@ -0,0 +1,15 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.


#[deriving(Clone)] //~ ERROR `deriving` has been renamed to `derive`
struct Foo;

fn main() {}

0 comments on commit ae4e1a1

Please sign in to comment.