]> git.lizzy.rs Git - rust.git/commitdiff
Remove struct ctors
authorBrian Anderson <banderson@mozilla.com>
Wed, 5 Sep 2012 22:58:43 +0000 (15:58 -0700)
committerBrian Anderson <banderson@mozilla.com>
Thu, 6 Sep 2012 17:52:26 +0000 (10:52 -0700)
130 files changed:
src/libsyntax/ext/pipes/proto.rs
src/libsyntax/parse/parser.rs
src/libsyntax/parse/token.rs
src/rustc/driver/rustc.rs
src/rustc/lib/llvm.rs
src/rustc/metadata/decoder.rs
src/rustc/middle/lang_items.rs
src/rustc/middle/resolve.rs
src/rustc/middle/trans/base.rs
src/rustc/middle/trans/common.rs
src/rustc/middle/typeck/check/method.rs
src/rustc/middle/typeck/coherence.rs
src/rustc/util/common.rs
src/rustdoc/demo.rs
src/test/auxiliary/cci_class.rs
src/test/auxiliary/cci_class_2.rs
src/test/auxiliary/cci_class_3.rs
src/test/auxiliary/cci_class_4.rs
src/test/auxiliary/cci_class_5.rs
src/test/auxiliary/cci_class_6.rs
src/test/auxiliary/cci_class_cast.rs
src/test/auxiliary/issue-2526.rs
src/test/auxiliary/issue-3012-1.rs
src/test/auxiliary/issue2170lib.rs
src/test/auxiliary/test_comm.rs
src/test/bench/task-perf-alloc-unwind.rs
src/test/bench/task-perf-word-count-generic.rs
src/test/compile-fail/assign-to-method.rs
src/test/compile-fail/block-must-not-have-result-res.rs
src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs
src/test/compile-fail/borrowck-unary-move-2.rs
src/test/compile-fail/cap-clause-illegal-cap.rs
src/test/compile-fail/class-cast-to-trait.rs
src/test/compile-fail/class-implements-int.rs
src/test/compile-fail/class-method-missing.rs
src/test/compile-fail/class-missing-self.rs
src/test/compile-fail/copy-a-resource.rs
src/test/compile-fail/issue-2063-resource.rs
src/test/compile-fail/issue-2370-2.rs
src/test/compile-fail/issue-2370.rs
src/test/compile-fail/issue-2487-b.rs
src/test/compile-fail/issue-2509-a.rs
src/test/compile-fail/issue-2718-a.rs
src/test/compile-fail/issue-2825-b.rs
src/test/compile-fail/issue-2825.rs [deleted file]
src/test/compile-fail/issue-3021-b.rs
src/test/compile-fail/lint-non-camel-case-class.rs
src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs [deleted file]
src/test/compile-fail/liveness-ctor-field-never-init.rs [deleted file]
src/test/compile-fail/liveness-ctor-uninit-field.rs [deleted file]
src/test/compile-fail/liveness-ctor-uninit-var.rs [deleted file]
src/test/compile-fail/liveness-unused.rs
src/test/compile-fail/mutable-class-fields-2.rs
src/test/compile-fail/mutable-class-fields.rs
src/test/compile-fail/no-send-res-ports.rs
src/test/compile-fail/non-const.rs
src/test/compile-fail/noncopyable-class.rs
src/test/compile-fail/pinned-deep-copy.rs
src/test/compile-fail/private-method.rs
src/test/compile-fail/record-with-resource.rs
src/test/compile-fail/regions-addr-of-self.rs
src/test/compile-fail/regions-addr-of-upvar-self.rs
src/test/compile-fail/regions-bounds.rs
src/test/compile-fail/regions-in-rsrcs.rs
src/test/compile-fail/tps-invariant-class.rs
src/test/compile-fail/unique-pinned-nocopy.rs
src/test/compile-fail/unique-vec-res.rs
src/test/compile-fail/unsendable-class.rs
src/test/run-fail/morestack2.rs
src/test/run-fail/morestack3.rs
src/test/run-fail/morestack4.rs
src/test/run-fail/rt-set-exit-status-fail2.rs
src/test/run-fail/unwind-box-res.rs
src/test/run-pass/binops.rs
src/test/run-pass/boxed-class-type-substitution.rs
src/test/run-pass/class-attributes-1.rs
src/test/run-pass/class-attributes-2.rs
src/test/run-pass/class-cast-to-trait-multiple-types.rs
src/test/run-pass/class-cast-to-trait.rs
src/test/run-pass/class-dtor.rs
src/test/run-pass/class-exports.rs
src/test/run-pass/class-impl-very-parameterized-trait.rs
src/test/run-pass/class-implement-trait-cross-crate.rs
src/test/run-pass/class-implement-traits.rs
src/test/run-pass/class-methods.rs
src/test/run-pass/class-poly-methods.rs
src/test/run-pass/class-separate-impl.rs
src/test/run-pass/class-str-field.rs
src/test/run-pass/class-typarams.rs
src/test/run-pass/classes-self-referential.rs
src/test/run-pass/classes-simple-method.rs
src/test/run-pass/classes-simple.rs
src/test/run-pass/classes.rs
src/test/run-pass/conditional-compile.rs
src/test/run-pass/explicit-self.rs
src/test/run-pass/init-res-into-things.rs
src/test/run-pass/issue-2288.rs
src/test/run-pass/issue-2311-2.rs
src/test/run-pass/issue-2445-b.rs
src/test/run-pass/issue-2445.rs
src/test/run-pass/issue-2487-a.rs
src/test/run-pass/issue-2502.rs
src/test/run-pass/issue-2550.rs
src/test/run-pass/issue-2633.rs
src/test/run-pass/issue-2708.rs
src/test/run-pass/issue-2718.rs
src/test/run-pass/issue-2735-2.rs
src/test/run-pass/issue-2735-3.rs
src/test/run-pass/issue-2748-a.rs
src/test/run-pass/issue-2936.rs
src/test/run-pass/issue-3220.rs
src/test/run-pass/issue-979.rs
src/test/run-pass/nested-class.rs
src/test/run-pass/private-class-field.rs
src/test/run-pass/private-method.rs
src/test/run-pass/resource-assign-is-not-copy.rs
src/test/run-pass/resource-cycle.rs
src/test/run-pass/resource-cycle2.rs
src/test/run-pass/resource-cycle3.rs
src/test/run-pass/resource-destruct.rs
src/test/run-pass/resource-generic.rs
src/test/run-pass/resource-in-struct.rs
src/test/run-pass/send-resource.rs
src/test/run-pass/sendable-class.rs
src/test/run-pass/task-killjoin-rsrc.rs
src/test/run-pass/type-param-constraints.rs
src/test/run-pass/unique-pinned-nocopy-2.rs
src/test/run-pass/unwind-resource.rs
src/test/run-pass/unwind-resource2.rs
src/test/run-pass/vec-slice-drop.rs

