diff --git a/src/libsyntax/ext/deriving/clone.rs b/src/libsyntax/ext/deriving/clone.rs
index 6ff39351448..118ada116d9 100644
--- a/src/libsyntax/ext/deriving/clone.rs
+++ b/src/libsyntax/ext/deriving/clone.rs
@@ -30,6 +30,7 @@ pub fn expand_deriving_clone(cx: @ExtCtxt,
                 explicit_self: borrowed_explicit_self(),
                 args: ~[],
                 ret_ty: Self,
+                inline: true,
                 const_nonmatching: false,
                 combine_substructure: |c, s, sub| cs_clone("Clone", c, s, sub)
             }
@@ -55,6 +56,7 @@ pub fn expand_deriving_deep_clone(cx: @ExtCtxt,
                 explicit_self: borrowed_explicit_self(),
                 args: ~[],
                 ret_ty: Self,
+                inline: true,
                 const_nonmatching: false,
                 // cs_clone uses the ident passed to it, i.e. it will
                 // call deep_clone (not clone) here.
diff --git a/src/libsyntax/ext/deriving/cmp/eq.rs b/src/libsyntax/ext/deriving/cmp/eq.rs
index 468e3e5e7f2..eb07d2d209c 100644
--- a/src/libsyntax/ext/deriving/cmp/eq.rs
+++ b/src/libsyntax/ext/deriving/cmp/eq.rs
@@ -37,6 +37,7 @@ pub fn expand_deriving_eq(cx: @ExtCtxt,
                 explicit_self: borrowed_explicit_self(),
                 args: ~[borrowed_self()],
                 ret_ty: Literal(Path::new(~["bool"])),
+                inline: true,
                 const_nonmatching: true,
                 combine_substructure: $f
             }
diff --git a/src/libsyntax/ext/deriving/cmp/ord.rs b/src/libsyntax/ext/deriving/cmp/ord.rs
index 33f45d45bdb..95d617af0c7 100644
--- a/src/libsyntax/ext/deriving/cmp/ord.rs
+++ b/src/libsyntax/ext/deriving/cmp/ord.rs
@@ -27,6 +27,7 @@ pub fn expand_deriving_ord(cx: @ExtCtxt,
                 explicit_self: borrowed_explicit_self(),
                 args: ~[borrowed_self()],
                 ret_ty: Literal(Path::new(~["bool"])),
+                inline: true,
                 const_nonmatching: false,
                 combine_substructure: |cx, span, substr| cs_op($op, $equal, cx, span, substr)
             }
diff --git a/src/libsyntax/ext/deriving/cmp/totaleq.rs b/src/libsyntax/ext/deriving/cmp/totaleq.rs
index c6123451071..51965e1b582 100644
--- a/src/libsyntax/ext/deriving/cmp/totaleq.rs
+++ b/src/libsyntax/ext/deriving/cmp/totaleq.rs
@@ -34,6 +34,7 @@ pub fn expand_deriving_totaleq(cx: @ExtCtxt,
                 explicit_self: borrowed_explicit_self(),
                 args: ~[borrowed_self()],
                 ret_ty: Literal(Path::new(~["bool"])),
+                inline: true,
                 const_nonmatching: true,
                 combine_substructure: cs_equals
             }
diff --git a/src/libsyntax/ext/deriving/cmp/totalord.rs b/src/libsyntax/ext/deriving/cmp/totalord.rs
index 34c6d1104da..217acd98c68 100644
--- a/src/libsyntax/ext/deriving/cmp/totalord.rs
+++ b/src/libsyntax/ext/deriving/cmp/totalord.rs
@@ -31,6 +31,7 @@ pub fn expand_deriving_totalord(cx: @ExtCtxt,
                 explicit_self: borrowed_explicit_self(),
                 args: ~[borrowed_self()],
                 ret_ty: Literal(Path::new(~["std", "cmp", "Ordering"])),
+                inline: true,
                 const_nonmatching: false,
                 combine_substructure: cs_cmp
             }
diff --git a/src/libsyntax/ext/deriving/decodable.rs b/src/libsyntax/ext/deriving/decodable.rs
index 4ad835f032f..3f745d64a7b 100644
--- a/src/libsyntax/ext/deriving/decodable.rs
+++ b/src/libsyntax/ext/deriving/decodable.rs
@@ -39,6 +39,7 @@ pub fn expand_deriving_decodable(cx: @ExtCtxt,
                 args: ~[Ptr(~Literal(Path::new_local("__D")),
                             Borrowed(None, MutMutable))],
                 ret_ty: Self,
+                inline: false,
                 const_nonmatching: true,
                 combine_substructure: decodable_substructure,
             },
diff --git a/src/libsyntax/ext/deriving/default.rs b/src/libsyntax/ext/deriving/default.rs
index 6bc2b06806b..866df36bba4 100644
--- a/src/libsyntax/ext/deriving/default.rs
+++ b/src/libsyntax/ext/deriving/default.rs
@@ -30,6 +30,7 @@ pub fn expand_deriving_default(cx: @ExtCtxt,
                 explicit_self: None,
                 args: ~[],
                 ret_ty: Self,
+                inline: true,
                 const_nonmatching: false,
                 combine_substructure: default_substructure
             },
diff --git a/src/libsyntax/ext/deriving/encodable.rs b/src/libsyntax/ext/deriving/encodable.rs
index a037a4daabf..899100f14ba 100644
--- a/src/libsyntax/ext/deriving/encodable.rs
+++ b/src/libsyntax/ext/deriving/encodable.rs
@@ -101,6 +101,7 @@ pub fn expand_deriving_encodable(cx: @ExtCtxt,
                 args: ~[Ptr(~Literal(Path::new_local("__E")),
                             Borrowed(None, MutMutable))],
                 ret_ty: nil_ty(),
+                inline: false,
                 const_nonmatching: true,
                 combine_substructure: encodable_substructure,
             },
diff --git a/src/libsyntax/ext/deriving/generic.rs b/src/libsyntax/ext/deriving/generic.rs
index b37757341ef..aa83b7656a6 100644
--- a/src/libsyntax/ext/deriving/generic.rs
+++ b/src/libsyntax/ext/deriving/generic.rs
@@ -218,6 +218,9 @@ pub struct MethodDef<'self> {
     /// Return type
     ret_ty: Ty<'self>,
 
+    /// Whether to mark this as #[inline]
+    inline: bool,
+
     /// if the value of the nonmatching enums is independent of the
     /// actual enum variants, i.e. can use _ => .. match.
     const_nonmatching: bool,
@@ -553,11 +556,16 @@ impl<'self> MethodDef<'self> {
         let fn_decl = cx.fn_decl(args, ret_type);
         let body_block = cx.block_expr(body);
 
+        let attrs = if self.inline {
+            ~[cx.attribute(trait_span, cx.meta_word(trait_span, @"inline"))]
+        } else {
+            ~[]
+        };
 
         // Create the method.
         @ast::method {
             ident: method_ident,
-            attrs: ~[],
+            attrs: attrs,
             generics: fn_generics,
             explicit_self: explicit_self,
             purity: ast::impure_fn,
diff --git a/src/libsyntax/ext/deriving/iter_bytes.rs b/src/libsyntax/ext/deriving/iter_bytes.rs
index 82f449fc116..fed630cc668 100644
--- a/src/libsyntax/ext/deriving/iter_bytes.rs
+++ b/src/libsyntax/ext/deriving/iter_bytes.rs
@@ -33,6 +33,7 @@ pub fn expand_deriving_iter_bytes(cx: @ExtCtxt,
                     Literal(Path::new(~["std", "to_bytes", "Cb"]))
                 ],
                 ret_ty: Literal(Path::new(~["bool"])),
+                inline: true,
                 const_nonmatching: false,
                 combine_substructure: iter_bytes_substructure
             }
diff --git a/src/libsyntax/ext/deriving/primitive.rs b/src/libsyntax/ext/deriving/primitive.rs
index 38c30def1d1..77b0d913dcd 100644
--- a/src/libsyntax/ext/deriving/primitive.rs
+++ b/src/libsyntax/ext/deriving/primitive.rs
@@ -35,6 +35,8 @@ pub fn expand_deriving_from_primitive(cx: @ExtCtxt,
                                            None,
                                            ~[~Self],
                                            true)),
+                // liable to cause code-bloat
+                inline: true,
                 const_nonmatching: false,
                 combine_substructure: |c, s, sub| cs_from("i64", c, s, sub),
             },
