diff --git a/src/librustdoc/astsrv.rs b/src/librustdoc/astsrv.rs
index 27c294510d7..f76084d5fb9 100644
--- a/src/librustdoc/astsrv.rs
+++ b/src/librustdoc/astsrv.rs
@@ -62,19 +62,19 @@ impl Srv: Clone {
     fn clone(&self) -> Srv { copy *self }
 }
 
-pub fn from_str<T>(source: ~str, owner: SrvOwner<T>) -> T {
+pub fn from_str<T>(+source: ~str, owner: SrvOwner<T>) -> T {
     run(owner, copy source, parse::from_str_sess)
 }
 
-pub fn from_file<T>(file: ~str, owner: SrvOwner<T>) -> T {
+pub fn from_file<T>(+file: ~str, owner: SrvOwner<T>) -> T {
     run(owner, copy file, |sess, f| parse::from_file_sess(sess, &Path(f)))
 }
 
-fn run<T>(owner: SrvOwner<T>, source: ~str, +parse: Parser) -> T {
+fn run<T>(owner: SrvOwner<T>, +source: ~str, +parse: Parser) -> T {
 
     let srv_ = Srv({
         ch: do util::spawn_listener |copy source, move parse, po| {
-            act(po, copy source, parse);
+            act(po, copy source, copy parse);
         }
     });
 
@@ -83,7 +83,7 @@ fn run<T>(owner: SrvOwner<T>, source: ~str, +parse: Parser) -> T {
     move res
 }
 
-fn act(po: oldcomm::Port<Msg>, source: ~str, parse: Parser) {
+fn act(po: oldcomm::Port<Msg>, +source: ~str, +parse: Parser) {
     let sess = build_session();
 
     let ctxt = build_ctxt(
diff --git a/src/librustdoc/attr_pass.rs b/src/librustdoc/attr_pass.rs
index 3fac9ab2733..c4671f0e839 100644
--- a/src/librustdoc/attr_pass.rs
+++ b/src/librustdoc/attr_pass.rs
@@ -221,7 +221,7 @@ fn fold_trait(
 fn merge_method_attrs(
     srv: astsrv::Srv,
     item_id: doc::AstId,
-    docs: ~[doc::MethodDoc]
+    +docs: ~[doc::MethodDoc]
 ) -> ~[doc::MethodDoc] {
 
     // Create an assoc list from method name to attributes
@@ -319,7 +319,7 @@ mod test {
     use doc;
     use extract;
 
-    pub fn mk_doc(source: ~str) -> doc::Doc {
+    pub fn mk_doc(+source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
             let doc = extract::from_srv(srv, ~"");
             run(srv, doc)
diff --git a/src/librustdoc/demo.rs b/src/librustdoc/demo.rs
index 4a046aaf503..81b10666673 100644
--- a/src/librustdoc/demo.rs
+++ b/src/librustdoc/demo.rs
@@ -39,8 +39,8 @@ enum OmNomNomy {
 }
 
 fn take_my_order_please(
-    _waitperson: WaitPerson,
-    _order: ~[OmNomNomy]
+    +_waitperson: WaitPerson,
+    +_order: ~[OmNomNomy]
 ) -> uint {
 
     /*!
diff --git a/src/librustdoc/desc_to_brief_pass.rs b/src/librustdoc/desc_to_brief_pass.rs
index 6d608c9ef7a..b6632c602ff 100644
--- a/src/librustdoc/desc_to_brief_pass.rs
+++ b/src/librustdoc/desc_to_brief_pass.rs
@@ -52,7 +52,7 @@ fn fold_item(fold: &fold::Fold<()>, +doc: doc::ItemDoc) -> doc::ItemDoc {
     let doc = fold::default_seq_fold_item(fold, doc);
 
     doc::ItemDoc {
-        brief: extract(doc.desc),
+        brief: extract(copy doc.desc),
         .. doc
     }
 }
@@ -62,7 +62,7 @@ fn fold_trait(fold: &fold::Fold<()>, +doc: doc::TraitDoc) -> doc::TraitDoc {
 
     doc::TraitDoc {
         methods: par::map(doc.methods, |doc| doc::MethodDoc {
-            brief: extract(doc.desc),
+            brief: extract(copy doc.desc),
             .. copy *doc
         }),
         .. doc
@@ -74,7 +74,7 @@ fn fold_impl(fold: &fold::Fold<()>, +doc: doc::ImplDoc) -> doc::ImplDoc {
 
     doc::ImplDoc {
         methods: par::map(doc.methods, |doc| doc::MethodDoc {
-            brief: extract(doc.desc),
+            brief: extract(copy doc.desc),
             .. copy *doc
         }),
         .. doc
@@ -108,7 +108,7 @@ pub mod test {
     use doc;
     use extract;
 
-    pub fn mk_doc(source: ~str) -> doc::Doc {
+    pub fn mk_doc(+source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
             let doc = extract::from_srv(srv, ~"");
             let doc = (attr_pass::mk_pass().f)(srv, doc);
@@ -117,7 +117,7 @@ pub mod test {
     }
 }
 
-fn extract(desc: Option<~str>) -> Option<~str> {
+fn extract(+desc: Option<~str>) -> Option<~str> {
     if desc.is_none() {
         return None
     }
@@ -125,7 +125,7 @@ fn extract(desc: Option<~str>) -> Option<~str> {
     parse_desc((copy desc).get())
 }
 
-fn parse_desc(desc: ~str) -> Option<~str> {
+fn parse_desc(+desc: ~str) -> Option<~str> {
 
     const max_brief_len: uint = 120u;
 
@@ -141,7 +141,7 @@ fn parse_desc(desc: ~str) -> Option<~str> {
     }
 }
 
-fn first_sentence(s: ~str) -> Option<~str> {
+fn first_sentence(+s: ~str) -> Option<~str> {
     let paras = paragraphs(copy s);
     if !paras.is_empty() {
         let first_para = vec::head(paras);
@@ -151,7 +151,7 @@ fn first_sentence(s: ~str) -> Option<~str> {
     }
 }
 
-fn first_sentence_(s: ~str) -> ~str {
+fn first_sentence_(+s: ~str) -> ~str {
     let mut dotcount = 0;
     // The index of the character following a single dot. This allows
     // Things like [0..1) to appear in the brief description
@@ -182,7 +182,7 @@ fn first_sentence_(s: ~str) -> ~str {
     }
 }
 
-fn paragraphs(s: ~str) -> ~[~str] {
+fn paragraphs(+s: ~str) -> ~[~str] {
     let lines = str::lines_any(s);
     let mut whitespace_lines = 0;
     let mut accum = ~"";
@@ -233,7 +233,7 @@ fn test_paragraphs_2() {
 #[test]
 fn should_promote_short_descs() {
     let desc = Some(~"desc");
-    let brief = extract(desc);
+    let brief = extract(copy desc);
     assert brief == desc;
 }
 
diff --git a/src/librustdoc/escape_pass.rs b/src/librustdoc/escape_pass.rs
index 6e000444865..3e14c6f92ce 100644
--- a/src/librustdoc/escape_pass.rs
+++ b/src/librustdoc/escape_pass.rs
@@ -19,7 +19,7 @@ pub fn mk_pass() -> Pass {
     text_pass::mk_pass(~"escape", escape)
 }
 
-fn escape(s: ~str) -> ~str {
+fn escape(s: &str) -> ~str {
     str::replace(s, ~"\\", ~"\\\\")
 }
 
diff --git a/src/librustdoc/extract.rs b/src/librustdoc/extract.rs
index 593023ae467..70e4d547bd4 100644
--- a/src/librustdoc/extract.rs
+++ b/src/librustdoc/extract.rs
@@ -71,7 +71,7 @@ fn top_moddoc_from_crate(
     +default_name: ~str
 ) -> doc::ModDoc {
     moddoc_from_mod(mk_itemdoc(ast::crate_node_id, default_name),
-                    crate.node.module)
+                    copy crate.node.module)
 }
 
 fn mk_itemdoc(id: ast::node_id, +name: ~str) -> doc::ItemDoc {
@@ -88,7 +88,7 @@ fn mk_itemdoc(id: ast::node_id, +name: ~str) -> doc::ItemDoc {
 
 fn moddoc_from_mod(
     +itemdoc: doc::ItemDoc,
-    module_: ast::_mod
+    +module_: ast::_mod
 ) -> doc::ModDoc {
     doc::ModDoc {
         item: itemdoc,
@@ -149,7 +149,7 @@ fn moddoc_from_mod(
 
 fn nmoddoc_from_mod(
     +itemdoc: doc::ItemDoc,
-    module_: ast::foreign_mod
+    +module_: ast::foreign_mod
 ) -> doc::NmodDoc {
     let mut fns = ~[];
     for module_.items.each |item| {
@@ -273,7 +273,7 @@ fn should_extract_trait_methods() {
 
 fn impldoc_from_impl(
     +itemdoc: doc::ItemDoc,
-    methods: ~[@ast::method]
+    +methods: ~[@ast::method]
 ) -> doc::ImplDoc {
     doc::ImplDoc {
         item: itemdoc,
diff --git a/src/librustdoc/page_pass.rs b/src/librustdoc/page_pass.rs
index 3597a2d1e6b..5c209b7fef4 100644
--- a/src/librustdoc/page_pass.rs
+++ b/src/librustdoc/page_pass.rs
@@ -81,7 +81,7 @@ fn make_doc_from_pages(page_port: PagePort) -> doc::Doc {
     }
 }
 
-fn find_pages(doc: doc::Doc, page_chan: PageChan) {
+fn find_pages(+doc: doc::Doc, page_chan: PageChan) {
     let fold = Fold {
         fold_crate: fold_crate,
         fold_mod: fold_mod,
@@ -101,7 +101,7 @@ fn fold_crate(
     let doc = fold::default_seq_fold_crate(fold, doc);
 
     let page = doc::CratePage(doc::CrateDoc {
-        topmod: strip_mod(doc.topmod),
+        topmod: strip_mod(copy doc.topmod),
         .. copy doc
     });
 
@@ -119,7 +119,7 @@ fn fold_mod(
 
     if doc.id() != ast::crate_node_id {
 
-        let doc = strip_mod(doc);
+        let doc = strip_mod(copy doc);
         let page = doc::ItemPage(doc::ModTag(doc));
         oldcomm::send(fold.ctxt.op, Some(page));
     }
@@ -127,7 +127,7 @@ fn fold_mod(
     doc
 }
 
-fn strip_mod(doc: doc::ModDoc) -> doc::ModDoc {
+fn strip_mod(+doc: doc::ModDoc) -> doc::ModDoc {
     doc::ModDoc {
         items: do doc.items.filtered |item| {
             match *item {
@@ -193,7 +193,7 @@ mod test {
 
     pub fn mk_doc_(
         output_style: config::OutputStyle,
-        source: ~str
+        +source: ~str
     ) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
             let doc = extract::from_srv(srv, ~"");
@@ -201,7 +201,7 @@ mod test {
         }
     }
 
-    pub fn mk_doc(source: ~str) -> doc::Doc {
+    pub fn mk_doc(+source: ~str) -> doc::Doc {
         mk_doc_(config::DocPerMod, copy source)
     }
 }
diff --git a/src/librustdoc/prune_hidden_pass.rs b/src/librustdoc/prune_hidden_pass.rs
index 40141542250..49165fbf019 100644
--- a/src/librustdoc/prune_hidden_pass.rs
+++ b/src/librustdoc/prune_hidden_pass.rs
@@ -50,7 +50,7 @@ fn fold_mod(
     }
 }
 
-fn is_hidden(srv: astsrv::Srv, doc: doc::ItemDoc) -> bool {
+fn is_hidden(srv: astsrv::Srv, +doc: doc::ItemDoc) -> bool {
     use syntax::ast_map;
 
     let id = doc.id;
@@ -76,7 +76,7 @@ pub mod test {
     use extract;
     use prune_hidden_pass::run;
 
-    pub fn mk_doc(source: ~str) -> doc::Doc {
+    pub fn mk_doc(+source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
             let doc = extract::from_srv(srv, ~"");
             run(srv, doc)
diff --git a/src/librustdoc/prune_private_pass.rs b/src/librustdoc/prune_private_pass.rs
index 1cf984e5fc5..ad39c1b9855 100644
--- a/src/librustdoc/prune_private_pass.rs
+++ b/src/librustdoc/prune_private_pass.rs
@@ -51,7 +51,7 @@ fn fold_mod(
     }
 }
 
-fn is_visible(srv: astsrv::Srv, doc: doc::ItemDoc) -> bool {
+fn is_visible(srv: astsrv::Srv, +doc: doc::ItemDoc) -> bool {
     use syntax::ast_map;
     use syntax::ast;
 
@@ -80,7 +80,7 @@ pub mod test {
     use extract;
     use prune_private_pass::run;
 
-    pub fn mk_doc(source: ~str) -> doc::Doc {
+    pub fn mk_doc(+source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
             let doc = extract::from_srv(srv, ~"");
             run(srv, doc)
diff --git a/src/librustdoc/rustdoc.rc b/src/librustdoc/rustdoc.rc
index 50147e000a1..4fc68ff802c 100644
--- a/src/librustdoc/rustdoc.rc
+++ b/src/librustdoc/rustdoc.rc
@@ -24,7 +24,6 @@
 #[legacy_records];
 
 #[allow(non_implicitly_copyable_typarams)];
-#[allow(deprecated_mode)];
 #[allow(deprecated_self)];
 
 extern mod core(vers = "0.6");
@@ -89,7 +88,7 @@ fn main() {
 }
 
 /// Runs rustdoc over the given file
-fn run(config: Config) {
+fn run(+config: Config) {
 
     let source_file = copy config.input_crate;
 
@@ -148,7 +147,7 @@ fn run(config: Config) {
     }
 }
 
-fn time<T>(what: ~str, f: fn() -> T) -> T {
+fn time<T>(+what: ~str, f: fn() -> T) -> T {
     let start = std::time::precise_time_s();
     let rv = f();
     let end = std::time::precise_time_s();
diff --git a/src/librustdoc/sectionalize_pass.rs b/src/librustdoc/sectionalize_pass.rs
index d448ea63326..d6cf2e7b5e7 100644
--- a/src/librustdoc/sectionalize_pass.rs
+++ b/src/librustdoc/sectionalize_pass.rs
@@ -44,7 +44,7 @@ pub fn run(_srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
 
 fn fold_item(fold: &fold::Fold<()>, +doc: doc::ItemDoc) -> doc::ItemDoc {
     let doc = fold::default_seq_fold_item(fold, doc);
-    let (desc, sections) = sectionalize(doc.desc);
+    let (desc, sections) = sectionalize(copy doc.desc);
 
     doc::ItemDoc {
         desc: desc,
@@ -58,7 +58,7 @@ fn fold_trait(fold: &fold::Fold<()>, +doc: doc::TraitDoc) -> doc::TraitDoc {
 
     doc::TraitDoc {
         methods: do par::map(doc.methods) |method| {
-            let (desc, sections) = sectionalize(method.desc);
+            let (desc, sections) = sectionalize(copy method.desc);
 
             doc::MethodDoc {
                 desc: desc,
@@ -75,7 +75,7 @@ fn fold_impl(fold: &fold::Fold<()>, +doc: doc::ImplDoc) -> doc::ImplDoc {
 
     doc::ImplDoc {
         methods: do par::map(doc.methods) |method| {
-            let (desc, sections) = sectionalize(method.desc);
+            let (desc, sections) = sectionalize(copy method.desc);
 
             doc::MethodDoc {
                 desc: desc,
@@ -87,7 +87,7 @@ fn fold_impl(fold: &fold::Fold<()>, +doc: doc::ImplDoc) -> doc::ImplDoc {
     }
 }
 
-fn sectionalize(desc: Option<~str>) -> (Option<~str>, ~[doc::Section]) {
+fn sectionalize(+desc: Option<~str>) -> (Option<~str>, ~[doc::Section]) {
 
     /*!
      * Take a description of the form
@@ -156,7 +156,7 @@ fn sectionalize(desc: Option<~str>) -> (Option<~str>, ~[doc::Section]) {
     (new_desc, sections)
 }
 
-fn parse_header(line: ~str) -> Option<~str> {
+fn parse_header(+line: ~str) -> Option<~str> {
     if str::starts_with(line, ~"# ") {
         Some(str::slice(line, 2u, str::len(line)))
     } else {
@@ -259,7 +259,7 @@ pub mod test {
     use extract;
     use sectionalize_pass::run;
 
-    pub fn mk_doc(source: ~str) -> doc::Doc {
+    pub fn mk_doc(+source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
             let doc = extract::from_srv(srv, ~"");
             let doc = (attr_pass::mk_pass().f)(srv, doc);
diff --git a/src/librustdoc/sort_pass.rs b/src/librustdoc/sort_pass.rs
index 9f4a8c8b498..ac556de74bb 100644
--- a/src/librustdoc/sort_pass.rs
+++ b/src/librustdoc/sort_pass.rs
@@ -27,7 +27,7 @@ pub type ItemLtEqOp = pure fn~(v1: &doc::ItemTag, v2:  &doc::ItemTag) -> bool;
 
 type ItemLtEq = NominalOp<ItemLtEqOp>;
 
-pub fn mk_pass(name: ~str, +lteq: ItemLtEqOp) -> Pass {
+pub fn mk_pass(+name: ~str, +lteq: ItemLtEqOp) -> Pass {
     Pass {
         name: copy name,
         f: fn~(move lteq, srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
diff --git a/src/librustdoc/text_pass.rs b/src/librustdoc/text_pass.rs
index 8d9df6d4c50..ac47e25fdcf 100644
--- a/src/librustdoc/text_pass.rs
+++ b/src/librustdoc/text_pass.rs
@@ -21,17 +21,19 @@ use pass::Pass;
 use util::NominalOp;
 
 use std::par;
+use std::cell::Cell;
 
-pub fn mk_pass(name: ~str, +op: fn~(~str) -> ~str) -> Pass {
+pub fn mk_pass(+name: ~str, +op: fn~(&str) -> ~str) -> Pass {
+    let op = Cell(op);
     Pass {
         name: copy name,
         f: fn~(move op, srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
-            run(srv, doc, copy op)
+            run(srv, doc, op.take())
         }
     }
 }
 
-type Op = fn~(~str) -> ~str;
+type Op = fn~(&str) -> ~str;
 
 #[allow(non_implicitly_copyable_typarams)]
 fn run(
@@ -52,8 +54,8 @@ fn run(
     (fold.fold_doc)(&fold, doc)
 }
 
-fn maybe_apply_op(op: NominalOp<Op>, s: Option<~str>) -> Option<~str> {
-    s.map(|s| (op.op)(copy *s) )
+fn maybe_apply_op(+op: NominalOp<Op>, s: &Option<~str>) -> Option<~str> {
+    s.map(|s| (op.op)(*s) )
 }
 
 fn fold_item(
@@ -63,16 +65,16 @@ fn fold_item(
     let doc = fold::default_seq_fold_item(fold, doc);
 
     doc::ItemDoc {
-        brief: maybe_apply_op(fold.ctxt, doc.brief),
-        desc: maybe_apply_op(fold.ctxt, doc.desc),
-        sections: apply_to_sections(fold.ctxt, copy doc.sections),
+        brief: maybe_apply_op(copy fold.ctxt, &doc.brief),
+        desc: maybe_apply_op(copy fold.ctxt, &doc.desc),
+        sections: apply_to_sections(copy fold.ctxt, copy doc.sections),
         .. doc
     }
 }
 
 fn apply_to_sections(
-    op: NominalOp<Op>,
-    sections: ~[doc::Section]
+    +op: NominalOp<Op>,
+    +sections: ~[doc::Section]
 ) -> ~[doc::Section] {
     par::map(sections, |section, copy op| doc::Section {
         header: (op.op)(copy section.header),
@@ -89,7 +91,7 @@ fn fold_enum(
     doc::EnumDoc {
         variants: do par::map(doc.variants) |variant, copy fold_copy| {
             doc::VariantDoc {
-                desc: maybe_apply_op(fold_copy.ctxt, variant.desc),
+                desc: maybe_apply_op(copy fold_copy.ctxt, &variant.desc),
                 .. copy *variant
             }
         },
@@ -104,20 +106,20 @@ fn fold_trait(
     let doc = fold::default_seq_fold_trait(fold, doc);
 
     doc::TraitDoc {
-        methods: apply_to_methods(fold.ctxt, copy doc.methods),
+        methods: apply_to_methods(copy fold.ctxt, copy doc.methods),
         .. doc
     }
 }
 
 fn apply_to_methods(
-    op: NominalOp<Op>,
-    docs: ~[doc::MethodDoc]
+    +op: NominalOp<Op>,
+    +docs: ~[doc::MethodDoc]
 ) -> ~[doc::MethodDoc] {
     do par::map(docs) |doc, copy op| {
         doc::MethodDoc {
-            brief: maybe_apply_op(op, doc.brief),
-            desc: maybe_apply_op(op, doc.desc),
-            sections: apply_to_sections(op, copy doc.sections),
+            brief: maybe_apply_op(copy op, &doc.brief),
+            desc: maybe_apply_op(copy op, &doc.desc),
+            sections: apply_to_sections(copy op, copy doc.sections),
             .. copy *doc
         }
     }
@@ -130,7 +132,7 @@ fn fold_impl(
     let doc = fold::default_seq_fold_impl(fold, doc);
 
     doc::ImplDoc {
-        methods: apply_to_methods(fold.ctxt, copy doc.methods),
+        methods: apply_to_methods(copy fold.ctxt, copy doc.methods),
         .. doc
     }
 }
@@ -301,7 +303,7 @@ mod test {
 
     use core::str;
 
-    pub fn mk_doc(source: ~str) -> doc::Doc {
+    pub fn mk_doc(+source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
             let doc = extract::from_srv(srv, ~"");
             let doc = (attr_pass::mk_pass().f)(srv, doc);
diff --git a/src/librustdoc/trim_pass.rs b/src/librustdoc/trim_pass.rs
index bac69e32848..c6c289346b1 100644
--- a/src/librustdoc/trim_pass.rs
+++ b/src/librustdoc/trim_pass.rs
@@ -43,7 +43,7 @@ mod test {
     use extract;
     use trim_pass::mk_pass;
 
-    pub fn mk_doc(source: ~str) -> doc::Doc {
+    pub fn mk_doc(+source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
             let doc = extract::from_srv(srv, ~"");
             let doc = (attr_pass::mk_pass().f)(srv, doc);
diff --git a/src/librustdoc/tystr_pass.rs b/src/librustdoc/tystr_pass.rs
index 44fc994ed4b..4d279db0596 100644
--- a/src/librustdoc/tystr_pass.rs
+++ b/src/librustdoc/tystr_pass.rs
@@ -177,7 +177,7 @@ fn fold_trait(
 fn merge_methods(
     srv: astsrv::Srv,
     item_id: doc::AstId,
-    docs: ~[doc::MethodDoc]
+    +docs: ~[doc::MethodDoc]
 ) -> ~[doc::MethodDoc] {
     do par::map(docs) |doc| {
         doc::MethodDoc {
@@ -190,7 +190,7 @@ fn merge_methods(
 fn get_method_sig(
     srv: astsrv::Srv,
     item_id: doc::AstId,
-    method_name: ~str
+    +method_name: ~str
 ) -> Option<~str> {
     do astsrv::exec(srv) |copy method_name, ctxt| {
         match ctxt.ast_map.get(item_id) {
@@ -415,7 +415,7 @@ pub mod test {
     use extract;
     use tystr_pass::run;
 
-    pub fn mk_doc(source: ~str) -> doc::Doc {
+    pub fn mk_doc(+source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
             let doc = extract::from_srv(srv, ~"");
             run(srv, doc)
diff --git a/src/librustdoc/unindent_pass.rs b/src/librustdoc/unindent_pass.rs
index f86c371c20c..1c53ed5dcce 100644
--- a/src/librustdoc/unindent_pass.rs
+++ b/src/librustdoc/unindent_pass.rs
@@ -33,7 +33,7 @@ pub fn mk_pass() -> Pass {
     text_pass::mk_pass(~"unindent", unindent)
 }
 
-fn unindent(s: ~str) -> ~str {
+fn unindent(s: &str) -> ~str {
     let lines = str::lines_any(s);
     let mut saw_first_line = false;
     let mut saw_second_line = false;
@@ -90,7 +90,7 @@ fn unindent(s: ~str) -> ~str {
         };
         str::connect(unindented, ~"\n")
     } else {
-        copy s
+        s.to_str()
     }
 }