index 4e09aa4c9565df73142d3062a6359f0fa217c588..789ee70249f3a3fe3732d1fc1ec1979bcbe2417a 100644 (file)
@@ -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()
index b1205c77fe8d5956974247a0d076a62aec6a97ce..e900b7dd7b3813937bde4118781d43b60ad3cad1 100644 (file)
@@ -181,6 +181,37 @@ macro_rules! maybe_whole (
 
 /* 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 @@ fn parse_item_class() -> item_info {
         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 @@ fn parse_item_class() -> item_info {
             // 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 @@ fn parse_single_class_item(vis: visibility) -> @class_member {
         }
     }
 
-    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 @@ fn parse_class_item(class_name_with_tps: @path) -> class_contents {
 
         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 @@ fn parse_region_param() {
         }
     }
 
-    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 @@ fn parse_struct_def(path: @path) -> @struct_def {
         };
     }
 
-    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 @@ fn parse_enum_def(ident: ast::ident, ty_params: ~[ast::ty_param])
                     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 @@ fn parse_enum_def(ident: ast::ident, ty_params: ~[ast::ty_param])
             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 @@ fn parse_enum_def(ident: ast::ident, ty_params: ~[ast::ty_param])
                 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 @@ fn parse_item_enum() -> item_info {
         }
         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)
     }
 
index a9bcb7625978a1a758998d6efc8bd5aef6f55c34..945f4c6b279a076d1bf9b2f1e17b9408ab03fa4d 100644 (file)
@@ -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",
index c6b8bc2d7b986856385fa4dbee8fdfa8a98f9551..8b8325853ccd4fe35f5067d7b0dd4330bdf021b1 100644 (file)
@@ -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)
     } {
index fe737442bd0563c627c30d9d8a242403f57d76f5..23566e59cf9f401578840b24a0b550eaa714b678 100644 (file)
@@ -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 {
index d9ecc114062b04174a7af89739113e5c2a801d32..4e2c7b8ee72c8feaba80b0bb90692d0cc478cd47 100644 (file)
@@ -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
     }
 }
 
index b57f1eac19b545b0eb199406e671ae0b879bfb37..3d8771166b6430c377dcd354e85ec0b8822334ed 100644 (file)
@@ -72,6 +72,41 @@ fn make() -> 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) {
 
index 05872159f8caadd31c98c8b71b713875dabea785..1168260b519d4451bf6fdbc5b2a65d0acf150187 100644 (file)
@@ -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 @@ fn target_for_namespace(namespace: Namespace) -> Option<Target> {
     }
 }
 
+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 @@ fn span_for_namespace(namespace: Namespace) -> Option<span> {
     }
 }
 
+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 @@ fn intern(intr: ident_interner, string: @~str,
     }
 }
 
+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);
index b74d89dc46594bf3b1ffcf01cd3e3261b77e494d..3eef274e9d667d32f47e0edd0e268956887a1f96 100644 (file)
@@ -56,7 +56,6 @@
 
 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;
 }
index 6fb547d757dd3333a70ecce6ab07997f3e4ed3d3..6b3e4063d67a9491668aa8e9f47bc5c2e25fa04e 100644 (file)
@@ -95,10 +95,15 @@ fn new_addrspace_gen() -> addrspace_gen {
 
 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
     }
 }
 
index cb4bd4296e313eb18494ed459d26880372733947..b356a1b7f67fb60e49885926e1cd8e00cf3dbe2f 100644 (file)
@@ -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, %?)",
index 1377e41cdca8e64923af5821930b450403afede4..a01b0983e706ad6e4fc23e03d917fd5031effb5f 100644 (file)
@@ -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) {
index a4754fd4769679ceee5bf39d0fa6a81c01902e14..ee941c0ed01574288a6d3e3b4768caf0cdc7b870 100644 (file)
@@ -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(())
index 8968d481f6a09dfb4eb34849e6e005f276fe6908..1ed5adfa4a6782796ffa6dea2248710c409e372e 100644 (file)
@@ -113,7 +113,6 @@ mod blade_runner {
  */
 struct bored {
   let bored: bool;
-  new(bored: bool) { self.bored = bored; }
   drop { log(error, self.bored); }
 }
 
index 46312dc989bdeb6b961779b26eca84010d27cf62..3a0d119a091b60f275df7d42c6e6e13a8e7673ef 100644 (file)
@@ -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
+        }
+    }
+
 }