@@ -49,6 +51,8 @@ pub fn expand_deriving_from_primitive(cx: @ExtCtxt,
                                            None,
                                            ~[~Self],
                                            true)),
+                // liable to cause code-bloat
+                inline: true,
                 const_nonmatching: false,
                 combine_substructure: |c, s, sub| cs_from("u64", c, s, sub),
             },
diff --git a/src/libsyntax/ext/deriving/rand.rs b/src/libsyntax/ext/deriving/rand.rs
index d014816c070..2a16d0b025d 100644
--- a/src/libsyntax/ext/deriving/rand.rs
+++ b/src/libsyntax/ext/deriving/rand.rs
@@ -39,6 +39,7 @@ pub fn expand_deriving_rand(cx: @ExtCtxt,
                         Borrowed(None, ast::MutMutable))
                 ],
                 ret_ty: Self,
+                inline: false,
                 const_nonmatching: false,
                 combine_substructure: rand_substructure
             }
diff --git a/src/libsyntax/ext/deriving/to_str.rs b/src/libsyntax/ext/deriving/to_str.rs
index 69e5ce566f4..26f4668ccfd 100644
--- a/src/libsyntax/ext/deriving/to_str.rs
+++ b/src/libsyntax/ext/deriving/to_str.rs
@@ -31,6 +31,7 @@ pub fn expand_deriving_to_str(cx: @ExtCtxt,
                 explicit_self: borrowed_explicit_self(),
                 args: ~[],
                 ret_ty: Ptr(~Literal(Path::new_local("str")), Send),
+                inline: false,
                 const_nonmatching: false,
                 combine_substructure: to_str_substructure
             }
diff --git a/src/libsyntax/ext/deriving/zero.rs b/src/libsyntax/ext/deriving/zero.rs
index 827491ad8cb..939c7b55844 100644
--- a/src/libsyntax/ext/deriving/zero.rs
+++ b/src/libsyntax/ext/deriving/zero.rs
@@ -30,6 +30,7 @@ pub fn expand_deriving_zero(cx: @ExtCtxt,
                 explicit_self: None,
                 args: ~[],
                 ret_ty: Self,
+                inline: true,
                 const_nonmatching: false,
                 combine_substructure: zero_substructure
             },
@@ -39,6 +40,7 @@ pub fn expand_deriving_zero(cx: @ExtCtxt,
                 explicit_self: borrowed_explicit_self(),
                 args: ~[],
                 ret_ty: Literal(Path::new(~["bool"])),
+                inline: true,
                 const_nonmatching: false,
                 combine_substructure: |cx, span, substr| {
                     cs_and(|cx, span, _, _| cx.span_bug(span,