about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-09-05 15:58:43 -0700
committerBrian Anderson <banderson@mozilla.com>2012-09-06 10:52:26 -0700
commitb4e547d71aa379e702a737550e479116914b19cf (patch)
treee5abaa61a98462de027ca0f80e21b142269bd801
parent5e36a997945ddc3964a1fe937bc5390cc5b526c8 (diff)
Remove struct ctors
-rw-r--r--src/libsyntax/ext/pipes/proto.rs16
-rw-r--r--src/libsyntax/parse/parser.rs96
-rw-r--r--src/libsyntax/parse/token.rs1
-rw-r--r--src/rustc/driver/rustc.rs3
-rw-r--r--src/rustc/lib/llvm.rs28
-rw-r--r--src/rustc/metadata/decoder.rs8
-rw-r--r--src/rustc/middle/lang_items.rs63
-rw-r--r--src/rustc/middle/resolve.rs248
-rw-r--r--src/rustc/middle/trans/base.rs7
-rw-r--r--src/rustc/middle/trans/common.rs28
-rw-r--r--src/rustc/middle/typeck/check/method.rs56
-rw-r--r--src/rustc/middle/typeck/coherence.rs26
-rw-r--r--src/rustc/util/common.rs7
-rw-r--r--src/rustdoc/demo.rs1
-rw-r--r--src/test/auxiliary/cci_class.rs8
-rw-r--r--src/test/auxiliary/cci_class_2.rs9
-rw-r--r--src/test/auxiliary/cci_class_3.rs10
-rw-r--r--src/test/auxiliary/cci_class_4.rs11
-rw-r--r--src/test/auxiliary/cci_class_5.rs8
-rw-r--r--src/test/auxiliary/cci_class_6.rs14
-rw-r--r--src/test/auxiliary/cci_class_cast.rs14
-rw-r--r--src/test/auxiliary/issue-2526.rs15
-rw-r--r--src/test/auxiliary/issue-3012-1.rs8
-rw-r--r--src/test/auxiliary/issue2170lib.rs7
-rw-r--r--src/test/auxiliary/test_comm.rs9
-rw-r--r--src/test/bench/task-perf-alloc-unwind.rs7
-rw-r--r--src/test/bench/task-perf-word-count-generic.rs18
-rw-r--r--src/test/compile-fail/assign-to-method.rs8
-rw-r--r--src/test/compile-fail/block-must-not-have-result-res.rs1
-rw-r--r--src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs7
-rw-r--r--src/test/compile-fail/borrowck-unary-move-2.rs9
-rw-r--r--src/test/compile-fail/cap-clause-illegal-cap.rs8
-rw-r--r--src/test/compile-fail/class-cast-to-trait.rs11
-rw-r--r--src/test/compile-fail/class-implements-int.rs7
-rw-r--r--src/test/compile-fail/class-method-missing.rs7
-rw-r--r--src/test/compile-fail/class-missing-self.rs2
-rw-r--r--src/test/compile-fail/copy-a-resource.rs7
-rw-r--r--src/test/compile-fail/issue-2063-resource.rs2
-rw-r--r--src/test/compile-fail/issue-2370-2.rs8
-rw-r--r--src/test/compile-fail/issue-2370.rs8
-rw-r--r--src/test/compile-fail/issue-2487-b.rs2
-rw-r--r--src/test/compile-fail/issue-2509-a.rs4
-rw-r--r--src/test/compile-fail/issue-2718-a.rs1
-rw-r--r--src/test/compile-fail/issue-2825-b.rs9
-rw-r--r--src/test/compile-fail/issue-2825.rs13
-rw-r--r--src/test/compile-fail/issue-3021-b.rs1
-rw-r--r--src/test/compile-fail/lint-non-camel-case-class.rs4
-rw-r--r--src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs11
-rw-r--r--src/test/compile-fail/liveness-ctor-field-never-init.rs7
-rw-r--r--src/test/compile-fail/liveness-ctor-uninit-field.rs14
-rw-r--r--src/test/compile-fail/liveness-ctor-uninit-var.rs22
-rw-r--r--src/test/compile-fail/liveness-unused.rs3
-rw-r--r--src/test/compile-fail/mutable-class-fields-2.rs8
-rw-r--r--src/test/compile-fail/mutable-class-fields.rs8
-rw-r--r--src/test/compile-fail/no-send-res-ports.rs7
-rw-r--r--src/test/compile-fail/non-const.rs14
-rw-r--r--src/test/compile-fail/noncopyable-class.rs15
-rw-r--r--src/test/compile-fail/pinned-deep-copy.rs7
-rw-r--r--src/test/compile-fail/private-method.rs8
-rw-r--r--src/test/compile-fail/record-with-resource.rs7
-rw-r--r--src/test/compile-fail/regions-addr-of-self.rs10
-rw-r--r--src/test/compile-fail/regions-addr-of-upvar-self.rs4
-rw-r--r--src/test/compile-fail/regions-bounds.rs2
-rw-r--r--src/test/compile-fail/regions-in-rsrcs.rs3
-rw-r--r--src/test/compile-fail/tps-invariant-class.rs6
-rw-r--r--src/test/compile-fail/unique-pinned-nocopy.rs3
-rw-r--r--src/test/compile-fail/unique-vec-res.rs5
-rw-r--r--src/test/compile-fail/unsendable-class.rs8
-rw-r--r--src/test/run-fail/morestack2.rs7
-rw-r--r--src/test/run-fail/morestack3.rs7
-rw-r--r--src/test/run-fail/morestack4.rs7
-rw-r--r--src/test/run-fail/rt-set-exit-status-fail2.rs7
-rw-r--r--src/test/run-fail/unwind-box-res.rs7
-rw-r--r--src/test/run-pass/binops.rs8
-rw-r--r--src/test/run-pass/boxed-class-type-substitution.rs6
-rw-r--r--src/test/run-pass/class-attributes-1.rs5
-rw-r--r--src/test/run-pass/class-attributes-2.rs15
-rw-r--r--src/test/run-pass/class-cast-to-trait-multiple-types.rs22
-rw-r--r--src/test/run-pass/class-cast-to-trait.rs12
-rw-r--r--src/test/run-pass/class-dtor.rs11
-rw-r--r--src/test/run-pass/class-exports.rs9
-rw-r--r--src/test/run-pass/class-impl-very-parameterized-trait.rs10
-rw-r--r--src/test/run-pass/class-implement-trait-cross-crate.rs12
-rw-r--r--src/test/run-pass/class-implement-traits.rs12
-rw-r--r--src/test/run-pass/class-methods.rs9
-rw-r--r--src/test/run-pass/class-poly-methods.rs12
-rw-r--r--src/test/run-pass/class-separate-impl.rs11
-rw-r--r--src/test/run-pass/class-str-field.rs8
-rw-r--r--src/test/run-pass/class-typarams.rs10
-rw-r--r--src/test/run-pass/classes-self-referential.rs7
-rw-r--r--src/test/run-pass/classes-simple-method.rs9
-rw-r--r--src/test/run-pass/classes-simple.rs8
-rw-r--r--src/test/run-pass/classes.rs11
-rw-r--r--src/test/run-pass/conditional-compile.rs15
-rw-r--r--src/test/run-pass/explicit-self.rs6
-rw-r--r--src/test/run-pass/init-res-into-things.rs9
-rw-r--r--src/test/run-pass/issue-2288.rs7
-rw-r--r--src/test/run-pass/issue-2311-2.rs7
-rw-r--r--src/test/run-pass/issue-2445-b.rs8
-rw-r--r--src/test/run-pass/issue-2445.rs8
-rw-r--r--src/test/run-pass/issue-2487-a.rs8
-rw-r--r--src/test/run-pass/issue-2502.rs10
-rw-r--r--src/test/run-pass/issue-2550.rs7
-rw-r--r--src/test/run-pass/issue-2633.rs7
-rw-r--r--src/test/run-pass/issue-2708.rs14
-rw-r--r--src/test/run-pass/issue-2718.rs14
-rw-r--r--src/test/run-pass/issue-2735-2.rs9
-rw-r--r--src/test/run-pass/issue-2735-3.rs9
-rw-r--r--src/test/run-pass/issue-2748-a.rs7
-rw-r--r--src/test/run-pass/issue-2936.rs7
-rw-r--r--src/test/run-pass/issue-3220.rs7
-rw-r--r--src/test/run-pass/issue-979.rs9
-rw-r--r--src/test/run-pass/nested-class.rs7
-rw-r--r--src/test/run-pass/private-class-field.rs8
-rw-r--r--src/test/run-pass/private-method.rs8
-rw-r--r--src/test/run-pass/resource-assign-is-not-copy.rs9
-rw-r--r--src/test/run-pass/resource-cycle.rs13
-rw-r--r--src/test/run-pass/resource-cycle2.rs7
-rw-r--r--src/test/run-pass/resource-cycle3.rs11
-rw-r--r--src/test/run-pass/resource-destruct.rs7
-rw-r--r--src/test/run-pass/resource-generic.rs9
-rw-r--r--src/test/run-pass/resource-in-struct.rs7
-rw-r--r--src/test/run-pass/send-resource.rs7
-rw-r--r--src/test/run-pass/sendable-class.rs8
-rw-r--r--src/test/run-pass/task-killjoin-rsrc.rs8
-rw-r--r--src/test/run-pass/type-param-constraints.rs7
-rw-r--r--src/test/run-pass/unique-pinned-nocopy-2.rs7
-rw-r--r--src/test/run-pass/unwind-resource.rs10
-rw-r--r--src/test/run-pass/unwind-resource2.rs7
-rw-r--r--src/test/run-pass/vec-slice-drop.rs7
130 files changed, 1017 insertions, 557 deletions
diff --git a/src/libsyntax/ext/pipes/proto.rs b/src/libsyntax/ext/pipes/proto.rs
index 4e09aa4c956..789ee70249f 100644
--- a/src/libsyntax/ext/pipes/proto.rs
+++ b/src/libsyntax/ext/pipes/proto.rs
@@ -118,6 +118,15 @@ fn protocol(name: ~str, +span: span) -> protocol {
     @protocol_(name, span)
 }
 