index bd3e17000b1d94dc60e6f81252f51b1ad387f9f8..a6dee67eeb4a5f7d28295cc667b185e7d6d21b47 100644 (file)
@@ -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
+        }
+    }
+
 }
index 6b62cd166dbe01b5c8f351b2bf2389f2aea2dacb..ec32b66680549a50de46e1adccba35a841444d24 100644 (file)
@@ -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
+        }
+    }
+
+
 }
index 95ca81bf97fd6737e9ffb4315186f3c8cba2bc1b..78e9a3a599c837d1e42fa50da33f704cce185445 100644 (file)
@@ -15,9 +15,6 @@ fn meow() {
   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 @@ fn eat() -> bool {
   }
 }
 
+    fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
+        cat {
+            meows: in_x,
+            how_hungry: in_y,
+            name: in_name
+        }
+    }
+
 }
index 5e5c5c53d9c3f11a6e3445cb43c09f70eee2a5f7..b8b68fc9a51f36fa9c7900933a5582ee4b66c206 100644 (file)
@@ -8,7 +8,13 @@ fn nap() { for uint::range(1u, 10000u) |_i|{}}
 
   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
index 18ffb35d3e5e52590ea3b4e7f5096d3bef0c4611..9d8d5543cd3776cb352f1fe1ee4ccb36b50d05af 100644 (file)
@@ -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
+    }
+}
+
+
 }
index 830ca90628aefd5058ae5ea5be949e3d7f18a160..c12a8d2e92614be3016759504bc87e2378b30acd 100644 (file)
@@ -18,9 +18,6 @@ fn meow() {
   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 @@ fn eat() -> bool {
 
   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
+    }
 }
+
+}
+
+
index 1d1adbf179d550559d69263199e34925cdb257c3..ee7d57aa39784c3c9a853d3b6e6d3af855825f7e 100644 (file)
@@ -9,10 +9,15 @@
 
 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 {
index d47f16c7f11002413800a8f9dfd415ac853cfb8e..2193550c6501346ef049f0d7b6ca3f3f115ab329 100644 (file)
@@ -7,7 +7,13 @@ mod socket {
 
 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
+        }
+    }
+
 }
