syntax_expanders.insert(@~"log_syntax",
builtin_normal_tt(
ext::log_syntax::expand_syntax_ext));
+ syntax_expanders.insert(@~"deriving",
+ @SE(ItemDecorator(
+ ext::deriving::expand_meta_deriving)));
syntax_expanders.insert(@~"deriving_eq",
@SE(ItemDecorator(
ext::deriving::expand_deriving_eq)));
ident,
y: &Generics) -> @item;
+pub fn expand_meta_deriving(cx: ext_ctxt,
+ _span: span,
+ mitem: @meta_item,
+ in_items: ~[@item])
+ -> ~[@item] {
+ use ast::{meta_list, meta_name_value, meta_word};
+
+ match mitem.node {
+ meta_name_value(_, l) => {
+ cx.span_err(l.span, ~"unexpected value in `deriving`");
+ in_items
+ }
+ meta_word(_) | meta_list(_, []) => {
+ cx.span_warn(mitem.span, ~"empty trait list in `deriving`");
+ in_items
+ }
+ meta_list(_, titems) => {
+ do titems.foldr(in_items) |&titem, in_items| {
+ match titem.node {
+ meta_name_value(tname, _) |
+ meta_list(tname, _) |
+ meta_word(tname) => {
+ match *tname {
+ ~"Clone" => expand_deriving_clone(cx,
+ titem.span, titem, in_items),
+ ~"Eq" => expand_deriving_eq(cx, titem.span,
+ titem, in_items),
+ ~"IterBytes" => expand_deriving_iter_bytes(cx,
+ titem.span, titem, in_items),
+ tname => {
+ cx.span_err(titem.span, fmt!("unknown \
+ `deriving` trait: `%s`", tname));
+ in_items
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
pub fn expand_deriving_eq(cx: ext_ctxt,
span: span,
_mitem: @meta_item,
--- /dev/null
+// Copyright 2013 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(Eqr)] //~ ERROR unknown `deriving` trait: `Eqr`
+struct Foo;
+
+pub fn main() {}
--- /dev/null
+// xfail-pretty
+
+// Copyright 2013 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] //~ WARNING empty trait list in `deriving`
+struct Foo;
+
+#[deriving()] //~ WARNING empty trait list in `deriving`
+struct Bar;
+
+pub fn main() {}
--- /dev/null
+// xfail-fast
+
+// Copyright 2013 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(Eq)]
+#[deriving(Clone)]
+#[deriving(IterBytes)]
+struct Foo {
+ bar: uint,
+ baz: int
+}
+
+pub fn main() {
+ use core::hash::{Hash, HashUtil}; // necessary for IterBytes check
+
+ let a = Foo {bar: 4, baz: -3};
+
+ a == a; // check for Eq impl w/o testing its correctness
+ a.clone(); // check for Clone impl w/o testing its correctness
+ a.hash(); // check for IterBytes impl w/o testing its correctness
+}
--- /dev/null
+// xfail-fast
+
+// Copyright 2013 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(Eq, Clone, IterBytes)]
+struct Foo {
+ bar: uint,
+ baz: int
+}
+
+pub fn main() {
+ use core::hash::{Hash, HashUtil}; // necessary for IterBytes check
+
+ let a = Foo {bar: 4, baz: -3};
+
+ a == a; // check for Eq impl w/o testing its correctness
+ a.clone(); // check for Clone impl w/o testing its correctness
+ a.hash(); // check for IterBytes impl w/o testing its correctness
+}