+fn protocol_(name: ~str, span: span) -> protocol_ {
+    protocol_ {
+        name: name,
+        span: span,
+        states: DVec(),
+        bounded: None
+    }
+}
+
 struct protocol_ {
     let name: ~str;
     let span: span;
@@ -125,13 +134,6 @@ struct protocol_ {
 
     let mut bounded: Option<bool>;
 
-    new(name: ~str, span: span) {
-        self.name = name;
-        self.span = span;
-        self.states = DVec();
-        self.bounded = None;
-    }
-
     /// Get a state.
     fn get_state(name: ~str) -> state {
         self.states.find(|i| i.name == name).get()
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index b1205c77fe8..e900b7dd7b3 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -181,6 +181,37 @@ pure fn maybe_append(+lhs: ~[attribute], rhs: Option<~[attribute]>)
 
 /* ident is handled by common.rs */
 
+fn parser(sess: parse_sess, cfg: ast::crate_cfg,
+          +rdr: reader, ftype: file_type) -> parser {
+
+    let tok0 = rdr.next_token();
+    let span0 = tok0.sp;
+    let interner = rdr.interner();
+
+    parser {
+        reader: move rdr,
+        interner: move interner,
+        sess: sess,
+        cfg: cfg,
+        file_type: ftype,
+        token: tok0.tok,
+        span: span0,
+        last_span: span0,
+        buffer: [mut
+            {tok: tok0.tok, sp: span0},
+            {tok: tok0.tok, sp: span0},
+            {tok: tok0.tok, sp: span0},
+            {tok: tok0.tok, sp: span0}
+        ]/4,
+        buffer_start: 0,
+        buffer_end: 0,
+        restriction: UNRESTRICTED,
+        quote_depth: 0u,
+        keywords: token::keyword_table(),
+        restricted_keywords: token::restricted_keyword_table()
+    }
+}
+
 struct parser {
     let sess: parse_sess;
     let cfg: crate_cfg;
@@ -198,32 +229,6 @@ struct parser {
     let keywords: hashmap<~str, ()>;
     let restricted_keywords: hashmap<~str, ()>;
 
-    new(sess: parse_sess, cfg: ast::crate_cfg, +rdr: reader, ftype: file_type)
-    {
-        self.reader <- rdr;
-        self.interner = self.reader.interner();
-        let tok0 = self.reader.next_token();
-        let span0 = tok0.sp;
-        self.sess = sess;
-        self.cfg = cfg;
-        self.file_type = ftype;
-        self.token = tok0.tok;
-        self.span = span0;
-        self.last_span = span0;
-        self.buffer = [mut
-            {tok: tok0.tok, sp: span0},
-            {tok: tok0.tok, sp: span0},
-            {tok: tok0.tok, sp: span0},
-            {tok: tok0.tok, sp: span0}
-        ]/4;
-        self.buffer_start = 0;
-        self.buffer_end = 0;
-        self.restriction = UNRESTRICTED;
-        self.quote_depth = 0u;
-        self.keywords = token::keyword_table();
-        self.restricted_keywords = token::restricted_keyword_table();
-    }
-
     drop {} /* do not copy the parser; its state is tied to outside state */
 
     fn bump() {
@@ -2594,7 +2599,6 @@ struct parser {
         let class_name = self.parse_value_ident();
         self.parse_region_param();
         let ty_params = self.parse_ty_params();
-        let class_path = self.ident_to_path_tys(class_name, ty_params);
         let traits : ~[@trait_ref] = if self.eat(token::COLON)
             { self.parse_trait_ref_list(token::LBRACE) }
         else { ~[] };
@@ -2610,7 +2614,7 @@ struct parser {
             // It's a record-like struct.
             fields = ~[];
             while self.token != token::RBRACE {
-                match self.parse_class_item(class_path) {
+                match self.parse_class_item() {
                   ctor_decl(a_fn_decl, attrs, blk, s) => {
                       match the_ctor {
                         Some((_, _, _, s_first)) => {
@@ -2747,24 +2751,13 @@ struct parser {
         }
     }
 
-    fn parse_ctor(attrs: ~[attribute],
-                  result_ty: ast::ty_) -> class_contents {
-        let lo = self.last_span.lo;
-        let (decl_, _) = self.parse_fn_decl(|p| p.parse_arg());
-        let decl = {output: @{id: self.get_id(),
-                              node: result_ty, span: decl_.output.span},
-                    .. decl_};
-        let body = self.parse_block();
-        ctor_decl(decl, attrs, body, mk_sp(lo, self.last_span.hi))
-    }
-
     fn parse_dtor(attrs: ~[attribute]) -> class_contents {
         let lo = self.last_span.lo;
         let body = self.parse_block();
         dtor_decl(body, attrs, mk_sp(lo, self.last_span.hi))
     }
 
-    fn parse_class_item(class_name_with_tps: @path) -> class_contents {
+    fn parse_class_item() -> class_contents {
         if self.eat_keyword(~"priv") {
             // XXX: Remove after snapshot.
             match self.token {
@@ -2789,12 +2782,7 @@ struct parser {
 
         let attrs = self.parse_outer_attributes();
 
-        if self.eat_keyword(~"new") {
-            // result type is always the type of the class
-           return self.parse_ctor(attrs, ty_path(class_name_with_tps,
-                                        self.get_id()));
-        }
-        else if self.eat_keyword(~"drop") {
+        if self.eat_keyword(~"drop") {
            return self.parse_dtor(attrs);
         }
         else {
@@ -3019,12 +3007,12 @@ struct parser {
         }
     }
 
-    fn parse_struct_def(path: @path) -> @struct_def {
+    fn parse_struct_def() -> @struct_def {
         let mut the_dtor: Option<(blk, ~[attribute], codemap::span)> = None;
         let mut fields: ~[@struct_field] = ~[];
         let mut methods: ~[@method] = ~[];
         while self.token != token::RBRACE {
-            match self.parse_class_item(path) {
+            match self.parse_class_item() {
                 ctor_decl(*) => {
                     self.span_fatal(copy self.span,
                                     ~"deprecated explicit \
@@ -3076,7 +3064,7 @@ struct parser {
         };
     }
 
-    fn parse_enum_def(ident: ast::ident, ty_params: ~[ast::ty_param])
+    fn parse_enum_def(ty_params: ~[ast::ty_param])
                    -> enum_def {
         let mut variants: ~[variant] = ~[];
         let mut all_nullary = true, have_disr = false;
@@ -3092,8 +3080,7 @@ struct parser {
                     self.fatal(~"duplicate declaration of shared fields");
                 }
                 self.expect(token::LBRACE);
-                let path = self.ident_to_path_tys(ident, ty_params);
-                common_fields = Some(self.parse_struct_def(path));
+                common_fields = Some(self.parse_struct_def());
                 again;
             }
 
@@ -3105,7 +3092,7 @@ struct parser {
             if self.eat_keyword(~"enum") {
                 ident = self.parse_ident();
                 self.expect(token::LBRACE);
-                let nested_enum_def = self.parse_enum_def(ident, ty_params);
+                let nested_enum_def = self.parse_enum_def(ty_params);
                 kind = enum_variant_kind(move nested_enum_def);
                 needs_comma = false;
             } else {
@@ -3113,8 +3100,7 @@ struct parser {
                 if self.eat(token::LBRACE) {
                     // Parse a struct variant.
                     all_nullary = false;
-                    let path = self.ident_to_path_tys(ident, ty_params);
-                    kind = struct_variant_kind(self.parse_struct_def(path));
+                    kind = struct_variant_kind(self.parse_struct_def());
                 } else if self.token == token::LPAREN {
                     all_nullary = false;
                     let arg_tys = self.parse_unspanned_seq(
@@ -3176,7 +3162,7 @@ struct parser {
         }
         self.expect(token::LBRACE);
 
-        let enum_definition = self.parse_enum_def(id, ty_params);
+        let enum_definition = self.parse_enum_def(ty_params);
         (id, item_enum(enum_definition, ty_params), None)
     }
 
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs
index a9bcb762597..945f4c6b279 100644
--- a/src/libsyntax/parse/token.rs
+++ b/src/libsyntax/parse/token.rs
@@ -422,7 +422,6 @@ fn restricted_keyword_table() -> hashmap<~str, ()> {
         ~"if", ~"impl", ~"import",
         ~"let", ~"log", ~"loop",
         ~"match", ~"mod", ~"module", ~"move", ~"mut",
-        ~"new",
         ~"owned",
         ~"pure",
         ~"ref", ~"return",
diff --git a/src/rustc/driver/rustc.rs b/src/rustc/driver/rustc.rs
index c6b8bc2d7b9..8b8325853cc 100644
--- a/src/rustc/driver/rustc.rs
+++ b/src/rustc/driver/rustc.rs
@@ -241,11 +241,10 @@ fn monitor(+f: fn~(diagnostic::emitter)) {
 
         struct finally {
             let ch: comm::Chan<monitor_msg>;
-            new(ch: comm::Chan<monitor_msg>) { self.ch = ch; }
             drop { comm::send(self.ch, done); }
         }
 
-        let _finally = finally(ch);
+        let _finally = finally { ch: ch };
 
         f(demitter)
     } {
diff --git a/src/rustc/lib/llvm.rs b/src/rustc/lib/llvm.rs
index fe737442bd0..23566e59cf9 100644
--- a/src/rustc/lib/llvm.rs
+++ b/src/rustc/lib/llvm.rs
@@ -1175,10 +1175,15 @@ fn fn_ty_param_tys(fn_ty: TypeRef) -> ~[TypeRef] unsafe {
 
 struct target_data_res {
     let TD: TargetDataRef;
-    new(TD: TargetDataRef) { self.TD = TD; }
     drop { llvm::LLVMDisposeTargetData(self.TD); }
 }
 
+fn target_data_res(TD: TargetDataRef) -> target_data_res {
+    target_data_res {
+        TD: TD
+    }
+}
+
 type target_data = {lltd: TargetDataRef, dtor: @target_data_res};
 
 fn mk_target_data(string_rep: ~str) -> target_data {
@@ -1191,10 +1196,15 @@ fn mk_target_data(string_rep: ~str) -> target_data {
 
 struct pass_manager_res {
     let PM: PassManagerRef;
-    new(PM: PassManagerRef) { self.PM = PM; }
     drop { llvm::LLVMDisposePassManager(self.PM); }
 }
 
+fn pass_manager_res(PM: PassManagerRef) -> pass_manager_res {
+    pass_manager_res {
+        PM: PM
+    }
+}
+
 type pass_manager = {llpm: PassManagerRef, dtor: @pass_manager_res};
 
 fn mk_pass_manager() -> pass_manager {
@@ -1206,10 +1216,15 @@ fn mk_pass_manager() -> pass_manager {
 
 struct object_file_res {
     let ObjectFile: ObjectFileRef;
-    new(ObjectFile: ObjectFileRef) { self.ObjectFile = ObjectFile; }
     drop { llvm::LLVMDisposeObjectFile(self.ObjectFile); }
 }
 
+fn object_file_res(ObjectFile: ObjectFileRef) -> object_file_res{
+    object_file_res {
+        ObjectFile: ObjectFile
+    }
+}
+
 type object_file = {llof: ObjectFileRef, dtor: @object_file_res};
 
 fn mk_object_file(llmb: MemoryBufferRef) -> Option<object_file> {
@@ -1222,10 +1237,15 @@ fn mk_object_file(llmb: MemoryBufferRef) -> Option<object_file> {
 
 struct section_iter_res {
     let SI: SectionIteratorRef;
-    new(SI: SectionIteratorRef) { self.SI = SI; }
     drop { llvm::LLVMDisposeSectionIterator(self.SI); }
 }
 
+fn section_iter_res(SI: SectionIteratorRef) -> section_iter_res {
+    section_iter_res {
+        SI: SI
+    }
+}
+
 type section_iter = {llsi: SectionIteratorRef, dtor: @section_iter_res};
 
 fn mk_section_iter(llof: ObjectFileRef) -> section_iter {
diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs
index d9ecc114062..4e2c7b8ee72 100644
--- a/src/rustc/metadata/decoder.rs
+++ b/src/rustc/metadata/decoder.rs
@@ -442,10 +442,12 @@ struct path_entry {
     let path_string: ~str;
     // The definition, implementation, or field that this path corresponds to.
     let def_like: def_like;
+}
 
-    new(path_string: ~str, def_like: def_like) {
-        self.path_string = path_string;
-        self.def_like = def_like;
+fn path_entry(path_string: ~str, def_like: def_like) -> path_entry {
+    path_entry {
+        path_string: path_string,
+        def_like: def_like
     }
 }
 
diff --git a/src/rustc/middle/lang_items.rs b/src/rustc/middle/lang_items.rs
index b57f1eac19b..3d8771166b6 100644
--- a/src/rustc/middle/lang_items.rs
+++ b/src/rustc/middle/lang_items.rs
@@ -72,6 +72,41 @@ mod LanguageItems {
     }
 }
 
+fn LanguageItemCollector(crate: @crate, session: session,
+                         items: &r/LanguageItems)
+    -> LanguageItemCollector/&r {
+
+    let item_refs = str_hash();
+
+    item_refs.insert(~"const", &mut items.const_trait);
+    item_refs.insert(~"copy", &mut items.copy_trait);
+    item_refs.insert(~"send", &mut items.send_trait);
+    item_refs.insert(~"owned", &mut items.owned_trait);
+
+    item_refs.insert(~"add", &mut items.add_trait);
+    item_refs.insert(~"sub", &mut items.sub_trait);
+    item_refs.insert(~"mul", &mut items.mul_trait);
+    item_refs.insert(~"div", &mut items.div_trait);
+    item_refs.insert(~"modulo", &mut items.modulo_trait);
+    item_refs.insert(~"neg", &mut items.neg_trait);
+    item_refs.insert(~"bitxor", &mut items.bitxor_trait);
+    item_refs.insert(~"bitand", &mut items.bitand_trait);
+    item_refs.insert(~"bitor", &mut items.bitor_trait);
+    item_refs.insert(~"shl", &mut items.shl_trait);
+    item_refs.insert(~"shr", &mut items.shr_trait);
+    item_refs.insert(~"index", &mut items.index_trait);
+
+    item_refs.insert(~"eq", &mut items.eq_trait);
+    item_refs.insert(~"ord", &mut items.ord_trait);
+
+    LanguageItemCollector {
+        crate: crate,
+        session: session,
+        items: items,
+        item_refs: item_refs
+    }
+}
+
 struct LanguageItemCollector {
     let items: &LanguageItems;
 
@@ -80,34 +115,6 @@ struct LanguageItemCollector {
 
     let item_refs: hashmap<~str,&mut Option<def_id>>;
 
-    new(crate: @crate, session: session, items: &self/LanguageItems) {
-        self.crate = crate;
-        self.session = session;
-        self.items = items;
-        self.item_refs = str_hash();
-
-        self.item_refs.insert(~"const", &mut self.items.const_trait);
-        self.item_refs.insert(~"copy", &mut self.items.copy_trait);
-        self.item_refs.insert(~"send", &mut self.items.send_trait);
-        self.item_refs.insert(~"owned", &mut self.items.owned_trait);
-
-        self.item_refs.insert(~"add", &mut self.items.add_trait);
-        self.item_refs.insert(~"sub", &mut self.items.sub_trait);
-        self.item_refs.insert(~"mul", &mut self.items.mul_trait);
-        self.item_refs.insert(~"div", &mut self.items.div_trait);
-        self.item_refs.insert(~"modulo", &mut self.items.modulo_trait);
-        self.item_refs.insert(~"neg", &mut self.items.neg_trait);
-        self.item_refs.insert(~"bitxor", &mut self.items.bitxor_trait);
-        self.item_refs.insert(~"bitand", &mut self.items.bitand_trait);
-        self.item_refs.insert(~"bitor", &mut self.items.bitor_trait);
-        self.item_refs.insert(~"shl", &mut self.items.shl_trait);
-        self.item_refs.insert(~"shr", &mut self.items.shr_trait);
-        self.item_refs.insert(~"index", &mut self.items.index_trait);
-
-        self.item_refs.insert(~"eq", &mut self.items.eq_trait);
-        self.item_refs.insert(~"ord", &mut self.items.ord_trait);
-    }
-
     fn match_and_collect_meta_item(item_def_id: def_id,
                                    meta_item: meta_item) {
 
diff --git a/src/rustc/middle/resolve.rs b/src/rustc/middle/resolve.rs
index 05872159f8c..1168260b519 100644
--- a/src/rustc/middle/resolve.rs
+++ b/src/rustc/middle/resolve.rs
@@ -311,26 +311,30 @@ fn atom_hashmap<V:copy>() -> hashmap<Atom,V> {
 struct Rib {
     let bindings: hashmap<Atom,def_like>;
     let kind: RibKind;
+}
 
-    new(kind: RibKind) {
-        self.bindings = atom_hashmap();
-        self.kind = kind;
+fn Rib(kind: RibKind) -> Rib {
+    Rib {
+        bindings: atom_hashmap(),
+        kind: kind
     }
 }
 
+
 /// One import directive.
 struct ImportDirective {
     let module_path: @DVec<Atom>;
     let subclass: @ImportDirectiveSubclass;
     let span: span;
+}
 
-    new(module_path: @DVec<Atom>,
-        subclass: @ImportDirectiveSubclass,
-        span: span) {
-
-        self.module_path = module_path;
-        self.subclass = subclass;
-        self.span = span;
+fn ImportDirective(module_path: @DVec<Atom>,
+                   subclass: @ImportDirectiveSubclass,
+                   span: span) -> ImportDirective {
+    ImportDirective {
+        module_path: module_path,
+        subclass: subclass,
+        span: span
     }
 }
 
@@ -338,10 +342,12 @@ struct ImportDirective {
 struct Target {
     let target_module: @Module;
     let bindings: @NameBindings;
+}
 
-    new(target_module: @Module, bindings: @NameBindings) {
-        self.target_module = target_module;
-        self.bindings = bindings;
+fn Target(target_module: @Module, bindings: @NameBindings) -> Target {
+    Target {
+        target_module: target_module,
+        bindings: bindings
     }
 }
 
@@ -360,18 +366,6 @@ struct ImportResolution {
 
     let mut used: bool;
 
-    new(span: span) {
-        self.span = span;
-
-        self.outstanding_references = 0u;
-
-        self.module_target = None;
-        self.value_target = None;
-        self.type_target = None;
-
-        self.used = false;
-    }
-
     fn target_for_namespace(namespace: Namespace) -> Option<Target> {
         match namespace {
             ModuleNS    => return copy self.module_target,
@@ -381,6 +375,17 @@ struct ImportResolution {
     }
 }
 
+fn ImportResolution(span: span) -> ImportResolution {
+    ImportResolution {
+        span: span,
+        outstanding_references: 0u,
+        module_target: None,
+        value_target: None,
+        type_target: None,
+        used: false
+    }
+}
+
 /// The link from a module up to its nearest parent node.
 enum ParentLink {
     NoParentLink,
@@ -430,27 +435,25 @@ struct Module {
     // The index of the import we're resolving.
     let mut resolved_import_count: uint;
 
-    new(parent_link: ParentLink, def_id: Option<def_id>) {
-        self.parent_link = parent_link;
-        self.def_id = def_id;
-
-        self.children = atom_hashmap();
-        self.imports = DVec();
-
-        self.anonymous_children = int_hash();
-
-        self.exported_names = atom_hashmap();
-
-        self.import_resolutions = atom_hashmap();
-        self.glob_count = 0u;
-        self.resolved_import_count = 0u;
-    }
-
     fn all_imports_resolved() -> bool {
         return self.imports.len() == self.resolved_import_count;
     }
 }
 
+fn Module(parent_link: ParentLink, def_id: Option<def_id>) -> Module {
+    Module {
+        parent_link: parent_link,
+        def_id: def_id,
+        children: atom_hashmap(),
+        imports: DVec(),
+        anonymous_children: int_hash(),
+        exported_names: atom_hashmap(),
+        import_resolutions: atom_hashmap(),
+        glob_count: 0u,
+        resolved_import_count: 0u
+    }
+}
+
 // XXX: This is a workaround due to is_none in the standard library mistakenly
 // requiring a T:copy.
 
@@ -501,15 +504,6 @@ struct NameBindings {
     let mut type_span: Option<span>;
     let mut value_span: Option<span>;
 
-    new() {
-        self.module_def = NoModuleDef;
-        self.type_def = None;
-        self.value_def = None;
-        self.module_span = None;
-        self.type_span = None;
-        self.value_span = None;
-    }
-
     /// Creates a new module in this set of name bindings.
     fn define_module(parent_link: ParentLink, def_id: Option<def_id>,
                      sp: span) {
@@ -598,31 +592,22 @@ struct NameBindings {
     }
 }
 
+fn NameBindings() -> NameBindings {
+    NameBindings {
+        module_def: NoModuleDef,
+        type_def: None,
+        value_def: None,
+        module_span: None,
+        type_span: None,
+        value_span: None
+    }
+}
+
+
 /// Interns the names of the primitive types.
 struct PrimitiveTypeTable {
     let primitive_types: hashmap<Atom,prim_ty>;
 
-    new(intr: ident_interner) {
-        self.primitive_types = atom_hashmap();
-
-        self.intern(intr, @~"bool",    ty_bool);
-        self.intern(intr, @~"char",    ty_int(ty_char));
-        self.intern(intr, @~"float",   ty_float(ty_f));
-        self.intern(intr, @~"f32",     ty_float(ty_f32));
-        self.intern(intr, @~"f64",     ty_float(ty_f64));
-        self.intern(intr, @~"int",     ty_int(ty_i));
-        self.intern(intr, @~"i8",      ty_int(ty_i8));
-        self.intern(intr, @~"i16",     ty_int(ty_i16));
-        self.intern(intr, @~"i32",     ty_int(ty_i32));
-        self.intern(intr, @~"i64",     ty_int(ty_i64));
-        self.intern(intr, @~"str",     ty_str);
-        self.intern(intr, @~"uint",    ty_uint(ty_u));
-        self.intern(intr, @~"u8",      ty_uint(ty_u8));
-        self.intern(intr, @~"u16",     ty_uint(ty_u16));
-        self.intern(intr, @~"u32",     ty_uint(ty_u32));
-        self.intern(intr, @~"u64",     ty_uint(ty_u64));
-    }
-
     fn intern(intr: ident_interner, string: @~str,
               primitive_type: prim_ty) {
         let atom = intr.intern(string);
@@ -630,6 +615,32 @@ struct PrimitiveTypeTable {
     }
 }
 
+fn PrimitiveTypeTable(intr: ident_interner) -> PrimitiveTypeTable {
+    let table = PrimitiveTypeTable {
+        primitive_types: atom_hashmap()
+    };
+
+    table.intern(intr, @~"bool",    ty_bool);
+    table.intern(intr, @~"char",    ty_int(ty_char));
+    table.intern(intr, @~"float",   ty_float(ty_f));
+    table.intern(intr, @~"f32",     ty_float(ty_f32));
+    table.intern(intr, @~"f64",     ty_float(ty_f64));
+    table.intern(intr, @~"int",     ty_int(ty_i));
+    table.intern(intr, @~"i8",      ty_int(ty_i8));
+    table.intern(intr, @~"i16",     ty_int(ty_i16));
+    table.intern(intr, @~"i32",     ty_int(ty_i32));
+    table.intern(intr, @~"i64",     ty_int(ty_i64));
+    table.intern(intr, @~"str",     ty_str);
+    table.intern(intr, @~"uint",    ty_uint(ty_u));
+    table.intern(intr, @~"u8",      ty_uint(ty_u8));
+    table.intern(intr, @~"u16",     ty_uint(ty_u16));
+    table.intern(intr, @~"u32",     ty_uint(ty_u32));
+    table.intern(intr, @~"u64",     ty_uint(ty_u64));
+
+    return table;
+}
+
+
 fn namespace_to_str(ns: Namespace) -> ~str {
     match ns {
       TypeNS   => ~"type",
@@ -638,6 +649,59 @@ fn namespace_to_str(ns: Namespace) -> ~str {
     }
 }
 
+fn Resolver(session: session, lang_items: LanguageItems,
+            crate: @crate) -> Resolver {
+
+    let graph_root = @NameBindings();
+
+    (*graph_root).define_module(NoParentLink,
+                                Some({ crate: 0, node: 0 }),
+                                crate.span);
+
+    let current_module = (*graph_root).get_module();
+
+    let self = Resolver {
+        session: session,
+        lang_items: copy lang_items,
+        crate: crate,
+
+        // The outermost module has def ID 0; this is not reflected in the
+        // AST.
+
+        graph_root: graph_root,
+
+        unused_import_lint_level: unused_import_lint_level(session),
+
+        trait_info: new_def_hash(),
+        structs: new_def_hash(),
+
+        unresolved_imports: 0u,
+
+        current_module: current_module,
+        value_ribs: @DVec(),
+        type_ribs: @DVec(),
+        label_ribs: @DVec(),
+
+        xray_context: NoXray,
+        current_trait_refs: None,
+
+        self_atom: syntax::parse::token::special_idents::self_,
+        primitive_type_table: @PrimitiveTypeTable(session.
+                                                  parse_sess.interner),
+
+        namespaces: ~[ ModuleNS, TypeNS, ValueNS ],
+
+        def_map: int_hash(),
+        export_map: int_hash(),
+        export_map2: int_hash(),
+        trait_map: @int_hash(),
+
+        intr: session.intr()
+    };
+
+    return self;
+}
+
 /// The main resolver class.
 struct Resolver {
     let session: session;
@@ -690,48 +754,6 @@ struct Resolver {
     let export_map2: ExportMap2;
     let trait_map: TraitMap;
 
-    new(session: session, lang_items: LanguageItems, crate: @crate) {
-        self.session = session;
-        self.lang_items = copy lang_items;
-        self.crate = crate;
-
-        // The outermost module has def ID 0; this is not reflected in the
-        // AST.
-
-        self.graph_root = @NameBindings();
-        (*self.graph_root).define_module(NoParentLink,
-                                         Some({ crate: 0, node: 0 }),
-                                         crate.span);
-
-        self.unused_import_lint_level = unused_import_lint_level(session);
-
-        self.trait_info = new_def_hash();
-        self.structs = new_def_hash();
-
-        self.unresolved_imports = 0u;
-
-        self.current_module = (*self.graph_root).get_module();
-        self.value_ribs = @DVec();
-        self.type_ribs = @DVec();
-        self.label_ribs = @DVec();
-
-        self.xray_context = NoXray;
-        self.current_trait_refs = None;
-
-        self.self_atom = syntax::parse::token::special_idents::self_;
-        self.primitive_type_table = @PrimitiveTypeTable(self.session.
-                                                        parse_sess.interner);
-
-        self.namespaces = ~[ ModuleNS, TypeNS, ValueNS ];
-
-        self.def_map = int_hash();
-        self.export_map = int_hash();
-        self.export_map2 = int_hash();
-        self.trait_map = @int_hash();
-
-        self.intr = session.intr();
-    }
-
     /// The main name resolution procedure.
     fn resolve(@self, this: @Resolver) {
         self.build_reduced_graph(this);
diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs
index b74d89dc465..3eef274e9d6 100644
--- a/src/rustc/middle/trans/base.rs
+++ b/src/rustc/middle/trans/base.rs
@@ -56,7 +56,6 @@ use option::{is_none, is_some};
 
 struct icx_popper {
     let ccx: @crate_ctxt;
-    new(ccx: @crate_ctxt) { self.ccx = ccx; }
     drop {
       if self.ccx.sess.count_llvm_insns() {
           vec::pop(*(self.ccx.stats.llvm_insn_ctxt));
@@ -64,6 +63,12 @@ struct icx_popper {
     }
 }
 
+fn icx_popper(ccx: @crate_ctxt) -> icx_popper {
+    icx_popper {
+        ccx: ccx
+    }
+}
+
 trait get_insn_ctxt {
     fn insn_ctxt(s: &str) -> icx_popper;
 }
diff --git a/src/rustc/middle/trans/common.rs b/src/rustc/middle/trans/common.rs
index 6fb547d757d..6b3e4063d67 100644
--- a/src/rustc/middle/trans/common.rs
+++ b/src/rustc/middle/trans/common.rs
@@ -95,10 +95,15 @@ type stats =
 
 struct BuilderRef_res {
     let B: BuilderRef;
-    new(B: BuilderRef) { self.B = B; }
     drop { llvm::LLVMDisposeBuilder(self.B); }
 }
 
+fn BuilderRef_res(B: BuilderRef) -> BuilderRef_res {
+    BuilderRef_res {
+        B: B
+    }
+}
+
 // Crate context.  Every crate we compile has one of these.
 type crate_ctxt = {
      sess: session::session,
@@ -485,12 +490,21 @@ struct block_ {
     // The function context for the function to which this block is
     // attached.
     let fcx: fn_ctxt;
-    new(llbb: BasicBlockRef, parent: Option<block>, -kind: block_kind,
-        is_lpad: bool, node_info: Option<node_info>, fcx: fn_ctxt) {
-        // sigh
-        self.llbb = llbb; self.terminated = false; self.unreachable = false;
-        self.parent = parent; self.kind = kind; self.is_lpad = is_lpad;
-        self.node_info = node_info; self.fcx = fcx;
+}
+
+fn block_(llbb: BasicBlockRef, parent: Option<block>, -kind: block_kind,
+          is_lpad: bool, node_info: Option<node_info>, fcx: fn_ctxt)
+    -> block_ {
+
+    block_ {
+        llbb: llbb,
+        terminated: false,
+        unreachable: false,
+        parent: parent,
+        kind: kind,
+        is_lpad: is_lpad,
+        node_info: node_info,
+        fcx: fcx
     }
 }
 
diff --git a/src/rustc/middle/typeck/check/method.rs b/src/rustc/middle/typeck/check/method.rs
index cb4bd4296e3..b356a1b7f67 100644
--- a/src/rustc/middle/typeck/check/method.rs
+++ b/src/rustc/middle/typeck/check/method.rs
@@ -63,6 +63,35 @@ fn get_mode_from_self_type(self_type: ast::self_ty_) -> ast::rmode {
     }
 }
 
+fn lookup(fcx: @fn_ctxt,
+
+        // In a call `a.b::<X, Y, ...>(...)`:
+        expr: @ast::expr,        // The expression `a.b`.
+        self_expr: @ast::expr,   // The expression `a`.
+        borrow_lb: ast::node_id, // Scope to borrow the expression `a` for.
+        node_id: ast::node_id,   // The node_id in which to store the type of
+                                 // `a.b`.
+        m_name: ast::ident,      // The ident `b`.
+        self_ty: ty::t,          // The type of `a`.
+        supplied_tps: ~[ty::t],  // The list of types X, Y, ... .
+        include_private: bool) -> lookup {
+
+    lookup {
+        fcx: fcx,
+        expr: expr,
+        self_expr: self_expr,
+        borrow_lb: borrow_lb,
+        node_id: node_id,
+        m_name: m_name,
+        self_ty: self_ty,
+        derefs: 0u,
+        candidates: DVec(),
+        candidate_impls: new_def_hash(),
+        supplied_tps: supplied_tps,
+        include_private: include_private
+    }
+}
+
 struct lookup {
     let fcx: @fn_ctxt;
     let expr: @ast::expr;
@@ -77,33 +106,6 @@ struct lookup {
     let supplied_tps: ~[ty::t];
     let include_private: bool;
 
-    new(fcx: @fn_ctxt,
-
-        // In a call `a.b::<X, Y, ...>(...)`:
-        expr: @ast::expr,        // The expression `a.b`.
-        self_expr: @ast::expr,   // The expression `a`.
-        borrow_lb: ast::node_id, // Scope to borrow the expression `a` for.
-        node_id: ast::node_id,   // The node_id in which to store the type of
-                                 // `a.b`.
-        m_name: ast::ident,      // The ident `b`.
-        self_ty: ty::t,          // The type of `a`.
-        supplied_tps: ~[ty::t],  // The list of types X, Y, ... .
-        include_private: bool) {
-
-        self.fcx = fcx;
-        self.expr = expr;
-        self.self_expr = self_expr;
-        self.borrow_lb = borrow_lb;
-        self.node_id = node_id;
-        self.m_name = m_name;
-        self.self_ty = self_ty;
-        self.derefs = 0u;
-        self.candidates = DVec();
-        self.candidate_impls = new_def_hash();
-        self.supplied_tps = supplied_tps;
-        self.include_private = include_private;
-    }
-
     // Entrypoint:
     fn method() -> Option<method_map_entry> {
         debug!("method lookup(m_name=%s, self_ty=%s, %?)",
diff --git a/src/rustc/middle/typeck/coherence.rs b/src/rustc/middle/typeck/coherence.rs
index 1377e41cdca..a01b0983e70 100644
--- a/src/rustc/middle/typeck/coherence.rs
+++ b/src/rustc/middle/typeck/coherence.rs
@@ -126,10 +126,22 @@ struct CoherenceInfo {
     // Contains implementations of methods associated with a trait. For these,
     // the associated trait must be imported at the call site.
     let extension_methods: hashmap<def_id,@DVec<@Impl>>;
+}
+
+fn CoherenceInfo() -> CoherenceInfo {
+    CoherenceInfo {
+        inherent_methods: new_def_hash(),
+        extension_methods: new_def_hash()
+    }
+}
 
-    new() {
-        self.inherent_methods = new_def_hash();
-        self.extension_methods = new_def_hash();
+fn CoherenceChecker(crate_context: @crate_ctxt) -> CoherenceChecker {
+    CoherenceChecker {
+        crate_context: crate_context,
+        inference_context: new_infer_ctxt(crate_context.tcx),
+
+        base_type_def_ids: new_def_hash(),
+        privileged_implementations: int_hash()
     }
 }
 
@@ -147,14 +159,6 @@ struct CoherenceChecker {
 
     let privileged_implementations: hashmap<node_id,()>;
 
-    new(crate_context: @crate_ctxt) {
-        self.crate_context = crate_context;
-        self.inference_context = new_infer_ctxt(crate_context.tcx);
-
-        self.base_type_def_ids = new_def_hash();
-        self.privileged_implementations = int_hash();
-    }
-
     // Create a mapping containing a MethodInfo for every provided
     // method in every trait.
     fn build_provided_methods_map(crate: @crate) {
diff --git a/src/rustc/util/common.rs b/src/rustc/util/common.rs
index a4754fd4769..ee941c0ed01 100644
--- a/src/rustc/util/common.rs
+++ b/src/rustc/util/common.rs
@@ -16,10 +16,15 @@ fn indent<R>(op: fn() -> R) -> R {
 
 struct _indenter {
     let _i: ();
-    new(_i: ()) { self._i = (); }
     drop { debug!("<<"); }
 }
 
+fn _indenter(_i: ()) -> _indenter {
+    _indenter {
+        _i: ()
+    }
+}
+
 fn indenter() -> _indenter {
     debug!(">>");
     _indenter(())
diff --git a/src/rustdoc/demo.rs b/src/rustdoc/demo.rs
index 8968d481f6a..1ed5adfa4a6 100644
--- a/src/rustdoc/demo.rs
+++ b/src/rustdoc/demo.rs
@@ -113,7 +113,6 @@ mod blade_runner {
  */
 struct bored {
   let bored: bool;
-  new(bored: bool) { self.bored = bored; }
   drop { log(error, self.bored); }
 }
 
diff --git a/src/test/auxiliary/cci_class.rs b/src/test/auxiliary/cci_class.rs
index 46312dc989b..3a0d119a091 100644
--- a/src/test/auxiliary/cci_class.rs
+++ b/src/test/auxiliary/cci_class.rs
@@ -7,7 +7,13 @@ struct cat {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
 }
 
+    fn cat(in_x : uint, in_y : int) -> cat  {
+        cat {
+            meows: in_x,
+            how_hungry: in_y
+        }
+    }
+
 }
diff --git a/src/test/auxiliary/cci_class_2.rs b/src/test/auxiliary/cci_class_2.rs
index bd3e17000b1..a6dee67eeb4 100644
--- a/src/test/auxiliary/cci_class_2.rs
+++ b/src/test/auxiliary/cci_class_2.rs
@@ -7,9 +7,14 @@ struct cat {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
-
   fn speak() {}
 }
 
+    fn cat(in_x : uint, in_y : int) -> cat {
+        cat {
+            meows: in_x,
+            how_hungry: in_y
+        }
+    }
+
 }
diff --git a/src/test/auxiliary/cci_class_3.rs b/src/test/auxiliary/cci_class_3.rs
index 6b62cd166db..ec32b666805 100644
--- a/src/test/auxiliary/cci_class_3.rs
+++ b/src/test/auxiliary/cci_class_3.rs
@@ -7,11 +7,17 @@ struct cat {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
-
   fn speak() { self.meows += 1u; }
   fn meow_count() -> uint { self.meows }
 
 }
 
+    fn cat(in_x : uint, in_y : int) -> cat {
+        cat {
+            meows: in_x,
+            how_hungry: in_y
+        }
+    }
+
+
 }
diff --git a/src/test/auxiliary/cci_class_4.rs b/src/test/auxiliary/cci_class_4.rs
index 95ca81bf97f..78e9a3a599c 100644
--- a/src/test/auxiliary/cci_class_4.rs
+++ b/src/test/auxiliary/cci_class_4.rs
@@ -15,9 +15,6 @@ struct cat {
   let mut how_hungry : int;
   let name : ~str;
 
-  new(in_x : uint, in_y : int, in_name: ~str)
-    { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; }
-
   fn speak() { self.meow(); }
 
   fn eat() -> bool {
@@ -33,4 +30,12 @@ struct cat {
   }
 }
 
+    fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
+        cat {
+            meows: in_x,
+            how_hungry: in_y,
+            name: in_name
+        }
+    }
+
 }
diff --git a/src/test/auxiliary/cci_class_5.rs b/src/test/auxiliary/cci_class_5.rs
index 5e5c5c53d9c..b8b68fc9a51 100644
--- a/src/test/auxiliary/cci_class_5.rs
+++ b/src/test/auxiliary/cci_class_5.rs
@@ -8,7 +8,13 @@ struct cat {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
 }
 
+    fn cat(in_x : uint, in_y : int) -> cat {
+        cat {
+            meows: in_x,
+            how_hungry: in_y
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/src/test/auxiliary/cci_class_6.rs b/src/test/auxiliary/cci_class_6.rs
index 18ffb35d3e5..9d8d5543cd3 100644
--- a/src/test/auxiliary/cci_class_6.rs
+++ b/src/test/auxiliary/cci_class_6.rs
@@ -8,14 +8,20 @@ struct cat<U> {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int, -in_info: ~[U])
-    { self.meows = in_x; self.how_hungry = in_y;
-      self.info <- in_info; }
-
   fn speak<T>(stuff: ~[T]) {
     self.meows += stuff.len();
   }
   fn meow_count() -> uint { self.meows }
 }
 
+
+fn cat<U>(in_x : uint, in_y : int, -in_info: ~[U]) -> cat<U> {
+    cat {
+        meows: in_x,
+        how_hungry: in_y,
+        info: in_info
+    }
+}
+
+
 }
diff --git a/src/test/auxiliary/cci_class_cast.rs b/src/test/auxiliary/cci_class_cast.rs
index 830ca90628a..c12a8d2e926 100644
--- a/src/test/auxiliary/cci_class_cast.rs
+++ b/src/test/auxiliary/cci_class_cast.rs
@@ -18,9 +18,6 @@ struct cat : ToStr {
   let mut how_hungry : int;
   let name : ~str;
 
-  new(in_x : uint, in_y : int, in_name: ~str)
-    { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; }
-
   fn speak() { self.meow(); }
 
   fn eat() -> bool {
@@ -37,4 +34,15 @@ struct cat : ToStr {
 
   fn to_str() -> ~str { self.name }
 }
+
+fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y,
+        name: in_name
+    }
 }
+
+}
+
+
diff --git a/src/test/auxiliary/issue-2526.rs b/src/test/auxiliary/issue-2526.rs
index 1d1adbf179d..ee7d57aa397 100644
--- a/src/test/auxiliary/issue-2526.rs
+++ b/src/test/auxiliary/issue-2526.rs
@@ -9,10 +9,15 @@ export context;
 
 struct arc_destruct<T:const> {
   let _data: int;
-  new(data: int) { self._data = data; }
   drop {}
 }
 
+fn arc_destruct<T: const>(data: int) -> arc_destruct<T> {
+    arc_destruct {
+        _data: data
+    }
+}
+
 fn arc<T: const>(_data: T) -> arc_destruct<T> {
     arc_destruct(0)
 }
@@ -24,11 +29,15 @@ fn init() -> arc_destruct<context_res> unsafe {
 struct context_res {
     let ctx : int;
 
-    new() { self.ctx = 0; }
-
     drop { }
 }
 
+fn context_res() -> context_res {
+    context_res {
+        ctx: 0
+    }
+}
+
 type context = arc_destruct<context_res>;
 
 impl context {
diff --git a/src/test/auxiliary/issue-3012-1.rs b/src/test/auxiliary/issue-3012-1.rs
index d47f16c7f11..2193550c650 100644
--- a/src/test/auxiliary/issue-3012-1.rs
+++ b/src/test/auxiliary/issue-3012-1.rs
@@ -7,7 +7,13 @@ export socket_handle;
 
 struct socket_handle {
     let sockfd: libc::c_int;
-    new(x: libc::c_int) {self.sockfd = x;}
     drop { /* c::close(self.sockfd); */ }
 }
+
+    fn socket_handle(x: libc::c_int) -> socket_handle {
+        socket_handle {
+            sockfd: x
+        }
+    }
+
 }
diff --git a/src/test/auxiliary/issue2170lib.rs b/src/test/auxiliary/issue2170lib.rs
index cca092faf00..7393ffd42f9 100644
--- a/src/test/auxiliary/issue2170lib.rs
+++ b/src/test/auxiliary/issue2170lib.rs
@@ -5,6 +5,11 @@ fn foo(_x: i32) {
 
 struct rsrc {
   let x: i32;
-  new(x: i32) { self.x = x; }
   drop { foo(self.x); }
+}
+
+fn rsrc(x: i32) -> rsrc {
+    rsrc {
+        x: x
+    }
 }
\ No newline at end of file
diff --git a/src/test/auxiliary/test_comm.rs b/src/test/auxiliary/test_comm.rs
index 0fb66520479..a9b87d466f0 100644
--- a/src/test/auxiliary/test_comm.rs
+++ b/src/test/auxiliary/test_comm.rs
@@ -29,9 +29,6 @@ fn port<T: send>() -> port<T> {
 
 struct port_ptr<T:send> {
    let po: *rust_port;
-   new(po: *rust_port) {
-    debug!("in the port_ptr constructor");
-    self.po = po; }
    drop unsafe {
     debug!("in the port_ptr destructor");
        do task::unkillable {
@@ -51,6 +48,12 @@ struct port_ptr<T:send> {
   }
 }
 
+fn port_ptr<T: send>(po: *rust_port) -> port_ptr<T> {
+    debug!("in the port_ptr constructor");
+    port_ptr {
+        po: po
+    }
+}
 
 /**
  * Receive from a port.  If no data is available on the port then the
diff --git a/src/test/bench/task-perf-alloc-unwind.rs b/src/test/bench/task-perf-alloc-unwind.rs
index 51267986e6c..2191ba691ce 100644
--- a/src/test/bench/task-perf-alloc-unwind.rs
+++ b/src/test/bench/task-perf-alloc-unwind.rs
@@ -42,10 +42,15 @@ enum st {
 
 struct r {
   let _l: @nillist;
-  new(l: @nillist) { self._l = l; }
   drop {}
 }
 
+fn r(l: @nillist) -> r {
+    r {
+        _l: l
+    }
+}
+
 fn recurse_or_fail(depth: int, st: Option<st>) {
     if depth == 0 {
         debug!("unwinding %.4f", precise_time_s());
diff --git a/src/test/bench/task-perf-word-count-generic.rs b/src/test/bench/task-perf-word-count-generic.rs
index c414c85781d..5fe738aa7b1 100644
--- a/src/test/bench/task-perf-word-count-generic.rs
+++ b/src/test/bench/task-perf-word-count-generic.rs
@@ -98,7 +98,6 @@ fn reduce(&&word: ~str, get: map_reduce::getter<int>) {
 
 struct box<T> {
     let mut contents: Option<T>;
-    new(+x: T) { self.contents = Some(x); }
 
     fn swap(f: fn(+T) -> T) {
         let mut tmp = None;
@@ -113,6 +112,12 @@ struct box<T> {
     }
 }
 
+fn box<T>(+x: T) -> box<T> {
+    box {
+        contents: Some(x)
+    }
+}
+
 mod map_reduce {
     export putter;
     export getter;
@@ -345,10 +350,6 @@ fn is_word_char(c: char) -> bool {
 struct random_word_reader: word_reader {
     let mut remaining: uint;
     let rng: rand::Rng;
-    new(count: uint) {
-        self.remaining = count;
-        self.rng = rand::Rng();
-    }
 
     fn read_word() -> Option<~str> {
         if self.remaining > 0 {
@@ -359,3 +360,10 @@ struct random_word_reader: word_reader {
         else { None }
     }
 }
+
+fn random_word_reader(count: uint) -> random_word_reader {
+    random_word_reader {
+        remaining: count,
+        rng: rand::Rng()
+    }
+}
diff --git a/src/test/compile-fail/assign-to-method.rs b/src/test/compile-fail/assign-to-method.rs
index 0208b745d49..2fe4e49e0a8 100644
--- a/src/test/compile-fail/assign-to-method.rs
+++ b/src/test/compile-fail/assign-to-method.rs
@@ -6,7 +6,13 @@ struct cat {
   let how_hungry : int;
 
   fn speak() { self.meows += 1u; }
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
+}
+
+fn cat(in_x : uint, in_y : int) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y
+    }
 }
 
 fn main() {
diff --git a/src/test/compile-fail/block-must-not-have-result-res.rs b/src/test/compile-fail/block-must-not-have-result-res.rs
index 958cabb61b8..3ab4a6a72f2 100644
--- a/src/test/compile-fail/block-must-not-have-result-res.rs
+++ b/src/test/compile-fail/block-must-not-have-result-res.rs
@@ -1,7 +1,6 @@
 // error-pattern:mismatched types: expected `()` but found `bool`
 
 struct r {
-  new() {}
   drop { true }
 }
 
diff --git a/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs b/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs
index 6dfe23c1995..e643cd4ceaa 100644
--- a/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs
+++ b/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs
@@ -1,9 +1,14 @@
 struct defer {
     x: &[&str];
-    new(x: &[&str]) { self.x = x; }
     drop { #error["%?", self.x]; }
 }
 
+fn defer(x: &r/[&r/str]) -> defer/&r {
+    defer {
+        x: x
+    }
+}
+
 fn main() {
     let _x = defer(~["Goodbye", "world!"]); //~ ERROR illegal borrow
 }
diff --git a/src/test/compile-fail/borrowck-unary-move-2.rs b/src/test/compile-fail/borrowck-unary-move-2.rs
index 82c09f5036b..b0a49db488a 100644
--- a/src/test/compile-fail/borrowck-unary-move-2.rs
+++ b/src/test/compile-fail/borrowck-unary-move-2.rs
@@ -1,6 +1,13 @@
 struct noncopyable {
-    i: (); new() { self.i = (); } drop { #error["dropped"]; }
+    i: (); drop { #error["dropped"]; }
 }
+
+fn noncopyable() -> noncopyable {
+    noncopyable {
+        i: ()
+    }
+}
+
 enum wrapper = noncopyable;
 
 fn main() {
diff --git a/src/test/compile-fail/cap-clause-illegal-cap.rs b/src/test/compile-fail/cap-clause-illegal-cap.rs
index 3703c44f520..22f63d2e2ce 100644
--- a/src/test/compile-fail/cap-clause-illegal-cap.rs
+++ b/src/test/compile-fail/cap-clause-illegal-cap.rs
@@ -1,6 +1,12 @@
 // error-pattern: copying a noncopyable value
 
-struct foo { let x: int; new(x: int) { self.x = x; } drop { } }
+struct foo { let x: int; drop { } }
+
+fn foo(x: int) -> foo {
+    foo {
+        x: x
+    }
+}
 
 fn to_lambda2(b: foo) -> fn@(uint) -> uint {
     // test case where copy clause specifies a value that is not used
diff --git a/src/test/compile-fail/class-cast-to-trait.rs b/src/test/compile-fail/class-cast-to-trait.rs
index 7a6c85474b5..5d7eac5fd9c 100644
--- a/src/test/compile-fail/class-cast-to-trait.rs
+++ b/src/test/compile-fail/class-cast-to-trait.rs
@@ -18,9 +18,6 @@ struct cat : noisy {
   let mut how_hungry : int;
   let name : str;
 
-  new(in_x : uint, in_y : int, in_name: str)
-    { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; }
-
   fn speak() { self.meow(); }
 
   fn eat() -> bool {
@@ -36,6 +33,14 @@ struct cat : noisy {
   }
 }
 
+fn cat(in_x : uint, in_y : int, in_name: str) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y,
+        name: in_name
+    }
+}
+
 fn main() {
   let nyan : noisy  = cat(0u, 2, "nyan") as noisy;
   nyan.eat();
diff --git a/src/test/compile-fail/class-implements-int.rs b/src/test/compile-fail/class-implements-int.rs
index 9f86953c3cf..d85a6e57827 100644
--- a/src/test/compile-fail/class-implements-int.rs
+++ b/src/test/compile-fail/class-implements-int.rs
@@ -1,6 +1,11 @@
 struct cat : int { //~ ERROR trait
   let meows: uint;
-  new(in_x : uint) { self.meows = in_x; }
+}
+
+fn cat(in_x : uint) -> cat {
+    cat {
+        meows: in_x
+    }
 }
 
 fn main() {
diff --git a/src/test/compile-fail/class-method-missing.rs b/src/test/compile-fail/class-method-missing.rs
index 31cc23d8162..38680d4274d 100644
--- a/src/test/compile-fail/class-method-missing.rs
+++ b/src/test/compile-fail/class-method-missing.rs
@@ -5,7 +5,12 @@ trait animal {
 
 struct cat : animal {
   let meows: uint;
-  new(in_x : uint) { self.meows = in_x; }
+}
+
+fn cat(in_x : uint) -> cat {
+    cat {
+        meows: in_x
+    }
 }
 
 fn main() {
diff --git a/src/test/compile-fail/class-missing-self.rs b/src/test/compile-fail/class-missing-self.rs
index 57c8ec272e1..95795bdd182 100644
--- a/src/test/compile-fail/class-missing-self.rs
+++ b/src/test/compile-fail/class-missing-self.rs
@@ -9,7 +9,7 @@ struct cat {
     }
   }
 
-  new(in_x : uint) { self.meows = in_x; }
 }
 
+
  fn main() { }
\ No newline at end of file
diff --git a/src/test/compile-fail/copy-a-resource.rs b/src/test/compile-fail/copy-a-resource.rs
index 2e8673156bf..6192f340121 100644
--- a/src/test/compile-fail/copy-a-resource.rs
+++ b/src/test/compile-fail/copy-a-resource.rs
@@ -2,8 +2,13 @@
 
 struct foo {
   let i: int;
-  new(i:int) { self.i = i; }
   drop {}
 }
 
+fn foo(i:int) -> foo {
+    foo {
+        i: i
+    }
+}
+
 fn main() { let x <- foo(10); let y = x; log(error, x); }
diff --git a/src/test/compile-fail/issue-2063-resource.rs b/src/test/compile-fail/issue-2063-resource.rs
index 98eb509c8d7..191420e5998 100644
--- a/src/test/compile-fail/issue-2063-resource.rs
+++ b/src/test/compile-fail/issue-2063-resource.rs
@@ -4,8 +4,8 @@
 struct t { //~ ERROR this type cannot be instantiated
   let x: x;
   let to_str: ();
-  new(x: x) { self.x = x; self.to_str = (); }
 }
+
 enum x = @t; //~ ERROR this type cannot be instantiated
 
 fn main() {
diff --git a/src/test/compile-fail/issue-2370-2.rs b/src/test/compile-fail/issue-2370-2.rs
index e8abfd3f450..273483415fc 100644
--- a/src/test/compile-fail/issue-2370-2.rs
+++ b/src/test/compile-fail/issue-2370-2.rs
@@ -1,7 +1,9 @@
 // error-pattern: type cat cannot be dereferenced
-struct cat { new() {} }
+struct cat {
+    x: ()
+}
 
 fn main() {
-  let kitty : cat = cat();
-  log (error, *kitty);
+    let kitty : cat = cat { x: () };
+    log (error, *kitty);
 }
\ No newline at end of file
diff --git a/src/test/compile-fail/issue-2370.rs b/src/test/compile-fail/issue-2370.rs
index 9074eb7e1b8..dd8de95fdaa 100644
--- a/src/test/compile-fail/issue-2370.rs
+++ b/src/test/compile-fail/issue-2370.rs
@@ -1,7 +1,9 @@
 // error-pattern: type cat cannot be dereferenced
-struct cat { new() {} }
+struct cat {
+    foo: ()
+}
 
 fn main() {
-  let nyan = cat();
-  log (error, *nyan);
+    let nyan = cat { foo: () };
+    log (error, *nyan);
 }
\ No newline at end of file
diff --git a/src/test/compile-fail/issue-2487-b.rs b/src/test/compile-fail/issue-2487-b.rs
index ada5b6ffa05..3469e9ea53a 100644
--- a/src/test/compile-fail/issue-2487-b.rs
+++ b/src/test/compile-fail/issue-2487-b.rs
@@ -1,8 +1,6 @@
 struct socket {
     let sock: int;
 
-    new() { self.sock = 1; }
-
     drop { }
 
     fn set_identity()  {
diff --git a/src/test/compile-fail/issue-2509-a.rs b/src/test/compile-fail/issue-2509-a.rs
index fc1f4dc7159..a24e3bdee36 100644
--- a/src/test/compile-fail/issue-2509-a.rs
+++ b/src/test/compile-fail/issue-2509-a.rs
@@ -1,9 +1,5 @@
 struct c { //~ ERROR a struct must have at least one field
-    new() { }
 }
 
 fn main() {
-    let a = c();
-    let x = ~[a];
-    let _y = x[0];
 }
diff --git a/src/test/compile-fail/issue-2718-a.rs b/src/test/compile-fail/issue-2718-a.rs
index d7ea3f67d41..e8323acb56b 100644
--- a/src/test/compile-fail/issue-2718-a.rs
+++ b/src/test/compile-fail/issue-2718-a.rs
@@ -1,6 +1,5 @@
 struct send_packet<T: copy> {
   let p: T;
-  new(p: T) { self.p = p; }
 }
 
 
diff --git a/src/test/compile-fail/issue-2825-b.rs b/src/test/compile-fail/issue-2825-b.rs
index 7be3d077050..a879dae3859 100644
--- a/src/test/compile-fail/issue-2825-b.rs
+++ b/src/test/compile-fail/issue-2825-b.rs
@@ -1,14 +1,17 @@
 struct example {
     let x: int;
-    new() {
-        self.x = 1;
-    }
     drop {} //~ ERROR First destructor declared
     drop {
         debug!("Goodbye, cruel world");
     }
 }
 
+fn example() -> example {
+    example {
+        x: 1
+    }
+}
+
 fn main(_args: ~[~str]) {
   let e: example = example();
 }
diff --git a/src/test/compile-fail/issue-2825.rs b/src/test/compile-fail/issue-2825.rs
deleted file mode 100644
index 82a76273bd4..00000000000
--- a/src/test/compile-fail/issue-2825.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-struct example {
-  let x: int;
-  new() { //~ ERROR First constructor declared here
-    self.x = 1;
-  }
-  new(x_: int) {
-    self.x = x_;
-  }
-}
-
-fn main(_args: ~[~str]) {
-  let e: example = example();
-}
diff --git a/src/test/compile-fail/issue-3021-b.rs b/src/test/compile-fail/issue-3021-b.rs
index 005cae43081..d267aa52bfd 100644
--- a/src/test/compile-fail/issue-3021-b.rs
+++ b/src/test/compile-fail/issue-3021-b.rs
@@ -8,7 +8,6 @@ fn siphash(k0 : u64) {
            self.v0 = k0 ^ 0x736f6d6570736575; //~ ERROR attempted dynamic environment-capture
            //~^ ERROR unresolved name: k0
         }
-        new() { self.v0 = 0; }
     }
 }
 
diff --git a/src/test/compile-fail/lint-non-camel-case-class.rs b/src/test/compile-fail/lint-non-camel-case-class.rs
index 94043961484..8254b867130 100644
--- a/src/test/compile-fail/lint-non-camel-case-class.rs
+++ b/src/test/compile-fail/lint-non-camel-case-class.rs
@@ -1,10 +1,6 @@
 #[forbid(non_camel_case_types)]
 struct foo { //~ ERROR type, variant, or trait must be camel case
     let bar: int;
-
-    new() {
-        self.bar = 0;
-    }
 }
 
 fn main() {
diff --git a/src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs b/src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs
deleted file mode 100644
index a3277db4fce..00000000000
--- a/src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-struct cat {
-  let how_hungry : int;
-  fn meow() {}
-  new() {
-     self.meow();
-     //~^ ERROR use of possibly uninitialized field: `self.how_hungry`
-  }
-}
-
-fn main() {
-}
diff --git a/src/test/compile-fail/liveness-ctor-field-never-init.rs b/src/test/compile-fail/liveness-ctor-field-never-init.rs
deleted file mode 100644
index 405c1a4b57b..00000000000
--- a/src/test/compile-fail/liveness-ctor-field-never-init.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-struct cat {
-  let how_hungry : int;
-  new() {} //~ ERROR field `self.how_hungry` is never initialized
-}
-
-fn main() {
-}
diff --git a/src/test/compile-fail/liveness-ctor-uninit-field.rs b/src/test/compile-fail/liveness-ctor-uninit-field.rs
deleted file mode 100644
index 9a846efae4e..00000000000
--- a/src/test/compile-fail/liveness-ctor-uninit-field.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-struct cat {
-  let mut a: int;
-  let mut b: int;
-  let mut c: int;
-
-  new() {
-     self.a = 3;
-     self.b = self.a;
-     self.a += self.c; //~ ERROR use of possibly uninitialized field: `self.c`
-  }
-}
-
-fn main() {
-}
diff --git a/src/test/compile-fail/liveness-ctor-uninit-var.rs b/src/test/compile-fail/liveness-ctor-uninit-var.rs
deleted file mode 100644
index 041812a575f..00000000000
--- a/src/test/compile-fail/liveness-ctor-uninit-var.rs
+++ /dev/null
@@ -1,22 +0,0 @@
-struct cat {
-  priv {
-    let mut meows : uint;
-  }
-
-  let how_hungry : int;
-
-  fn eat() {
-    self.how_hungry -= 5;
-  }
-
-  new(in_x : uint, in_y : int) {
-    let foo;
-    self.meows = in_x + (in_y as uint);
-    self.how_hungry = foo; //~ ERROR use of possibly uninitialized variable: `foo`
-  }
-}
-
-fn main() {
-  let nyan : cat = cat(52u, 99);
-  nyan.eat();
-}
diff --git a/src/test/compile-fail/liveness-unused.rs b/src/test/compile-fail/liveness-unused.rs
index e991a210422..656a7c492eb 100644
--- a/src/test/compile-fail/liveness-unused.rs
+++ b/src/test/compile-fail/liveness-unused.rs
@@ -50,10 +50,9 @@ fn f4b() -> int {
 // leave this in here just to trigger compile-fail:
 struct r {
     let x: ();
-    new() { self.x = (); }
     drop {}
 }
 fn main() {
-    let x = r();
+    let x = r { x: () };
     fn@() { copy x; }; //~ ERROR copying a noncopyable value
 }
diff --git a/src/test/compile-fail/mutable-class-fields-2.rs b/src/test/compile-fail/mutable-class-fields-2.rs
index 808b7ff3177..5ebbf63a3cf 100644
--- a/src/test/compile-fail/mutable-class-fields-2.rs
+++ b/src/test/compile-fail/mutable-class-fields-2.rs
@@ -10,7 +10,13 @@ struct cat {
     self.how_hungry -= 5;
   }
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
+}
+
+fn cat(in_x : uint, in_y : int) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y
+    }
 }
 
 fn main() {
diff --git a/src/test/compile-fail/mutable-class-fields.rs b/src/test/compile-fail/mutable-class-fields.rs
index 011656ac3ad..da79c9cb0a6 100644
--- a/src/test/compile-fail/mutable-class-fields.rs
+++ b/src/test/compile-fail/mutable-class-fields.rs
@@ -6,7 +6,13 @@ struct cat {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
+}
+
+fn cat(in_x : uint, in_y : int) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y
+    }
 }
 
 fn main() {
diff --git a/src/test/compile-fail/no-send-res-ports.rs b/src/test/compile-fail/no-send-res-ports.rs
index 2a6c26e9f13..6ee79873435 100644
--- a/src/test/compile-fail/no-send-res-ports.rs
+++ b/src/test/compile-fail/no-send-res-ports.rs
@@ -1,9 +1,14 @@
 fn main() {
     struct foo {
       let _x: comm::Port<()>;
-      new(x: comm::Port<()>) { self._x = x; }
       drop {}
     }
+
+    fn foo(x: comm::Port<()>) -> foo {
+        foo {
+            _x: x
+        }
+    }
    
     let x = ~mut Some(foo(comm::Port()));
 
diff --git a/src/test/compile-fail/non-const.rs b/src/test/compile-fail/non-const.rs
index cd160294f74..7e3545fb89b 100644
--- a/src/test/compile-fail/non-const.rs
+++ b/src/test/compile-fail/non-const.rs
@@ -4,16 +4,26 @@ fn foo<T: const>(_x: T) { }
 
 struct r {
   let x:int;
-  new(x:int) { self.x = x; }
   drop {}
 }
 
+fn r(x:int) -> r {
+    r {
+        x: x
+    }
+}
+
 struct r2 {
   let x:@mut int;
-  new(x:@mut int) { self.x = x; }
   drop {}
 }
 
+fn r2(x:@mut int) -> r2 {
+    r2 {
+        x: x
+    }
+}
+
 fn main() {
     foo({f: 3});
     foo({mut f: 3}); //~ ERROR missing `const`
diff --git a/src/test/compile-fail/noncopyable-class.rs b/src/test/compile-fail/noncopyable-class.rs
index e1fd1294b14..2e8c3a6a213 100644
--- a/src/test/compile-fail/noncopyable-class.rs
+++ b/src/test/compile-fail/noncopyable-class.rs
@@ -4,14 +4,25 @@
 // copied
 struct bar {
   let x: int;
-  new(x:int) {self.x = x;}
   drop {}
 }
 
+fn bar(x:int) -> bar {
+    bar {
+        x: x
+    }
+}
+
 struct foo {
   let i: int;
   let j: bar;
-  new(i:int) { self.i = i; self.j = bar(5); }
+}
+
+fn foo(i:int) -> foo {
+    foo {
+        i: i,
+        j: bar(5)
+    }
 }
 
 fn main() { let x <- foo(10); let y = x; log(error, x); }
diff --git a/src/test/compile-fail/pinned-deep-copy.rs b/src/test/compile-fail/pinned-deep-copy.rs
index ce9dfbc3f62..d2b0cabf4a9 100644
--- a/src/test/compile-fail/pinned-deep-copy.rs
+++ b/src/test/compile-fail/pinned-deep-copy.rs
@@ -2,10 +2,15 @@
 
 struct r {
   let i: @mut int;
-  new(i: @mut int) { self.i = i; }
   drop { *(self.i) = *(self.i) + 1; }
 }
 
+fn r(i: @mut int) -> r {
+    r {
+        i: i
+    }
+}
+
 fn main() {
     let i = @mut 0;
     {
diff --git a/src/test/compile-fail/private-method.rs b/src/test/compile-fail/private-method.rs
index a1d71ba6af9..52236642c87 100644
--- a/src/test/compile-fail/private-method.rs
+++ b/src/test/compile-fail/private-method.rs
@@ -7,7 +7,13 @@ struct cat {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
+}
+
+fn cat(in_x : uint, in_y : int) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y
+    }
 }
 
 fn main() {
diff --git a/src/test/compile-fail/record-with-resource.rs b/src/test/compile-fail/record-with-resource.rs
index e194f73c753..577367e673b 100644
--- a/src/test/compile-fail/record-with-resource.rs
+++ b/src/test/compile-fail/record-with-resource.rs
@@ -2,10 +2,15 @@
 
 struct my_resource {
   let x: int;
-  new(x: int) { self.x = x; }
   drop { log(error, self.x); }
 }
 
+fn my_resource(x: int) -> my_resource {
+    my_resource {
+        x: x
+    }
+}
+
 fn main() {
     {
         let a = {x: 0, y: my_resource(20)};
diff --git a/src/test/compile-fail/regions-addr-of-self.rs b/src/test/compile-fail/regions-addr-of-self.rs
index 9bfc39c32dc..d6ca910bc93 100644
--- a/src/test/compile-fail/regions-addr-of-self.rs
+++ b/src/test/compile-fail/regions-addr-of-self.rs
@@ -1,10 +1,6 @@
 struct dog {
     let mut cats_chased: uint;
 
-    new() {
-        self.cats_chased = 0u;
-    }
-
     fn chase_cat() {
         let p: &static/mut uint = &mut self.cats_chased; //~ ERROR illegal borrow
         *p += 1u;
@@ -16,6 +12,12 @@ struct dog {
     }
 }
 
+fn dog() -> dog {
+    dog {
+        cats_chased: 0u
+    }
+}
+
 fn main() {
     let d = dog();
     d.chase_cat();
diff --git a/src/test/compile-fail/regions-addr-of-upvar-self.rs b/src/test/compile-fail/regions-addr-of-upvar-self.rs
index 31d2fef14eb..145cc0f722d 100644
--- a/src/test/compile-fail/regions-addr-of-upvar-self.rs
+++ b/src/test/compile-fail/regions-addr-of-upvar-self.rs
@@ -1,10 +1,6 @@
 struct dog {
     let mut food: uint;
 
-    new() {
-        self.food = 0u;
-    }
-
     fn chase_cat() {
         for uint::range(0u, 10u) |_i| {
             let p: &static/mut uint = &mut self.food; //~ ERROR illegal borrow
diff --git a/src/test/compile-fail/regions-bounds.rs b/src/test/compile-fail/regions-bounds.rs
index a4faeed6958..4e272e80663 100644
--- a/src/test/compile-fail/regions-bounds.rs
+++ b/src/test/compile-fail/regions-bounds.rs
@@ -4,7 +4,7 @@
 
 enum an_enum = &int;
 trait a_trait { fn foo() -> &self/int; }
-struct a_class { let x:&self/int; new(x:&self/int) { self.x = x; } }
+struct a_class { let x:&self/int; }
 
 fn a_fn1(e: an_enum/&a) -> an_enum/&b {
     return e; //~ ERROR mismatched types: expected `an_enum/&b` but found `an_enum/&a`
diff --git a/src/test/compile-fail/regions-in-rsrcs.rs b/src/test/compile-fail/regions-in-rsrcs.rs
index e02683b7372..ed2be33cb23 100644
--- a/src/test/compile-fail/regions-in-rsrcs.rs
+++ b/src/test/compile-fail/regions-in-rsrcs.rs
@@ -1,18 +1,15 @@
 struct yes0 {
   let x: &uint;
-  new(x: &uint) { self.x = x; }
   drop {}
 }
 
 struct yes1 {
   let x: &self/uint;
-  new(x: &self/uint) { self.x = x; }
   drop {}
 }
 
 struct yes2 {
   let x: &foo/uint; //~ ERROR named regions other than `self` are not allowed as part of a type declaration
-  new(x: &foo/uint) { self.x = x; } //~ ERROR named regions other than `self` are not allowed as part of a type declaration
   drop {}
 }
 
diff --git a/src/test/compile-fail/tps-invariant-class.rs b/src/test/compile-fail/tps-invariant-class.rs
index 641e0351a47..d3e5c4aea3b 100644
--- a/src/test/compile-fail/tps-invariant-class.rs
+++ b/src/test/compile-fail/tps-invariant-class.rs
@@ -1,8 +1,10 @@
 struct box_impl<T> {
     let mut f: T;
+}
 
-    new(f: T) {
-        self.f = f;
+fn box_impl<T>(f: T) -> box_impl<T> {
+    box_impl {
+        f: f
     }
 }
 
diff --git a/src/test/compile-fail/unique-pinned-nocopy.rs b/src/test/compile-fail/unique-pinned-nocopy.rs
index d729aad5f02..e3dd18092d7 100644
--- a/src/test/compile-fail/unique-pinned-nocopy.rs
+++ b/src/test/compile-fail/unique-pinned-nocopy.rs
@@ -2,12 +2,11 @@
 
 struct r {
   let b:bool;
-  new(b: bool) { self.b = b; }
   drop {}
 }
 
 fn main() {
-    let i <- ~r(true);
+    let i <- ~r { b: true };
     let j = i;
     log(debug, i);
 }
\ No newline at end of file
diff --git a/src/test/compile-fail/unique-vec-res.rs b/src/test/compile-fail/unique-vec-res.rs
index e357bf28373..d0386996515 100644
--- a/src/test/compile-fail/unique-vec-res.rs
+++ b/src/test/compile-fail/unique-vec-res.rs
@@ -2,7 +2,6 @@
 
 struct r {
   let i: @mut int;
-  new(i: @mut int) { self.i = i; }
   drop { *(self.i) = *(self.i) + 1; }
 }
 
@@ -13,8 +12,8 @@ fn f<T>(+i: ~[T], +j: ~[T]) {
 fn main() {
     let i1 = @mut 0;
     let i2 = @mut 1;
-    let r1 <- ~[~r(i1)];
-    let r2 <- ~[~r(i2)];
+    let r1 <- ~[~r { i: i1 }];
+    let r2 <- ~[~r { i: i2 }];
     f(r1, r2);
     log(debug, (r2, *i1));
     log(debug, (r1, *i2));
diff --git a/src/test/compile-fail/unsendable-class.rs b/src/test/compile-fail/unsendable-class.rs
index 29d89fbf860..66bc0ae544e 100644
--- a/src/test/compile-fail/unsendable-class.rs
+++ b/src/test/compile-fail/unsendable-class.rs
@@ -4,7 +4,13 @@
 struct foo {
   let i: int;
   let j: @~str;
-  new(i:int, j: @~str) { self.i = i; self.j = j; }
+}
+
+fn foo(i:int, j: @~str) -> foo {
+    foo {
+        i: i,
+        j: j
+    }
 }
 
 fn main() {
diff --git a/src/test/run-fail/morestack2.rs b/src/test/run-fail/morestack2.rs
index 3edc22252b2..c501ea6d7b8 100644
--- a/src/test/run-fail/morestack2.rs
+++ b/src/test/run-fail/morestack2.rs
@@ -22,7 +22,6 @@ fn getbig_call_c_and_fail(i: int) {
 
 struct and_then_get_big_again {
   let x:int;
-  new(x:int) {self.x = x;}
   drop {
     fn getbig(i: int) {
         if i != 0 {
@@ -33,6 +32,12 @@ struct and_then_get_big_again {
   }
 }
 
+fn and_then_get_big_again(x:int) -> and_then_get_big_again {
+    and_then_get_big_again {
+        x: x
+    }
+}
+
 fn main() {
     do task::spawn {
         let r = and_then_get_big_again(4);
diff --git a/src/test/run-fail/morestack3.rs b/src/test/run-fail/morestack3.rs
index fd537df50eb..1db2a8b1a98 100644
--- a/src/test/run-fail/morestack3.rs
+++ b/src/test/run-fail/morestack3.rs
@@ -15,7 +15,6 @@ fn getbig_and_fail(&&i: int) {
 
 struct and_then_get_big_again {
   let x:int;
-  new(x:int) {self.x = x;}
   drop {
     fn getbig(i: int) {
         if i != 0 {
@@ -26,6 +25,12 @@ struct and_then_get_big_again {
   }
 }
 
+fn and_then_get_big_again(x:int) -> and_then_get_big_again {
+    and_then_get_big_again {
+        x: x
+    }
+}
+
 fn main() {
     do task::spawn {
         getbig_and_fail(400);
diff --git a/src/test/run-fail/morestack4.rs b/src/test/run-fail/morestack4.rs
index 9977e4616d8..2424db84521 100644
--- a/src/test/run-fail/morestack4.rs
+++ b/src/test/run-fail/morestack4.rs
@@ -15,10 +15,15 @@ fn getbig_and_fail(&&i: int) {
 
 struct and_then_get_big_again {
   let x:int;
-  new(x:int) {self.x = x;}
   drop {}
 }
 
+fn and_then_get_big_again(x:int) -> and_then_get_big_again {
+    and_then_get_big_again {
+        x: x
+    }
+}
+
 fn main() {
     do task::spawn {
         getbig_and_fail(1);
diff --git a/src/test/run-fail/rt-set-exit-status-fail2.rs b/src/test/run-fail/rt-set-exit-status-fail2.rs
index 6a722ecdedf..342be7edb1a 100644
--- a/src/test/run-fail/rt-set-exit-status-fail2.rs
+++ b/src/test/run-fail/rt-set-exit-status-fail2.rs
@@ -8,7 +8,12 @@ struct r {
   drop {
     os::set_exit_status(50);
   }
-  new(x:int) {self.x = x;}
+}
+
+fn r(x:int) -> r {
+    r {
+        x: x
+    }
 }
 
 fn main() {
diff --git a/src/test/run-fail/unwind-box-res.rs b/src/test/run-fail/unwind-box-res.rs
index 2295a8ff2d7..dcf660b8f44 100644
--- a/src/test/run-fail/unwind-box-res.rs
+++ b/src/test/run-fail/unwind-box-res.rs
@@ -6,12 +6,17 @@ fn failfn() {
 
 struct r {
   let v: *int;
-  new(v: *int) { self.v = v; }
   drop unsafe {
     let _v2: ~int = unsafe::reinterpret_cast(&self.v);
   }
 }
 
+fn r(v: *int) -> r {
+    r {
+        v: v
+    }
+}
+
 fn main() unsafe {
     let i1 = ~0;
     let i1p = unsafe::reinterpret_cast(&i1);
diff --git a/src/test/run-pass/binops.rs b/src/test/run-pass/binops.rs
index 3d647175ef6..1cad6feef88 100644
--- a/src/test/run-pass/binops.rs
+++ b/src/test/run-pass/binops.rs
@@ -80,7 +80,13 @@ extern mod test {
 struct p {
   let mut x: int;
   let mut y: int;
-  new(x: int, y: int) { self.x = x; self.y = y; }
+}
+
+fn p(x: int, y: int) -> p {
+    p {
+        x: x,
+        y: y
+    }
 }
 
 impl p : cmp::Eq {
diff --git a/src/test/run-pass/boxed-class-type-substitution.rs b/src/test/run-pass/boxed-class-type-substitution.rs
index 5713b5b1a31..6d49bd26b4c 100644
--- a/src/test/run-pass/boxed-class-type-substitution.rs
+++ b/src/test/run-pass/boxed-class-type-substitution.rs
@@ -9,9 +9,11 @@ fn empty<T>() -> Tree<T> { fail }
 
 struct Box {
     let tree: Tree<@Box>;
+}
 
-    new() {
-        self.tree = empty();
+fn Box() -> Box {
+    Box {
+        tree: empty()
     }
 }
 
diff --git a/src/test/run-pass/class-attributes-1.rs b/src/test/run-pass/class-attributes-1.rs
index e56c728d027..0c89ecaf916 100644
--- a/src/test/run-pass/class-attributes-1.rs
+++ b/src/test/run-pass/class-attributes-1.rs
@@ -1,11 +1,12 @@
 // pp-exact - Make sure we actually print the attributes
 
 struct cat {
-    #[cat_maker]
-    new(name: ~str) { self.name = name; }
     #[cat_dropper]
     drop { error!("%s landed on hir feet",self.name); }
     name: ~str,
 }
 
+#[cat_maker]
+fn cat(name: ~str) -> cat { cat{name: name,} }
+
 fn main() { let _kitty = cat(~"Spotty"); }
diff --git a/src/test/run-pass/class-attributes-2.rs b/src/test/run-pass/class-attributes-2.rs
index 772aea9867b..c5758ad1ecc 100644
--- a/src/test/run-pass/class-attributes-2.rs
+++ b/src/test/run-pass/class-attributes-2.rs
@@ -1,10 +1,5 @@
 struct cat {
   let name: ~str;
-  #[cat_maker]
-  /**
-     Maybe it should technically be a kitten_maker.
-  */
-  new(name: ~str) { self.name = name; }
   #[cat_dropper]
   /**
      Actually, cats don't always land on their feet when you drop them.
@@ -12,6 +7,16 @@ struct cat {
   drop { error!("%s landed on hir feet", self.name); }
 }
 
+#[cat_maker]
+/**
+Maybe it should technically be a kitten_maker.
+*/
+fn cat(name: ~str) -> cat {
+    cat {
+        name: name
+    }
+}
+
 fn main() {
   let _kitty = cat(~"Spotty");
 }
diff --git a/src/test/run-pass/class-cast-to-trait-multiple-types.rs b/src/test/run-pass/class-cast-to-trait-multiple-types.rs
index 28d96f64be9..391452f5827 100644
--- a/src/test/run-pass/class-cast-to-trait-multiple-types.rs
+++ b/src/test/run-pass/class-cast-to-trait-multiple-types.rs
@@ -21,11 +21,16 @@ struct dog : noisy {
 
   let volume : @mut int;
 
-  new() { self.volume = @mut 0; self.barks = @mut 0u; }
-
   fn speak() -> int { self.bark() }
 }
 
+fn dog() -> dog {
+    dog {
+        volume: @mut 0,
+        barks: @mut 0u
+    }
+}
+
 struct cat : noisy {
   priv {
     let meows : @mut uint;
@@ -42,14 +47,19 @@ struct cat : noisy {
   let how_hungry : @mut int;
   let name : ~str;
 
-  new(in_x : uint, in_y : int, in_name: ~str)
-    { self.meows = @mut in_x; self.how_hungry = @mut in_y;
-      self.name = in_name; }
-
   fn speak() -> int { self.meow() as int }
   fn meow_count() -> uint { *self.meows }
 }
 
+fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
+    cat {
+        meows: @mut in_x,
+        how_hungry: @mut in_y,
+        name: in_name
+    }
+}
+
+
 fn annoy_neighbors<T: noisy>(critter: T) {
   for uint::range(0u, 10u) |i| { critter.speak(); }
 }
diff --git a/src/test/run-pass/class-cast-to-trait.rs b/src/test/run-pass/class-cast-to-trait.rs
index 3126824c184..c88f3eb3782 100644
--- a/src/test/run-pass/class-cast-to-trait.rs
+++ b/src/test/run-pass/class-cast-to-trait.rs
@@ -17,9 +17,6 @@ struct cat : noisy {
   let mut how_hungry : int;
   let name : ~str;
 
-  new(in_x : uint, in_y : int, in_name: ~str)
-    { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; }
-
   fn speak() { self.meow(); }
 
   fn eat() -> bool {
@@ -35,6 +32,15 @@ struct cat : noisy {
   }
 }
 
+fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y,
+        name: in_name
+    }
+}
+
+
 fn main() {
   let nyan : noisy  = cat(0u, 2, ~"nyan") as noisy;
   nyan.speak();
diff --git a/src/test/run-pass/class-dtor.rs b/src/test/run-pass/class-dtor.rs
index 9c22f23acea..5637e31825a 100644
--- a/src/test/run-pass/class-dtor.rs
+++ b/src/test/run-pass/class-dtor.rs
@@ -1,11 +1,14 @@
 struct cat {
   let done : extern fn(uint);
   let meows : uint;
-  new(done: extern fn(uint)) {
-    self.meows = 0u;
-    self.done = done;
-  }
   drop { self.done(self.meows); }
 }
 
+fn cat(done: extern fn(uint)) -> cat {
+    cat {
+        meows: 0u,
+        done: done
+    }
+}
+
 fn main() {}
diff --git a/src/test/run-pass/class-exports.rs b/src/test/run-pass/class-exports.rs
index e5c5b4ecf21..cf7a97e3873 100644
--- a/src/test/run-pass/class-exports.rs
+++ b/src/test/run-pass/class-exports.rs
@@ -10,8 +10,15 @@ mod kitty {
     let name: ~str;
 
     fn get_name() -> ~str {  self.name }
-    new(in_name: ~str) { self.name = in_name; self.meows = 0u; }
   }
+
+    fn cat(in_name: ~str) -> cat {
+        cat {
+            name: in_name,
+            meows: 0u
+        }
+    }
+
 }
 
 fn main() {
diff --git a/src/test/run-pass/class-impl-very-parameterized-trait.rs b/src/test/run-pass/class-impl-very-parameterized-trait.rs
index 9241f92250d..dee9e9c79de 100644
--- a/src/test/run-pass/class-impl-very-parameterized-trait.rs
+++ b/src/test/run-pass/class-impl-very-parameterized-trait.rs
@@ -29,9 +29,6 @@ struct cat<T: copy> : map<int, T> {
   let mut how_hungry : int;
   let name : T;
 
-  new(in_x : int, in_y : int, in_name: T)
-    { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; }
-
   fn speak() { self.meow(); }
 
   fn eat() -> bool {
@@ -96,6 +93,13 @@ struct cat<T: copy> : map<int, T> {
   fn clear() { }
 }
 
+fn cat<T: copy>(in_x : int, in_y : int, in_name: T) -> cat<T> {
+    cat {
+        meows: in_x,
+        how_hungry: in_y,
+        name: in_name
+    }
+}
 
 fn main() {
   let nyan : cat<~str> = cat(0, 2, ~"nyan");
diff --git a/src/test/run-pass/class-implement-trait-cross-crate.rs b/src/test/run-pass/class-implement-trait-cross-crate.rs
index 1ba1646dcf0..d7e288f7aa4 100644
--- a/src/test/run-pass/class-implement-trait-cross-crate.rs
+++ b/src/test/run-pass/class-implement-trait-cross-crate.rs
@@ -18,9 +18,6 @@ struct cat : noisy {
   let mut how_hungry : int;
   let name : ~str;
 
-  new(in_x : uint, in_y : int, in_name: ~str)
-    { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; }
-
   fn speak() { self.meow(); }
 
   fn eat() -> bool {
@@ -36,6 +33,15 @@ struct cat : noisy {
   }
 }
 
+fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y,
+        name: in_name
+    }
+}
+
+
 fn main() {
   let nyan = cat(0u, 2, ~"nyan");
   nyan.eat();
diff --git a/src/test/run-pass/class-implement-traits.rs b/src/test/run-pass/class-implement-traits.rs
index 4eead77e805..7641f00d919 100644
--- a/src/test/run-pass/class-implement-traits.rs
+++ b/src/test/run-pass/class-implement-traits.rs
@@ -17,9 +17,6 @@ struct cat : noisy {
   let mut how_hungry : int;
   let name : ~str;
 
-  new(in_x : uint, in_y : int, in_name: ~str)
-    { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; }
-
   fn speak() { self.meow(); }
 
   fn eat() -> bool {
@@ -35,6 +32,15 @@ struct cat : noisy {
   }
 }
 
+fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y,
+        name: in_name
+    }
+}
+
+
 fn make_speak<C: noisy>(c: C) {
     c.speak();
 }
diff --git a/src/test/run-pass/class-methods.rs b/src/test/run-pass/class-methods.rs
index 825f9caf395..dbdb9e6a688 100644
--- a/src/test/run-pass/class-methods.rs
+++ b/src/test/run-pass/class-methods.rs
@@ -5,12 +5,17 @@ struct cat {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
-
   fn speak() { self.meows += 1u; }
   fn meow_count() -> uint { self.meows }
 }
 
+fn cat(in_x : uint, in_y : int) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y
+    }
+}
+
 fn main() {
   let nyan : cat = cat(52u, 99);
   let kitty = cat(1000u, 2);
diff --git a/src/test/run-pass/class-poly-methods.rs b/src/test/run-pass/class-poly-methods.rs
index 8eb9c19a963..f73cd61937b 100644
--- a/src/test/run-pass/class-poly-methods.rs
+++ b/src/test/run-pass/class-poly-methods.rs
@@ -6,16 +6,20 @@ struct cat<U> {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int, -in_info: ~[U])
-    { self.meows = in_x; self.how_hungry = in_y;
-      self.info <- in_info; }
-
   fn speak<T>(stuff: ~[T]) {
     self.meows += stuff.len();
   }
   fn meow_count() -> uint { self.meows }
 }
 
+fn cat<U>(in_x : uint, in_y : int, -in_info: ~[U]) -> cat<U> {
+    cat {
+        meows: in_x,
+        how_hungry: in_y,
+        info: move in_info
+    }
+}
+
 fn main() {
   let nyan : cat<int> = cat::<int>(52u, 99, ~[9]);
   let kitty = cat(1000u, 2, ~[~"tabby"]);
diff --git a/src/test/run-pass/class-separate-impl.rs b/src/test/run-pass/class-separate-impl.rs
index 957855736ea..6b8200a5f79 100644
--- a/src/test/run-pass/class-separate-impl.rs
+++ b/src/test/run-pass/class-separate-impl.rs
@@ -17,9 +17,6 @@ struct cat {
   let mut how_hungry : int;
   let name : ~str;
 
-  new(in_x : uint, in_y : int, in_name: ~str)
-    { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; }
-
   fn speak() { self.meow(); }
 
   fn eat() -> bool {
@@ -35,6 +32,14 @@ struct cat {
   }
 }
 
+fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y,
+        name: in_name
+    }
+}
+
 impl cat: ToStr {
   fn to_str() -> ~str { self.name }
 }
diff --git a/src/test/run-pass/class-str-field.rs b/src/test/run-pass/class-str-field.rs
index 97ffdea1e59..a0a93bf9c46 100644
--- a/src/test/run-pass/class-str-field.rs
+++ b/src/test/run-pass/class-str-field.rs
@@ -2,8 +2,12 @@ struct cat {
 
   let name : ~str;
 
-  new(in_name: ~str)
-    { self.name = in_name; }
+}
+
+fn cat(in_name: ~str) -> cat {
+    cat {
+        name: in_name
+    }
 }
 
 fn main() {
diff --git a/src/test/run-pass/class-typarams.rs b/src/test/run-pass/class-typarams.rs
index 834988eaf97..504a3985e88 100644
--- a/src/test/run-pass/class-typarams.rs
+++ b/src/test/run-pass/class-typarams.rs
@@ -5,14 +5,20 @@ struct cat<U> {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
-
   fn speak() {
     self.meows += 1u;
   }
   fn meow_count() -> uint { self.meows }
 }
 
+fn cat<U>(in_x : uint, in_y : int) -> cat<U> {
+    cat {
+        meows: in_x,
+        how_hungry: in_y
+    }
+}
+
+
 fn main() {
   let _nyan : cat<int> = cat::<int>(52u, 99);
   //  let kitty = cat(1000u, 2);
diff --git a/src/test/run-pass/classes-self-referential.rs b/src/test/run-pass/classes-self-referential.rs
index 7a8a371cb71..4d47c21281e 100644
--- a/src/test/run-pass/classes-self-referential.rs
+++ b/src/test/run-pass/classes-self-referential.rs
@@ -1,7 +1,10 @@
 struct kitten {
     let cat: Option<cat>;
-    new(cat: Option<cat>) {
-       self.cat = cat;
+}
+
+fn kitten(cat: Option<cat>) -> kitten {
+    kitten {
+        cat: cat
     }
 }
 
diff --git a/src/test/run-pass/classes-simple-method.rs b/src/test/run-pass/classes-simple-method.rs
index 388ea5f8776..e2a39d41d57 100644
--- a/src/test/run-pass/classes-simple-method.rs
+++ b/src/test/run-pass/classes-simple-method.rs
@@ -5,11 +5,16 @@ struct cat {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
-
   fn speak() {}
 }
 
+fn cat(in_x : uint, in_y : int) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y
+    }
+}
+
 fn main() {
   let nyan : cat = cat(52u, 99);
   let kitty = cat(1000u, 2);
diff --git a/src/test/run-pass/classes-simple.rs b/src/test/run-pass/classes-simple.rs
index ef93e0e3bc6..61ca9ba0933 100644
--- a/src/test/run-pass/classes-simple.rs
+++ b/src/test/run-pass/classes-simple.rs
@@ -5,7 +5,13 @@ struct cat {
 
   let how_hungry : int;
 
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
+}
+
+fn cat(in_x : uint, in_y : int) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y
+    }
 }
 
 fn main() {
diff --git a/src/test/run-pass/classes.rs b/src/test/run-pass/classes.rs
index 3f0d9ad311c..fdbe4a66c99 100644
--- a/src/test/run-pass/classes.rs
+++ b/src/test/run-pass/classes.rs
@@ -13,9 +13,6 @@ struct cat {
   let mut how_hungry : int;
   let name : ~str;
 
-  new(in_x : uint, in_y : int, in_name: ~str)
-    { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; }
-
   fn speak() { self.meow(); }
 
   fn eat() -> bool {
@@ -31,6 +28,14 @@ struct cat {
   }
 }
 
+fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y,
+        name: in_name
+    }
+}
+
 fn main() {
   let nyan = cat(0u, 2, ~"nyan");
   nyan.eat();
diff --git a/src/test/run-pass/conditional-compile.rs b/src/test/run-pass/conditional-compile.rs
index 79d0d33bd7c..3d85874b063 100644
--- a/src/test/run-pass/conditional-compile.rs
+++ b/src/test/run-pass/conditional-compile.rs
@@ -27,12 +27,23 @@ enum tg { bar, }
 #[cfg(bogus)]
 struct r {
   let i: int;
-  new(i:int) { self.i = i; }
+}
+
+#[cfg(bogus)]
+fn r(i:int) -> r {
+    r {
+        i: i
+    }
 }
 
 struct r {
   let i: int;
-  new(i:int) { self.i = i; }
+}
+
+fn r(i:int) -> r {
+    r {
+        i: i
+    }
 }
 
 #[cfg(bogus)]
diff --git a/src/test/run-pass/explicit-self.rs b/src/test/run-pass/explicit-self.rs
index cd9f486c9aa..8872abe1b21 100644
--- a/src/test/run-pass/explicit-self.rs
+++ b/src/test/run-pass/explicit-self.rs
@@ -34,9 +34,13 @@ fn select_based_on_unit_circle<T>(
 
 struct thing {
     x: {mut a: @int};
-    new (x: {mut a: @int}) { self.x = copy x; }
 }
 
+fn thing(x: {mut a: @int}) -> thing {
+    thing {
+        x: copy x
+    }
+}
 
 impl thing {
     fn foo(@self) -> int { *self.x.a }
diff --git a/src/test/run-pass/init-res-into-things.rs b/src/test/run-pass/init-res-into-things.rs
index 2609080ebc9..d124748c56c 100644
--- a/src/test/run-pass/init-res-into-things.rs
+++ b/src/test/run-pass/init-res-into-things.rs
@@ -3,12 +3,15 @@
 
 struct r {
   let i: @mut int;
-  new(i: @mut int) {
-    self.i = i;
-  }
   drop { *(self.i) = *(self.i) + 1; }
 }
 
+fn r(i: @mut int) -> r {
+    r {
+        i: i
+    }
+}
+
 fn test_box() {
     let i = @mut 0;
     {
diff --git a/src/test/run-pass/issue-2288.rs b/src/test/run-pass/issue-2288.rs
index 52d71e6adcb..dcd460cdea9 100644
--- a/src/test/run-pass/issue-2288.rs
+++ b/src/test/run-pass/issue-2288.rs
@@ -3,11 +3,16 @@ trait clam<A: copy> {
 }
 struct foo<A: copy> : clam<A> {
   let x: A;
-  new(b: A) { self.x = b; }
   fn chowder(y: A) {
   }
 }
 
+fn foo<A: copy>(b: A) -> foo<A> {
+    foo {
+        x: b
+    }
+}
+
 fn f<A: copy>(x: clam<A>, a: A) {
   x.chowder(a);
 }
diff --git a/src/test/run-pass/issue-2311-2.rs b/src/test/run-pass/issue-2311-2.rs
index 4c8e99ab46f..fbc7a877c81 100644
--- a/src/test/run-pass/issue-2311-2.rs
+++ b/src/test/run-pass/issue-2311-2.rs
@@ -1,10 +1,15 @@
 trait clam<A: copy> { }
 struct foo<A: copy> {
   let x: A;
-  new(b: A) { self.x = b; }
    fn bar<B,C:clam<A>>(c: C) -> B {
      fail;
    }
 }
 
+fn foo<A: copy>(b: A) -> foo<A> {
+    foo {
+        x: b
+    }
+}
+
 fn main() { }
diff --git a/src/test/run-pass/issue-2445-b.rs b/src/test/run-pass/issue-2445-b.rs
index b2f14925481..7ddbf1e1534 100644
--- a/src/test/run-pass/issue-2445-b.rs
+++ b/src/test/run-pass/issue-2445-b.rs
@@ -1,11 +1,15 @@
 struct c1<T: copy> {
   let x: T;
-  new(x: T) {self.x = x;}
-
     fn f1(x: int) {
     }
 }
 
+fn c1<T: copy>(x: T) -> c1<T> {
+    c1 {
+        x: x
+    }
+}
+
 impl<T: copy> c1<T> {
     fn f2(x: int) {
     }
diff --git a/src/test/run-pass/issue-2445.rs b/src/test/run-pass/issue-2445.rs
index d0da8310938..e9d08b579da 100644
--- a/src/test/run-pass/issue-2445.rs
+++ b/src/test/run-pass/issue-2445.rs
@@ -2,11 +2,15 @@ use dvec::DVec;
 
 struct c1<T: copy> {
   let x: T;
-  new(x: T) {self.x = x;}
-
     fn f1(x: T) {}
 }
 
+fn c1<T: copy>(x: T) -> c1<T> {
+    c1 {
+        x: x
+    }
+}
+
 impl<T: copy> c1<T> {
     fn f2(x: T) {}
 }
diff --git a/src/test/run-pass/issue-2487-a.rs b/src/test/run-pass/issue-2487-a.rs
index 0cff6b57c2a..837d6f4764c 100644
--- a/src/test/run-pass/issue-2487-a.rs
+++ b/src/test/run-pass/issue-2487-a.rs
@@ -1,8 +1,6 @@
 struct socket {
     let sock: int;
 
-    new() { self.sock = 1; }
-
     drop { }
 
     fn set_identity()  {
@@ -12,6 +10,12 @@ struct socket {
     }
 }
 
+fn socket() -> socket {
+    socket {
+        sock: 1
+    }
+}
+
 fn closure(f: fn()) { f() }
 
 fn setsockopt_bytes(_sock: int) { }
diff --git a/src/test/run-pass/issue-2502.rs b/src/test/run-pass/issue-2502.rs
index b554fef4564..fb0e5d1939e 100644
--- a/src/test/run-pass/issue-2502.rs
+++ b/src/test/run-pass/issue-2502.rs
@@ -1,13 +1,15 @@
 struct font {
     let fontbuf: &self/~[u8];
 
-    new(fontbuf: &self/~[u8]) {
-        self.fontbuf = fontbuf;
-    }
-
     fn buf() -> &self/~[u8] {
         self.fontbuf
     }
 }
 
+fn font(fontbuf: &r/~[u8]) -> font/&r {
+    font {
+        fontbuf: fontbuf
+    }
+}
+
 fn main() { }
diff --git a/src/test/run-pass/issue-2550.rs b/src/test/run-pass/issue-2550.rs
index 70af9ca03dc..93e4d13f188 100644
--- a/src/test/run-pass/issue-2550.rs
+++ b/src/test/run-pass/issue-2550.rs
@@ -1,8 +1,11 @@
 struct C {
     let x: uint;
 
-    new(x: uint) {
-        self.x = x;
+}
+
+fn C(x: uint) -> C {
+    C {
+        x: x
     }
 }
 
diff --git a/src/test/run-pass/issue-2633.rs b/src/test/run-pass/issue-2633.rs
index 96ac83aeee6..b0cf990ce71 100644
--- a/src/test/run-pass/issue-2633.rs
+++ b/src/test/run-pass/issue-2633.rs
@@ -1,6 +1,11 @@
 struct cat {
     let mut meow: fn@();
-    new() { self.meow = fn@() { error!("meow"); };}
+}
+
+fn cat() -> cat {
+    cat {
+        meow: fn@() { error!("meow"); }
+    }
 }
 
 type kitty_info = {kitty: cat};
diff --git a/src/test/run-pass/issue-2708.rs b/src/test/run-pass/issue-2708.rs
index 18d9338739c..79e0c3813de 100644
--- a/src/test/run-pass/issue-2708.rs
+++ b/src/test/run-pass/issue-2708.rs
@@ -3,15 +3,17 @@ struct Font {
     let cairo_font: uint;
     let font_dtor: uint;
 
-    new() {
-        self.fontbuf = 0;
-        self.cairo_font = 0;
-        self.font_dtor = 0;
-    }
-
     drop { }
 }
 
+fn Font() -> Font {
+    Font {
+        fontbuf: 0,
+        cairo_font: 0,
+        font_dtor: 0
+    }
+}
+
 fn main() {
     let _f = @Font();
 }
diff --git a/src/test/run-pass/issue-2718.rs b/src/test/run-pass/issue-2718.rs
index 20dd0c650f1..7af8d3672c2 100644
--- a/src/test/run-pass/issue-2718.rs
+++ b/src/test/run-pass/issue-2718.rs
@@ -137,7 +137,6 @@ mod pipes {
 
     struct send_packet<T: send> {
         let mut p: Option<*packet<T>>;
-        new(p: *packet<T>) { self.p = Some(p); }
         drop {
             if self.p != None {
                 let mut p = None;
@@ -152,9 +151,14 @@ mod pipes {
         }
     }
 
+    fn send_packet<T: send>(p: *packet<T>) -> send_packet<T> {
+        send_packet {
+            p: Some(p)
+        }
+    }
+
     struct recv_packet<T: send> {
         let mut p: Option<*packet<T>>;
-        new(p: *packet<T>) { self.p = Some(p); }
         drop {
             if self.p != None {
                 let mut p = None;
@@ -169,6 +173,12 @@ mod pipes {
         }
     }
 
+    fn recv_packet<T: send>(p: *packet<T>) -> recv_packet<T> {
+        recv_packet {
+            p: Some(p)
+        }
+    }
+
     fn entangle<T: send>() -> (send_packet<T>, recv_packet<T>) {
         let p = packet();
         (send_packet(p), recv_packet(p))
diff --git a/src/test/run-pass/issue-2735-2.rs b/src/test/run-pass/issue-2735-2.rs
index eaec723de29..6c99cb0ad2a 100644
--- a/src/test/run-pass/issue-2735-2.rs
+++ b/src/test/run-pass/issue-2735-2.rs
@@ -1,12 +1,15 @@
 // This test should behave exactly like issue-2735-3
 struct defer {
     let b: &mut bool;
-    new(b: &mut bool) {
-        self.b = b;
-    }   
     drop { *(self.b) = true; }
 }
 
+fn defer(b: &r/mut bool) -> defer/&r {
+    defer {
+        b: b
+    }
+}
+
 fn main() {
     let mut dtor_ran = false;
     let _  = defer(&mut dtor_ran);
diff --git a/src/test/run-pass/issue-2735-3.rs b/src/test/run-pass/issue-2735-3.rs
index b41b65cf6df..4d06365e26f 100644
--- a/src/test/run-pass/issue-2735-3.rs
+++ b/src/test/run-pass/issue-2735-3.rs
@@ -1,12 +1,15 @@
 // This test should behave exactly like issue-2735-2
 struct defer {
     let b: &mut bool;
-    new(b: &mut bool) {
-        self.b = b;
-    }   
     drop { *(self.b) = true; }
 }
 
+fn defer(b: &r/mut bool) -> defer/&r {
+    defer {
+        b: b
+    }
+}
+
 fn main() {
     let mut dtor_ran = false;
     defer(&mut dtor_ran);
diff --git a/src/test/run-pass/issue-2748-a.rs b/src/test/run-pass/issue-2748-a.rs
index fb7e10a2b17..1a552946676 100644
--- a/src/test/run-pass/issue-2748-a.rs
+++ b/src/test/run-pass/issue-2748-a.rs
@@ -1,8 +1,11 @@
 struct CMap {
     let buf: &[u8];
 
-    new(buf: &self/[u8]) {
-        self.buf = buf;
+}
+
+fn CMap(buf: &r/[u8]) -> CMap/&r {
+    CMap {
+        buf: buf
     }
 }
 
diff --git a/src/test/run-pass/issue-2936.rs b/src/test/run-pass/issue-2936.rs
index 130e59125a1..ddcc0360d8b 100644
--- a/src/test/run-pass/issue-2936.rs
+++ b/src/test/run-pass/issue-2936.rs
@@ -8,12 +8,17 @@ fn foo<T, U: bar<T>>(b: U) -> T {
 
 struct cbar : bar<int> {
     x: int;
-    new(x: int) { self.x = x; }
     fn get_bar() -> int {
         self.x
     }
 }
 
+fn cbar(x: int) -> cbar {
+    cbar {
+        x: x
+    }
+}
+
 fn main() {
     let x: int = foo::<int, cbar>(cbar(5));
     assert x == 5;
diff --git a/src/test/run-pass/issue-3220.rs b/src/test/run-pass/issue-3220.rs
index da0d3dc91d2..358f0a82a6e 100644
--- a/src/test/run-pass/issue-3220.rs
+++ b/src/test/run-pass/issue-3220.rs
@@ -1,4 +1,9 @@
-struct thing { x: int; new () { self.x = 0; } drop { } }
+struct thing { x: int; drop { } }
+fn thing() -> thing {
+    thing {
+        x: 0
+    }
+}
 impl thing { fn f(self) {} }
 
 fn main() {
diff --git a/src/test/run-pass/issue-979.rs b/src/test/run-pass/issue-979.rs
index 0b66943b8ea..dd12d391abd 100644
--- a/src/test/run-pass/issue-979.rs
+++ b/src/test/run-pass/issue-979.rs
@@ -1,11 +1,14 @@
 struct r {
   let b: @mut int;
-  new(b: @mut int) {
-    self.b = b;
-  }
   drop { *(self.b) += 1; }
 }
 
+fn r(b: @mut int) -> r {
+    r {
+        b: b
+    }
+}
+
 fn main() {
     let b = @mut 0;
     {
diff --git a/src/test/run-pass/nested-class.rs b/src/test/run-pass/nested-class.rs
index cfc3064b552..e2b68db5a48 100644
--- a/src/test/run-pass/nested-class.rs
+++ b/src/test/run-pass/nested-class.rs
@@ -3,9 +3,14 @@ fn main() {
   struct b {
     let i: int;
     fn do_stuff() -> int { return 37; }
-    new(i:int) { self.i = i; }
   }
 
+    fn b(i:int) -> b {
+        b {
+            i: i
+        }
+    }
+
   //  fn b(x:int) -> int { fail; }
 
   let z = b(42);
diff --git a/src/test/run-pass/private-class-field.rs b/src/test/run-pass/private-class-field.rs
index a988ad46737..bbe6d59c280 100644
--- a/src/test/run-pass/private-class-field.rs
+++ b/src/test/run-pass/private-class-field.rs
@@ -6,7 +6,13 @@ struct cat {
   let how_hungry : int;
 
   fn meow_count() -> uint { self.meows }
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
+}
+
+fn cat(in_x : uint, in_y : int) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y
+    }
 }
 
 fn main() {
diff --git a/src/test/run-pass/private-method.rs b/src/test/run-pass/private-method.rs
index 569359a9db1..ab75956bbd8 100644
--- a/src/test/run-pass/private-method.rs
+++ b/src/test/run-pass/private-method.rs
@@ -10,7 +10,13 @@ struct cat {
     self.meows += 1u;
     self.nap();
   }
-  new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; }
+}
+
+fn cat(in_x : uint, in_y : int) -> cat {
+    cat {
+        meows: in_x,
+        how_hungry: in_y
+    }
 }
 
 fn main() {
diff --git a/src/test/run-pass/resource-assign-is-not-copy.rs b/src/test/run-pass/resource-assign-is-not-copy.rs
index 08fc743af80..1a18c788e0d 100644
--- a/src/test/run-pass/resource-assign-is-not-copy.rs
+++ b/src/test/run-pass/resource-assign-is-not-copy.rs
@@ -1,11 +1,14 @@
 struct r {
   let i: @mut int;
-  new(i: @mut int) {
-    self.i = i;
-  }
   drop { *(self.i) += 1; }
 }
 
+fn r(i: @mut int) -> r {
+    r {
+        i: i
+    }
+}
+
 fn main() {
     let i = @mut 0;
     // Even though these look like copies, they are guaranteed not to be
diff --git a/src/test/run-pass/resource-cycle.rs b/src/test/run-pass/resource-cycle.rs
index e0d85e4d288..14c7d269752 100644
--- a/src/test/run-pass/resource-cycle.rs
+++ b/src/test/run-pass/resource-cycle.rs
@@ -2,13 +2,6 @@
 
 struct r {
   let v: *int;
-  new(v: *int) unsafe {
-    self.v = v;
-    debug!("r's ctor: v = %x, self = %x, self.v = %x",
-           unsafe::reinterpret_cast::<*int, uint>(&v),
-           unsafe::reinterpret_cast::<*r, uint>(&ptr::addr_of(self)),
-           unsafe::reinterpret_cast::<**int, uint>(&ptr::addr_of(self.v)));
-     }
   drop unsafe {
     debug!("r's dtor: self = %x, self.v = %x, self.v's value = %x",
            unsafe::reinterpret_cast::<*r, uint>(&ptr::addr_of(self)),
@@ -17,6 +10,12 @@ struct r {
     let v2: ~int = unsafe::reinterpret_cast(&self.v); }
 }
 
+fn r(v: *int) -> r unsafe {
+    r {
+        v: v
+    }
+}
+
 enum t = {
     mut next: Option<@t>,
     r: r
diff --git a/src/test/run-pass/resource-cycle2.rs b/src/test/run-pass/resource-cycle2.rs
index c5b69af33d9..25fa567292e 100644
--- a/src/test/run-pass/resource-cycle2.rs
+++ b/src/test/run-pass/resource-cycle2.rs
@@ -8,12 +8,17 @@ type u = {
 
 struct r {
   let v: u;
-  new(v: u) { self.v = v; }
   drop unsafe {
     let v2: ~int = unsafe::reinterpret_cast(&self.v.c);
   }
 }
 
+fn r(v: u) -> r {
+    r {
+        v: v
+    }
+}
+
 enum t = {
     mut next: Option<@t>,
     r: r
diff --git a/src/test/run-pass/resource-cycle3.rs b/src/test/run-pass/resource-cycle3.rs
index 36d73bf23e5..ca5ce6f1b7f 100644
--- a/src/test/run-pass/resource-cycle3.rs
+++ b/src/test/run-pass/resource-cycle3.rs
@@ -12,15 +12,20 @@ struct r {
   let v: u;
   let w: int;
   let x: *int;
-  new(v: u, w: int, _x: *int) unsafe { self.v = v; self.w = w; 
-    self.x = unsafe::reinterpret_cast(&0);
-    /* self.x = x; */ }
   drop unsafe {
     let _v2: ~int = unsafe::reinterpret_cast(&self.v.c);
     // let _v3: ~int = unsafe::reinterpret_cast(self.x);
   }
 }
 
+fn r(v: u, w: int, _x: *int) -> r unsafe {
+    r {
+        v: v,
+        w: w,
+        x: unsafe::reinterpret_cast(&0)
+    }
+}
+
 enum t = {
     mut next: Option<@t>,
     r: r
diff --git a/src/test/run-pass/resource-destruct.rs b/src/test/run-pass/resource-destruct.rs
index b935d7f1316..5bd8921ca53 100644
--- a/src/test/run-pass/resource-destruct.rs
+++ b/src/test/run-pass/resource-destruct.rs
@@ -1,10 +1,15 @@
 struct shrinky_pointer {
   let i: @@mut int;
   fn look_at() -> int { return **(self.i); }
-  new(i: @@mut int) { self.i = i; }
   drop { log(error, ~"Hello!"); **(self.i) -= 1; }
 }
 
+fn shrinky_pointer(i: @@mut int) -> shrinky_pointer {
+    shrinky_pointer {
+        i: i
+    }
+}
+
 fn main() {
     let my_total = @@mut 10;
     { let pt <- shrinky_pointer(my_total); assert (pt.look_at() == 10); }
diff --git a/src/test/run-pass/resource-generic.rs b/src/test/run-pass/resource-generic.rs
index 618848e1edd..79b4242df42 100644
--- a/src/test/run-pass/resource-generic.rs
+++ b/src/test/run-pass/resource-generic.rs
@@ -1,11 +1,14 @@
 struct finish<T: copy> {
   let arg: {val: T, fin: extern fn(T)};
-  new(arg: {val: T, fin: extern fn(T)}) {
-    self.arg = arg;
-  }
   drop { self.arg.fin(self.arg.val); }
 }
 
+fn finish<T: copy>(arg: {val: T, fin: extern fn(T)}) -> finish<T> {
+    finish {
+        arg: arg
+    }
+}
+
 fn main() {
     let box = @mut 10;
     fn dec_box(&&i: @mut int) { *i -= 1; }
diff --git a/src/test/run-pass/resource-in-struct.rs b/src/test/run-pass/resource-in-struct.rs
index 2fbe658fd6c..2660a983941 100644
--- a/src/test/run-pass/resource-in-struct.rs
+++ b/src/test/run-pass/resource-in-struct.rs
@@ -6,10 +6,15 @@ type closable = @mut bool;
 struct close_res {
   let i: closable;
  
-  new(i: closable) { self.i = i; }
   drop { *(self.i) = false; }
 }
 
+fn close_res(i: closable) -> close_res {
+    close_res {
+        i: i
+    }
+}
+
 enum option<T> { none, some(T), }
 
 fn sink(res: option<close_res>) { }
diff --git a/src/test/run-pass/send-resource.rs b/src/test/run-pass/send-resource.rs
index 40da915e6cd..6fda3c54c38 100644
--- a/src/test/run-pass/send-resource.rs
+++ b/src/test/run-pass/send-resource.rs
@@ -3,10 +3,15 @@ use comm::*;
 
 struct test {
   let f: int;
-  new(f: int) { self.f = f; }
   drop {}
 }
 
+fn test(f: int) -> test {
+    test {
+        f: f
+    }
+}
+
 fn main() {
     let p = Port();
     let c = Chan(p);
diff --git a/src/test/run-pass/sendable-class.rs b/src/test/run-pass/sendable-class.rs
index 762d510da20..d7daa616abf 100644
--- a/src/test/run-pass/sendable-class.rs
+++ b/src/test/run-pass/sendable-class.rs
@@ -3,7 +3,13 @@
 struct foo {
   let i: int;
   let j: char;
-  new(i:int, j: char) { self.i = i; self.j = j; }
+}
+
+fn foo(i:int, j: char) -> foo {
+    foo {
+        i: i,
+        j: j
+    }
 }
 
 fn main() {
diff --git a/src/test/run-pass/task-killjoin-rsrc.rs b/src/test/run-pass/task-killjoin-rsrc.rs
index 3067e6f48ac..df05df61afb 100644
--- a/src/test/run-pass/task-killjoin-rsrc.rs
+++ b/src/test/run-pass/task-killjoin-rsrc.rs
@@ -7,7 +7,6 @@ use std;
 
 struct notify {
     let ch: comm::Chan<bool>; let v: @mut bool;
-    new(ch: comm::Chan<bool>, v: @mut bool) { self.ch = ch; self.v = v; }
     drop {
         error!("notify: task=%? v=%x unwinding=%b b=%b",
                task::get_task(),
@@ -19,6 +18,13 @@ struct notify {
     }
 }
 
+fn notify(ch: comm::Chan<bool>, v: @mut bool) -> notify {
+    notify {
+        ch: ch,
+        v: v
+    }
+}
+
 fn joinable(+f: fn~()) -> comm::Port<bool> {
     fn wrapper(+c: comm::Chan<bool>, +f: fn()) {
         let b = @mut false;
diff --git a/src/test/run-pass/type-param-constraints.rs b/src/test/run-pass/type-param-constraints.rs
index e049c0ecf38..634bce5cb12 100644
--- a/src/test/run-pass/type-param-constraints.rs
+++ b/src/test/run-pass/type-param-constraints.rs
@@ -4,10 +4,15 @@ fn u_foo<T: send>(unique: T) { }
 
 struct r {
   let i: int;
-  new(i:int) { self.i = i; }
   drop {}
 }
 
+fn r(i:int) -> r {
+    r {
+        i: i
+    }
+}
+
 fn main() {
     p_foo(r(10));
     p_foo(@r(10));
diff --git a/src/test/run-pass/unique-pinned-nocopy-2.rs b/src/test/run-pass/unique-pinned-nocopy-2.rs
index db550ca608e..101f890391e 100644
--- a/src/test/run-pass/unique-pinned-nocopy-2.rs
+++ b/src/test/run-pass/unique-pinned-nocopy-2.rs
@@ -1,9 +1,14 @@
 struct r {
   let i: @mut int;
-  new(i: @mut int) { self.i = i; }
   drop { *(self.i) = *(self.i) + 1; }
 }
 
+fn r(i: @mut int) -> r {
+    r {
+        i: i
+    }
+}
+
 fn main() {
     let i = @mut 0;
     {
diff --git a/src/test/run-pass/unwind-resource.rs b/src/test/run-pass/unwind-resource.rs
index da7d63e9126..f66dfdcfeee 100644
--- a/src/test/run-pass/unwind-resource.rs
+++ b/src/test/run-pass/unwind-resource.rs
@@ -3,14 +3,18 @@ use std;
 
 struct complainer {
   let c: comm::Chan<bool>;
-  new(c: comm::Chan<bool>) {
-    error!("Hello!");
-    self.c = c; }
   drop { error!("About to send!");
     comm::send(self.c, true);
     error!("Sent!"); }
 }
 
+fn complainer(c: comm::Chan<bool>) -> complainer {
+    error!("Hello!");
+    complainer {
+        c: c
+    }
+}
+
 fn f(c: comm::Chan<bool>) {
     let _c <- complainer(c);
     fail;
diff --git a/src/test/run-pass/unwind-resource2.rs b/src/test/run-pass/unwind-resource2.rs
index c070bbb1ca2..ff1758ceef1 100644
--- a/src/test/run-pass/unwind-resource2.rs
+++ b/src/test/run-pass/unwind-resource2.rs
@@ -3,10 +3,15 @@ use std;
 
 struct complainer {
   let c: @int;
-  new(c: @int) { self.c = c; }
   drop {}
 }
 
+fn complainer(c: @int) -> complainer {
+    complainer {
+        c: c
+    }
+}
+
 fn f() {
     let c <- complainer(@0);
     fail;
diff --git a/src/test/run-pass/vec-slice-drop.rs b/src/test/run-pass/vec-slice-drop.rs
index 771fb946211..1461e8960b4 100644
--- a/src/test/run-pass/vec-slice-drop.rs
+++ b/src/test/run-pass/vec-slice-drop.rs
@@ -1,10 +1,15 @@
 // Make sure that destructors get run on slice literals
 struct foo {
     let x: @mut int;
-    new(x: @mut int) { self.x = x; }
     drop { *self.x += 1; }
 }
 
+fn foo(x: @mut int) -> foo {
+    foo {
+        x: x
+    }
+}
+
 fn main() {
     let x = @mut 0;
     {