index cca092faf002fae841636ff4df51fa90fb9dc8bc..7393ffd42f96ede83fdab26b01784799da84a423 100644 (file)
@@ -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
index 0fb66520479deadb967894e27e1682054e48a6af..a9b87d466f0698ee3bd64526615694b85ee0d4c3 100644 (file)
@@ -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
index 51267986e6cf7dc8cf702530812317753597b37f..2191ba691ceb2adc37b36cb137654eba524ac3c7 100644 (file)
@@ -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());
index c414c85781d83d2fef7e745280616a506a0530cb..5fe738aa7b1fd037888eac557d7d77b631f4f5a8 100644 (file)
@@ -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 @@ fn unwrap() -> 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 @@ fn read_word() -> Option<~str> {
         else { None }
     }
 }
+
+fn random_word_reader(count: uint) -> random_word_reader {
+    random_word_reader {
+        remaining: count,
+        rng: rand::Rng()
+    }
+}
index 0208b745d49ee5b0aedc27e89bb4a05502ec4385..2fe4e49e0a84ba7fd10d3dddce98f5f8ef1fdcd3 100644 (file)
@@ -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() {
index 958cabb61b84953031d2a1bcb8feff58dc77db9d..3ab4a6a72f278d568f2faa50b62a55d13ce7458f 100644 (file)
@@ -1,7 +1,6 @@
 // error-pattern:mismatched types: expected `()` but found `bool`
 
 struct r {
-  new() {}
   drop { true }
 }
 
index 6dfe23c1995a97ca441afbf7d9aa34ee9de1e9a3..e643cd4ceaaf3d9a75ff8c00b5fd86bb56356bac 100644 (file)
@@ -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
 }
index 82c09f5036b34e7f0968fd143db584e88cacc67d..b0a49db488a8a37d4a7dd513aa4a9b7a05f1d1ec 100644 (file)
@@ -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() {
index 3703c44f520d51e868d27898db22db948674b95a..22f63d2e2ce34ce367b1a6ace43b40d052c491eb 100644 (file)
@@ -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
index 7a6c85474b58504472cf2651b111eb4bac34b3b5..5d7eac5fd9c25e69a5e2a37e656de5a6aabedfeb 100644 (file)
@@ -18,9 +18,6 @@ fn meow() {
   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 @@ fn eat() -> bool {
   }
 }
 
+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();
index 9f86953c3cf92399d0f3599cbfd6c3877407f689..d85a6e578273efe4407c9154bdca1c50d4e3dd05 100644 (file)
@@ -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() {
index 31cc23d8162e114441861a9596ea9ac4f8e5de77..38680d4274d7cd71b097ef7c837f22257a4874a0 100644 (file)
@@ -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() {
index 57c8ec272e10944eebe832e28c4b2ec453b94be8..95795bdd18280367e32294c429425736cfc70232 100644 (file)
@@ -9,7 +9,7 @@ fn meow() {
     }
   }
 
-  new(in_x : uint) { self.meows = in_x; }
 }
 
+
  fn main() { }
\ No newline at end of file
index 2e8673156bf15eb06cef7561f1dfd894653b5207..6192f340121bfdf99467b284f1c61996b1181806 100644 (file)
@@ -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); }
index 98eb509c8d77432329c670ed8b8d0331ee7a9712..191420e5998463b5409286249b2b2d8acf4763ce 100644 (file)
@@ -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() {
index e8abfd3f450e8c5cd192fe65c01e80d3ff19df1d..273483415fc1b406aa6851a207ad00716c1d3546 100644 (file)
@@ -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
index 9074eb7e1b8053bf27ac416dec94bc691028afde..dd8de95fdaab4bf85fe70281b497b664ff270db0 100644 (file)
@@ -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
index ada5b6ffa05d583f74927c81dc158e24a08cc62a..3469e9ea53a9816ab2f1928cad88f3b32f1c4e74 100644 (file)
@@ -1,8 +1,6 @@
 struct socket {
     let sock: int;
 
-    new() { self.sock = 1; }
-
     drop { }
 
     fn set_identity()  {
index fc1f4dc7159feef3c74fd7087a9288cf33c99581..a24e3bdee36100cec0ee9fb73ac6a6386c642d8b 100644 (file)
@@ -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];
 }
index d7ea3f67d417c6b864b9c65386aed5c34782f219..e8323acb56ba537b0e6ea7637da74e46369e40b3 100644 (file)
@@ -1,6 +1,5 @@
 struct send_packet<T: copy> {
   let p: T;
-  new(p: T) { self.p = p; }
 }
 
 
index 7be3d077050ac8ae863447daf768620d9cd0a9e2..a879dae38596d8ad408804409b3da67ce0a4b31a 100644 (file)
@@ -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 (file)
index 82a7627..0000000
+++ /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();
-}
index 005cae43081b3e722a48682b83958e11eabf1e25..d267aa52bfd0be549664ea30a0b0a8c94fc8d1b9 100644 (file)
@@ -8,7 +8,6 @@ fn reset() {
            self.v0 = k0 ^ 0x736f6d6570736575; //~ ERROR attempted dynamic environment-capture
            //~^ ERROR unresolved name: k0
         }
-        new() { self.v0 = 0; }
     }
 }
 
index 94043961484e761c3c888bab4d8262a40aef3924..8254b867130ce56e0597e566a35289040e60965d 100644 (file)
@@ -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 (file)
index a3277db..0000000
+++ /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 (file)
index 405c1a4..0000000
+++ /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 (file)
index 9a846ef..0000000
+++ /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 (file)
index 041812a..0000000
+++ /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();
-}
index e991a2104226c40d5e32031fd190cd497ea59308..656a7c492ebcaa955e528a6d417fb8875b94f582 100644 (file)
@@ -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
 }
index 808b7ff31772562a0403e36389e31c8c792c11cc..5ebbf63a3cfb50f534f89d2cc744846cb202af65 100644 (file)
@@ -10,7 +10,13 @@ fn eat() {
     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() {
index 011656ac3ad9a06b4f8e6ed9fba6aed898cf0c79..da79c9cb0a65945c251383d4706e06d537474527 100644 (file)
@@ -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() {
index 2a6c26e9f13653cdae6fcd06713aa14ec0962f8b..6ee7987343543a711157f2594cd7a8c42bfc6dc2 100644 (file)
@@ -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()));
 
index cd160294f748291db0c93d7c9562ea6a77938b8c..7e3545fb89ba2ed503fb67905eba026616f264d6 100644 (file)
@@ -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`
index e1fd1294b14ab69c665eb4b76f5725c484abd483..2e8c3a6a2138ae931d990c3604e744baae012493 100644 (file)
@@ -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); }
index ce9dfbc3f623f14cf751753612b5589e215f4156..d2b0cabf4a98fd35bd94bbd92ebff7ec380fb813 100644 (file)
@@ -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;
     {
index a1d71ba6af91cb9021a39c57a630a6d3451faed3..52236642c870cb1e969de312cdf0d9a2f7b69c21 100644 (file)
@@ -7,7 +7,13 @@ fn nap() { uint::range(1u, 10000u, |_i|{})}
 
   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() {
index e194f73c75313f698f1eb87403a04917a3df5244..577367e673bd61e361a8a644c0d20834355f0943 100644 (file)
@@ -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)};
index 9bfc39c32dccd10a22a54dde2d10bad8d374e070..d6ca910bc93a1b7a40b87e6cac963b85fe790971 100644 (file)
@@ -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 @@ fn chase_cat_2() {
     }
 }
 
+fn dog() -> dog {
+    dog {
+        cats_chased: 0u
+    }
+}
+
 fn main() {
     let d = dog();
     d.chase_cat();
index 31d2fef14ebd29aa17b2fe01e2b6743ce90c787d..145cc0f722dca3d33a5a9f27df80f403e91ac9ea 100644 (file)
@@ -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
index a4faeed69589453fb501cd20451b5160eada5d31..4e272e80663b9581cd47868e758476a5c7ca14f5 100644 (file)
@@ -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`
index e02683b737204b82a3120fd5b15cddbd7139c444..ed2be33cb23c1444271122580b1b8ce9d1e7b853 100644 (file)
@@ -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 {}
 }
 
index 641e0351a471cc9cd075727441a649cd2383e2bf..d3e5c4aea3b3fb963ae85d40fdfa77ebf499c8b1 100644 (file)
@@ -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
     }
 }
 
index d729aad5f02b500e5b123c49294ad16db8c2296c..e3dd18092d70294fbba4554d46faae7ff50a4598 100644 (file)
@@ -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
index e357bf28373d4dcb4a68086a956532e5ce59db33..d038699651543f03320ceb607f5adacc98e50308 100644 (file)
@@ -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));
index 29d89fbf8602b35d44f9f70e92e0b05347ea3e8e..66bc0ae544edd615aae21396ff4f295ff116a280 100644 (file)
@@ -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() {
index 3edc22252b253adc3b41c31b39c3f3f18a82b4c7..c501ea6d7b8230d5d6d20523c92bbc33f002d53a 100644 (file)
@@ -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 @@ fn getbig(i: int) {
   }
 }
 
+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);
index fd537df50eb78d1763e1c06d944668eb758e4050..1db2a8b1a982a4ff08b17e5ad6b2fc54483e0e05 100644 (file)
@@ -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 @@ fn getbig(i: int) {
   }
 }
 
+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);
index 9977e4616d8c8f5701bca523cf64f2ae4c6dd9a7..2424db84521d4bfb95502772103e278aa88b8b16 100644 (file)
@@ -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);
index 6a722ecdedfc8e96ec382f416b8407cd58fa3efa..342be7edb1a6feef080e76d20dad93c3f784f1d1 100644 (file)
@@ -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() {
index 2295a8ff2d75f9c6af43bc8e41c7d2663603c4d0..dcf660b8f44da480bfc3a61068886a2304c88006 100644 (file)
@@ -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);
index 3d647175ef623e34a1f867ef074c322669b4c88d..1cad6feef88fdda6530eea45a87d185e61084ad4 100644 (file)
@@ -80,7 +80,13 @@ fn test_ptr() unsafe {
 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 {
index 5713b5b1a31d78082d79a5a6ab1ba3e6ca7cf21e..6d49bd26b4ccae4cf5293e63a4ce91af92712fce 100644 (file)
@@ -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()
     }
 }
 
index e56c728d0279581607946a63f6d89a5d0493077c..0c89ecaf916dc38f2b8b87c2cd70abc6f6c54612 100644 (file)
@@ -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"); }
index 772aea9867bc50153c90477ea9c9712c8593a52a..c5758ad1ecc0b3ebc5f7b7d00a92bda613be014a 100644 (file)
@@ -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");
 }
index 28d96f64be960a9546be12f910563684733d6558..391452f58274fc9ce8bd791e804097e76e61deca 100644 (file)
@@ -21,11 +21,16 @@ fn bark() -> int {
 
   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 @@ fn meow() -> uint {
   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(); }
 }
index 3126824c18439ff35a7dd426d7bf1fb36404cbb8..c88f3eb378255f0e8318868d5599e9b10079a324 100644 (file)
@@ -17,9 +17,6 @@ fn meow() {
   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 @@ fn eat() -> bool {
   }
 }
 
+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();
index 9c22f23aceab698e2eccadc7c78079d5cd9d32a9..5637e31825a5bb914fe0388256654442582183be 100644 (file)
@@ -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() {}
index e5c5b4ecf2120fb1a1ed3e0bc3925a486f1e8ac1..cf7a97e3873ad0828f46c98ab8b261d97d4e8450 100644 (file)
@@ -10,8 +10,15 @@ struct cat {
     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() {
index 9241f92250d2bce1921ee5dc94a6b7a5f87423fb..dee9e9c79deed75245f27f1cf831fdea0d3db81d 100644 (file)
@@ -29,9 +29,6 @@ fn meow() {
   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 @@ fn remove(+k:int) -> bool {
   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");
index 1ba1646dcf090fe7b192ce3e1b7d82a4b91f31c1..d7e288f7aa4fde61056c24191bb9b7fdaacaa54b 100644 (file)
@@ -18,9 +18,6 @@ fn meow() {
   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 @@ fn eat() -> bool {
   }
 }
 
+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();
index 4eead77e8059501a3cba8f4f6240e57fe3e632cc..7641f00d9191a5c0a4f9b1f0d50f83b8da7e8361 100644 (file)
@@ -17,9 +17,6 @@ fn meow() {
   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 @@ fn eat() -> bool {
   }
 }
 
+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();
 }
index 825f9caf395136381e251163c46d2ab1637e6702..dbdb9e6a6884dbb0c295db304339a05b1aa6ba45 100644 (file)
@@ -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);
index 8eb9c19a963e6bbd18867acd734b62d19701b769..f73cd61937bdd1ee243edad1d838d2d0b3f9befd 100644 (file)
@@ -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"]);
index 957855736ead99e9103034ec7fe6d33ddd5396d1..6b8200a5f799a77e6fea160ee0cda9e014679b87 100644 (file)
@@ -17,9 +17,6 @@ fn meow() {
   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 @@ fn eat() -> bool {
   }
 }
 
+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 }
 }
index 97ffdea1e59dc56a9f76ee9a04d1622529c45a0a..a0a93bf9c46b02846d3e9c5be82041e8f8c96e6c 100644 (file)
@@ -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() {
index 834988eaf97572b17f66f88137a08a4490cdf073..504a3985e883d57be62fed41d33d857b28cbee4f 100644 (file)
@@ -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);
index 7a8a371cb712d2850e9c5682120d8df522c12c2c..4d47c21281e1c5dffa7cc9d74b6431debb8f6733 100644 (file)
@@ -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
     }
 }
 
index 388ea5f8776f482cca8174b11f031fd70191eff7..e2a39d41d571929db9ffba8dd4b3f6247f8447d5 100644 (file)
@@ -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);
index ef93e0e3bc6690a1ef6ed9329118140a53fd7b45..61ca9ba09332a3a0124803b8b1eace7908da620e 100644 (file)
@@ -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() {
index 3f0d9ad311ccea23e05b711ff275a519e92136b0..fdbe4a66c996ffac22757b6a9818a23c7f9611ec 100644 (file)
@@ -13,9 +13,6 @@ fn meow() {
   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 @@ fn eat() -> bool {
   }
 }
 
+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();
index 79d0d33bd7cdd09ddf9dd969b690838a42d98939..3d85874b0630b57fc4f9dfc1348e6fcc6f8e1bc9 100644 (file)
@@ -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)]
index cd9f486c9aa99c2d0e04167f920c2eecfd83695c..8872abe1b21bd4426c89c877eaa4d09661275f5a 100644 (file)
@@ -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 }
index 2609080ebc9148f5514ac780567434b15f012ce0..d124748c56c2d05ef61a5f655ea506cfd43ca49b 100644 (file)
@@ -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;
     {
index 52d71e6adcb12d39693dfded524ef5c3a968bdf4..dcd460cdea95e80b24ad4a4c07fffe4d57a5abc3 100644 (file)
@@ -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);
 }
index 4c8e99ab46f13f56c5e13458ac4722efb591efa8..fbc7a877c8189fc3e897863aedf4e30c9c88a14a 100644 (file)
@@ -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() { }
index b2f149254811cdc7ede2ee610b75b31afb3efd3d..7ddbf1e1534a678d1e995de269537bd22e6c4a0e 100644 (file)
@@ -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) {
     }
index d0da831093823d97d0b0bec00be56881d2c244b8..e9d08b579da0830c4091f0124f40f26657ac979b 100644 (file)
@@ -2,11 +2,15 @@
 
 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) {}
 }
index 0cff6b57c2acc08e38768b9bc74aba8fb60a4266..837d6f4764cb003a87d478d372d17b3b32e79c24 100644 (file)
@@ -1,8 +1,6 @@
 struct socket {
     let sock: int;
 
-    new() { self.sock = 1; }
-
     drop { }
 
     fn set_identity()  {
@@ -12,6 +10,12 @@ fn set_identity()  {
     }
 }
 
+fn socket() -> socket {
+    socket {
+        sock: 1
+    }
+}
+
 fn closure(f: fn()) { f() }
 
 fn setsockopt_bytes(_sock: int) { }
index b554fef4564daba632f3350767445a05ed62fd8c..fb0e5d1939e30742e926ce8c10188a84d4df6e87 100644 (file)
@@ -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() { }
index 70af9ca03dc2ef30e68571409eccaa4ebfaf4289..93e4d13f1881c58156b883343ea0033e400e2d8f 100644 (file)
@@ -1,8 +1,11 @@
 struct C {
     let x: uint;
 
-    new(x: uint) {
-        self.x = x;
+}
+
+fn C(x: uint) -> C {
+    C {
+        x: x
     }
 }
 
index 96ac83aeee6b9329475581574a695a399d2e2ddb..b0cf990ce71e58092f07279b3e5703b48bc082c0 100644 (file)
@@ -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};
index 18d9338739c7ca4697cb876235af4919aa90b10f..79e0c3813de21f46e3d33e05d8e89bff8697d20c 100644 (file)
@@ -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();
 }
index 20dd0c650f131e156697c44fe154f147850290a6..7af8d3672c2999e61804bc3fc2f06ffba9292d02 100644 (file)
@@ -137,7 +137,6 @@ fn receiver_terminate<T: send>(p: *packet<T>) {
 
     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 @@ fn unwrap() -> *packet<T> {
         }
     }
 
+    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 @@ fn unwrap() -> *packet<T> {
         }
     }
 
+    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))
index eaec723de297bb5ae5c39cceda23d0aa8f0bb8dc..6c99cb0ad2a728fa458a4da97cb5361b88c44173 100644 (file)
@@ -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);
index b41b65cf6df39424ad7f5504a4a2b793c2b57566..4d06365e26f31d91a591f3cb763a4fe3f070583b 100644 (file)
@@ -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);
index fb7e10a2b17ea97637ade460a2e19ddd5e78edb7..1a552946676aed023ce33403d6f363c3288c2636 100644 (file)
@@ -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
     }
 }
 
index 130e59125a1f485ea485b8c5e833158f26b1d750..ddcc0360d8b5497702889129e460510e0237e82d 100644 (file)
@@ -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;
index da0d3dc91d25b45d1dd377c16be2b61a0b28455a..358f0a82a6e67b5363cbfc00d8ae35ef9a325028 100644 (file)
@@ -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() {
index 0b66943b8eab3eed9576b970d42335597fa00da8..dd12d391abd8853339c22e2a38eb78576c1d061e 100644 (file)
@@ -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;
     {
index cfc3064b55227162a41d84db35a85296fa1e147d..e2b68db5a4871849429f629116b1a5762dbc32e2 100644 (file)
@@ -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);
index a988ad467373e3400f7c3025085a120463d68f2f..bbe6d59c280ab3fff152f041b90a4f1c558d3a94 100644 (file)
@@ -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() {
index 569359a9db134699d1afb35480e42817b6791fdd..ab75956bbd821a1de86a8705222368012bffe65a 100644 (file)
@@ -10,7 +10,13 @@ fn play() {
     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() {
index 08fc743af8022fee56b20f29783f76ccd92dbda5..1a18c788e0dadffc86707733fb980646f1c9f8a2 100644 (file)
@@ -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
index e0d85e4d28857af143b43dc61210a685366b2147..14c7d2697528d07f1987cc93716fc7bf618318a1 100644 (file)
@@ -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
index c5b69af33d97109bbeb07f75fa5df368572c9d8c..25fa567292ed97ba5c7ee0175b75fb74f7be2753 100644 (file)
@@ -8,12 +8,17 @@
 
 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
index 36d73bf23e53e111392305c21bff08894f3b2b19..ca5ce6f1b7f05aa9373f8aaa6ef97f5b9e4fb5fc 100644 (file)
@@ -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
index b935d7f13164086d40b8df4d3fe6a27567c46801..5bd8921ca539375922c542e0911d84dbd8cd9d49 100644 (file)
@@ -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); }
index 618848e1edd251e3b591d4a1d3f256b273849535..79b4242df42b669fc124e9bd6d20b114c0099fb8 100644 (file)
@@ -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; }
index 2fbe658fd6cc45e06cade6cc8b1fd62691818a72..2660a983941617c202b2a580cd7d9403ae959614 100644 (file)
@@ -6,10 +6,15 @@
 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>) { }
index 40da915e6cdde57d78be85fe17562a98d624a431..6fda3c54c387de597328ec1c819dc72ab7d5c853 100644 (file)
@@ -3,10 +3,15 @@
 
 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);
index 762d510da20a87d2b9da6c70076ffdfcb2be0b56..d7daa616abf5c61b4dcbb881a79dfc746af274c9 100644 (file)
@@ -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() {
index 3067e6f48ac453446ee1618a34b25bdfed86c1d7..df05df61afb15a7e266c68b320a33e22471164a9 100644 (file)
@@ -7,7 +7,6 @@
 
 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;
index e049c0ecf38af2dbf6730834b4ef2a5d67ec4f56..634bce5cb1284c685fb6824ab2015870dd42263d 100644 (file)
@@ -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));
index db550ca608e8fa3aa28215171774cf810b3c4906..101f890391e34952e86a45ada9c8e92d0575d2e3 100644 (file)
@@ -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;
     {
index da7d63e9126ca3bb526e707a3e942e05916e9c95..f66dfdcfeee9f430f5e54e10b45dfcf07e916825 100644 (file)
@@ -3,14 +3,18 @@
 
 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;
index c070bbb1ca2e17cf974f8c406cbb730a9ccb07f2..ff1758ceef1bf1b11f2791d58adf88c0b93fe92e 100644 (file)
@@ -3,10 +3,15 @@
 
 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;
index 771fb94621116bead88af2dcc388ad62fd6c0794..1461e8960b45355fb529ce3ec49f525086e931d9 100644 (file)
@@ -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;
     {